哈希表是什么?
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
为什么说哈希表和跳表是高效的数据结构?
优势: 从时间和空间的角度分析: 时间高效:利用哈希可使插入、查找、删除、修改、替换操作的时间复杂度达到O(1),这是其他查找方式无法达到的(比如树形查找O(logn)、二分查找O(logn)、顺序查找O(n)等)。即使出现碰撞,整体理论值也可以接近O(1)。
空间可接受:哈希的比较合适的空间消耗以O(2n)最佳,对于其他同类算法(主要是树形查找方式),要分为两类。
第一种是以叶子存放有效值的树(如b+树、线段树),其空间消耗可认为是O(4n);
第二种是所有节点均存放有效值,空间消耗可认为O(n)。
哈希表的查找效率取决于什么?
哈希表的查找效率取决于:
1.哈希函数
2.处理冲突的方法
3.哈希表的装填因子
哈希表的理想情况是无需比较一次存取便能找到所查的记录,但是在实际应用中,哈希表通常存在冲突的情况,这就需要反复查找处理冲突.一般的搜索方法,在搜索时需进行关键字的比较.这一类建立在比较基础上的搜索方法,其效率依赖于搜索过程中所进行的比较。
python字典与哈希表区别?
主要的区别是,哈希表使用多线程做,可以多线程读取,字典单线程读取。
1.哈希表:
找不到返回null
需要拆箱装箱所以比dictionary慢
所有成员都是线程安全的
不是一个泛型类型
2.字典:
字典类似于哈希表,把键和值联系在一起。键必须是唯一的。
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。
redis哈希表扩容与缩容?
随着redis的操作的不断执行,哈希表保存的键值会逐渐地增多或者减少,为了让哈希表的负载因子(ratio)维持在一个合理的范围之内,当哈希表保存的键值对数量太多或者太少时,程序需要对哈希表的大小进行相应的扩展或者收缩。
ratio = ht[0].used / ht[0].size比如,hash表的size为4,如果已经插入了4个k-v的话,则ratio为1。redis的默认负载因子为1,负载因子最大可以达到5(持久化的时候,需要fork操作,这个时候不会分配内存,所以redis源码中有判断,如果大于数据长度的5倍(5*used),则马上扩容)。扩展和收缩哈希表的工作可以执行rehash(重新散列)操作来完成,Redis对字典的哈希表执行rehash的策略如下:
1、如果ratio小于0.1,则会对hash表进行收缩操作。
构造哈希表包括?
常用哈希表的构造方法
(1)除余
(2)随机
(3)平方后取中间某几位
(4)折叠
(5)H(key)= a*key + b
(6)数字分析:若10位key的特定某几位中,数字大小分布均衡,就取那几位的
2. 处理冲突
(1)开放定址
(2)公共溢出
(3)多个哈希表
(4)链表
3. 性能分析
三个因素:
哈希函数,处理冲突的方法,哈希表的装填因子。
装填因子 a 的定义如下: a = 哈希表中元素的个数 / 哈希表的长度
a 可描述哈希表的装满程度。a 越小,发生冲突的可能性越小; a 越大 ,发生冲突的可能性越大。