哈希

海量数据处理方案

五迷三道 提交于 2019-11-26 07:40:34
什么是海量数据? 正如《逍遥游》中的一句话:北冥有鱼,其名为鲲,鲲之大,一锅炖不下,化而为鸟,其名为鹏,鹏之大,需要两个烧烤架;简单的可以把这里的海量数据理解为这里的鲲鹏 ,数据大到一个服务器存不下,就需要两个甚至多个服务器来存储。而接下来我们需要做的就是用一台服务器来处理海量数据。 以下是一些海量数据处理的例子: 1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 思路:显然100G大小的文件是不可能直接加载到内存中去处理的。所以我们需要对这个文件进行划分,前提是我们需要将相同的IP地址划分到同一空间。假设我们将文件分成1000份,那么一份的大小大概是100M,先将IP地址利用哈希算法求得一个整数key,再将index = key % 1000,得到的结果相同的放到同一文件中,这样就将相同的IP地址放到了同一个文件下。再对每一个文件分别进行处理,用count来记录出现的次数,最后利用排序算法对count进行排序找到最大的那个,即其对应的IP地址为出现次数最多的IP地址。 利用这种方法解决这个问题的关键在于我们在用哈希函数进行哈希切分后相同的IP地址一定会被分到同一个文件中。对于哈希切分,相同的key,得到的哈希值一定相同。 2.给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).

海量数据处理题目小结

做~自己de王妃 提交于 2019-11-26 07:38:46
解决这类题目的思路一般为 (1)能否用特殊的数据结构解决:位图,布隆,堆。 (2)哈希切分 1。给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址 思路分析: 1.要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中, 2.这里我们使用效率很快的哈希表,进行此数的统计,就可以找出出现此数最多的IP地址 2.与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现? 思路分析: 要找到topK的IP地址,如果直接进行排序的话,内存放不下,而且效率太慢,所以这我们可以建一个K大小的堆,这里建小堆比较好,因为来一个数和进行堆顶的元素进行比较,然后进行向下调整,大的就下去了,因此最终统计的就是topK 3。给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确 算法和近似算法! 思路分析: 1。文件进行比较,用位图显然不能解决 2。肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理

SQL性能优化,太太太有用了!

百般思念 提交于 2019-11-26 01:47:45
1.1 逻辑架构 第一层:客户端通过连接服务,将要执行的sql指令传输过来 第二层:服务器解析并优化sql,生成最终的执行计划并执行 第三层:存储引擎,负责数据的储存和提取 1.2 锁 数据库通过锁机制来解决并发场景- 共享锁(读锁) 和 排他锁(写锁) 。 读锁是不阻塞的 ,多个客户端可以在同一时刻读取同一个资源。 写锁是排他的,并且会阻塞其他的读锁和写锁 。简单提下乐观锁和悲观锁。 乐观锁 ,通常用于数据竞争不激烈的场景, 多读少写 , 通过版本号和时间戳实现。 悲观锁 ,通常用于 数据竞争激烈的场景 ,每次操作都会锁定数据。 要锁定数据需要一定的锁策略来配合。 表锁 , 锁定整张表,开销最小,但是会加剧锁竞争 。 行锁 , 锁定行级别,开销最大,但是可以最大程度的支持并发 。 但是MySql的存储引擎的真实实现不是简单的行级锁,一般都是实现了多版本并发控制(MVCC)。MVCC是行级锁的变种,多数情况下避免了加锁操作,开销更低。MVCC是通过保存数据的某个时间点快照实现的。 1.3 事务 事务保证一组原子性的操作,要么全部成功,要么全部失败。一旦失败,回滚之前的所有操作。MySql采用自动提交,如果不是显式的开启一个事务,则每个查询都作为一个事务。 未提交读 (Read UnCommitted),事务中的修改,即使没提交对其他事务也是可见的。事务可能读取未提交的数据,造成脏读

Javase学习记录之------set集合

我怕爱的太早我们不能终老 提交于 2019-11-26 00:24:52
Collection 1–List 有序(存储顺序和取出顺序一致),可重复 2–Set 无序(存储顺序和取出顺序不一致),唯一 虽然Set集合无需,但是,作为集合来说,他肯定有它自己的存储顺序,而你的顺序和它的存储顺序一致,这代表不了有序; 你可以多存储一些数据,就可以看到效果; HashSet:它不可保证set的迭代顺序,特别是它不保证该顺序恒久不变, public class Student { public String name ; public int age ; public Student ( String name , int age ) { this . name = name ; this . age = age ; } //重写 @Override public int hashCode ( ) { /* return 0;如果有10000个元素要比,会使后面相比的效率太低,所以我们尽可能让他们的哈希值不同 因为成员变量值,影响了哈希值,所以我们把成员变量值相加即可 return this.name.hashCode()+this.age; 但这样也不够好,如: s1:name.hashCode()=40;this.age=30; s2:name.hashCode()=20;this.age=50; 为尽可能的区分,我们把他们乘一些整数 */ return

根父类:Object 类

蓝咒 提交于 2019-11-25 23:47:48
一、Object类   Java中规定: 如果一个类没有显式声明它的父类(即没有写extends xx),那么默认这个类的父类就是java.lang.Object。   类 Object 是类层次结构的 根类 。每个类都使用 Object 作为超类。    如何理解根父类?     (1)所有对象(包括数组)都实现这个类的方法,即Object类中声明的方法,所有引用数据类型(包括数组)中都有。     (2)所有类的对象的实例化过程,都会调用 Object 的实例初始化方法。     (3)所有的对象都可以赋值给 Object 的变量,或者说 Object 类型的变量,形参,数组可以接受任意类型的对象。 二、常用方法   1、toString() 方法 public String toString()      用于返回对象的信息,建议所有的子类都重写。如果没有重写:返回的字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。     如果直接打印一个对象,或者用对象与字符串进行拼接,默认情况下自动调用这个对象的 toString() 方法。   2、getClass() 方法 public final Class getClass()      该方法返回此 Object 的运行时类。(分为编译时类型与运行时类型)   3

STL hash function的模板特化

落爺英雄遲暮 提交于 2019-11-25 23:42:52
哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位。 template <class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc = alloc> class hashtable; STL中定义的hashtable容器包含哈希函数模板参数_HashFcn。_HashFcn既然是一个类类型,又能提供函数的功能,因此是一种仿函数(functor); 仿函数是一个类,在类中重载()运算符,从而由仿函数类对象即可实现函数功能。 在SGI-STL中的stl_hash_fun.h中定义了若干仿函数类: #ifndef __SGI_STL_HASH_FUN_H #define __SGI_STL_HASH_FUN_H #include <stddef.h> __STL_BEGIN_NAMESPACE template <class _Key> struct hash { }; inline size_t __stl_hash_string(const char* __s) { unsigned long __h = 0; for ( ; *__s; ++__s) __h = 5*__h + *__s; return size_t(__h);

HASH哈希

試著忘記壹切 提交于 2019-11-25 18:55:27
hash 译:散列、杂凑,作用:把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,这种转换是压缩映射。 hash特性 1、不可逆。不能通过结果推算出输入,所以又被称为不可逆的算法,也可以作为加密算法存在 2、计算极快。 hash的用途 1、 来源: https://www.cnblogs.com/nanjo4373977/p/11929366.html