C# Dictionary 的实现笔记

参考博客园同学的博客:https://www.cnblogs.com/InCerry/p/10325290.html

C# 中使用拉链法解决哈希冲突,实现Dictionary的思路:

1、Dictionary 中的数据放在Entry[]中,每个entry为单向的链表包括Key、Value 、HashCode,同时指向之后添加的出现Hash冲突的 Next Entry。

2、Entry的存放位置是放在槽int[] buckets中,每向Dictionary新增一项,都是通过Hash桶的算法,确定在buckets中的位置 i,新建NewEntry节点,NewEntry的Next指向buckets[i]中存贮的OldeEntry在Entry[]中的位置,buckets[i]更新为NewEntry在Entry[]中的位置。

3、在删除KeyValuePair时,会改变Entry的单向链,移除的Entry节点放入额外的一条int[] FreeList记录,每次在新建Entry时,有限从FreeList中取,之后再从Entry[]顺序存储。

4、根据Key查询时:哈希桶确认buckets的i->取buckets[i]作为第一个Entry的值->从Entry[buckets[i]]中匹配Key->没找到则去Next匹配->一直到最后

5、在扩容时,则要重新计算每一个Key的HashCode,重新匹配buckets,还要重新分配Entry的单向链表,而且哈希桶算法的桶个数都设置为素数。

6、会设定哈希碰撞的阈值,如果达到,则会触发扩容。

性能问题:

1、由于每次插入时做哈希桶算法,而且修改buckets,可能会触发扩容和再分配,所以新增时的速度会受影响。

2、在由Key查找时,经过哈希桶,查询单向链表,由于碰撞次数阈值的存在,会很快。

猜你喜欢

转载自www.cnblogs.com/slarkleoric/p/10649659.html
今日推荐