除留余数法用于构造哈希函数
链地址法用于解决哈希冲突
假设有如下目标:
将键值对[19:'a'、14:'b'、23:'c'、1:'d'、68:'e'、20:'f'、82:'g'、27:'h']保存到存储器上,要求能根据键快速地找出其值,且有一定的扩展性,即可以增加删除键值对
接下来将利用除留余数法及链地址法实现目标
这里先将链表大小(即链的数量,而非链的长度)定为7(实际应根据数据规模及可接受链长来定,且尽量为质数)
将所有键分别对7取模得:5、0、2、1、5、6、5、6
将键值对转化为16进制以便存储,(键为10进制转16进制,值为ASCII码的16进制表示):
[0x13:0x61、0x0e:0x62、0x17:0x63、0x01:0x64、0x44:0x65、0x14:0x66、0x52:0x67、0x1b:0x68]
存储空间规划如下
一个数据对象占3字节,第一字节为键,第二字节为值,第三字节为下一节点的地址,如果没有则为0xff(即链尾)
删除节点只需将节点从对象链断开,插入空数据的链头,下次插入数据时,优先使用已删除的节点空间
键值对逐个存入的过程如下:
最新的元素插入到链表的前端,这不仅因为方便,还因为一个经常发生的事实是:最新插入的元素最有可能不久又被访问。
查找时,先根据键取模算出链头地址,取出链头地址所存的对象指针,去对象指针所指位置读出第一个对象,比较对象的键与查找的键是否相等,不等则根据对象的下一节点指针,取出下一对象比较,直到链尾。