哈希表是什么存储结构(哈希表是什么逻辑结构)

哈希表是什么?

散列表(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 越大 ,发生冲突的可能性越大。

版权声明

为您推荐