夜光精讲 Opentcs 三大算法(六)路径算法
夜光序言:
当我们正在为生活疲于奔命时,生活已离我们而去。
正文:
路径存储函数
路径算法的重点是如何将已经找到的路径有效记录保存下来,一般有两种做法:直接扫描所有未被收录的点,或者将已有的结果保存在最小堆中,更适用于稠密图。
数组存储占用空间较大且只支持查找功能,而哈希表可实现插入、查找、修改和删除操作,因此夜光采用哈希表进行存储实现路径快速存储和查找。
1.哈希表定义
哈希表是根据键值对(key-value)进行直接数据访问的数据存储结构,它在关鍵字和其存储位置之间建立确定的对应映射关系f(key),通过关键字key查找在表中的具体位置来访问记录value,提高查找速度。
2.散列函数构造方式
哈希表将数据存储在一块连续的存储空间中,通过散列函数计算得到散列地址。实际它是一个固定长度的数组,tableSize是其长度,将k巧映射到数值0~tableSize-l之间。
散列函数构造一般有除法散列法、乘法散列法和完全散列法。
查找第i条路径时根据的是起始点Si和目标点ei两个参考结构体,因此哈希表有两个key,keyil=si.pointld,keyi2=ei.pointld,需要f(keyil,keyi2)找到对应的存储路径valuei。
完全散列法可以保证最后一层没有碰撞发生的情况下,实现多层key值对应一个value的查找功能,适用于静态集合,但无法实现插入和删除操作。对于地图模块,我们可以预先知道要插入存储的元素个数,因此可以选用简单的除法散列法
冲突解决——分离链表法
当key1不等于key2时,可能存在f(key1)=f(key2)的情况,此种现象称为冲突。
为尽可能减少冲突,保证计算的简单度及散列地址的均匀分布,以实现存储空间的有效利用。
我们采用"除留余数法"的散列函数构造方式的同时,将散列函数结果相同的关键字所对应的记录存储在同一个单元的双向链表中,而实际cell中存放的是链表的头指针。
发生冲突时,只需要在当前位置向单链表中增加一个节点。此方法称为分离链表法,适用于冲突很多的情况。
譬如:设关键字序列为一组数字:50,6,60,30,34,25,7,26,21,33,61,3,2。
散列函数取为f(key)=k mod 9;用分离链接法处理冲突。则表中有6个节点只需查找1次,3个节点需要查找2次和3次,1个节点需要查找4次。
查找成功的平均查找次数为(6+3*2+3*3+1)/13 ≈ 1.69次