除留余数法及链地址法在单片机数据存储上的应用

除留余数法用于构造哈希函数

链地址法用于解决哈希冲突

假设有如下目标:

将键值对[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(即链尾)

删除节点只需将节点从对象链断开,插入空数据的链头,下次插入数据时,优先使用已删除的节点空间

键值对逐个存入的过程如下:

最新的元素插入到链表的前端,这不仅因为方便,还因为一个经常发生的事实是:最新插入的元素最有可能不久又被访问。

查找时,先根据键取模算出链头地址,取出链头地址所存的对象指针,去对象指针所指位置读出第一个对象,比较对象的键与查找的键是否相等,不等则根据对象的下一节点指针,取出下一对象比较,直到链尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值