基于高速访问设计的哈希表也是一种典型的“空间换时间”方法。顾名思义,数据结构可以理解为一个线性表,但其中的元素不是密切排列的,但可能会有间隙(哈希竞猜游戏开发,搭建及源码部署)
哈希表基于关键码值;并直接访问数据结构。也就是说,它通过将键值映射到表中的某个位置来访问记录,以加快查找速度。这个映射函数称为哈希函数,存储记录的数组称为哈希表
例如,我们存储70个元素,但我们可以为这70个元素请求100个元素。70/100=0.7,称为荷载系数。我们这样做的原因也是为了“高速存取”。我们根据一个特定的函数H来安排每个元素的存储位置,该函数的结果尽可能随机分布,从而避免遍历线性搜索,实现高速访问。然而,由于这种随机性,它必然导致一个冲突的问题
所谓的冲突意味着通过哈希函数H获得的两个元素的地址是相同的,因此这两个元素被称为“同义词”。这类似于70个人在一家有100把椅子的餐厅吃饭。哈希函数的结果是存储单元地址,每个存储单元称为“bucket”。如果一个哈希表有m个bucket,则哈希函数的值范围应为[0,m-1]
哈希函数可以使数据序列的访问过程更加快速精确。通过哈希函数,可以更慢地定位数据元素:
1直接寻址方法:以关键性字的值或关键性字的线性函数作为哈希地址。一、 即H(key)=key或H(key) = akey + b,其中A和B是常数(这种散列函数称为自函数)
2数值分析方法:在分析一组数据时,例如一组员工的出生日期,我们发现出生日期的后几个数字大致相同。在这种情况之下,发生冲突的可能性将非常大。然而,我们发现出生日期的最终几位数字表示月份和详细日期间存在很大差异。如果使用下列数字形成哈希地址,则冲突的概率将明显降低。因此,数值分析的方法是找出数字规则,并尽可能余地使用这些数据来构造冲突概率较低的哈希地址
3。平方取中法:以关键性字平方后的下方数字作为哈希地址
4。折叠方法:将关键性字切成数个数字相近的部分。最终一部分可以有有所不同的数字,然后将这些部分的叠加和(去掉进位)作为哈希地址
5。随机数法:选择一个随机函数,将关键性字的随机值作为哈希地址,常用于关键性字长度有所不同的情况
6。除留余数法:将关键性字的余数除以不大于哈希表长度m的数字P作为哈希地址。即 H(key) = key MOD p, p<=m。它不仅可以间接取关键性字模块,还可以进行折叠、平方取中操作后取模块。P的选择非常关键。它通常采用素数或M。如果P选择失当,easy将生成同义词