散列表(二)

散列函数设计

散列函数生成的值要尽可能随机并且均匀分布
一般方法有:直接寻址法、平方取中法、折叠法、随机数法

避免低效的动态扩容

由于散列表的装载因子过高时,需要对散列表进行扩容,如果插入数据时需要扩容而直接对原始散列表进行迁移的话,散列表过大则插入数据的效率会非常低。
解决方法:将新的数据插入到新的散列表中,同时从原始散列表中取出一部分数据放入新的散列表中。在查询时可以先使用旧的散列函数和散列表进行查询,如果没有查询到再到新的散列表中查询。

选择冲突解决方法

当数据量比较小、装载因子小的时候,适合采用开放寻址法。因为开放寻址的数据都是存储在数组中,可以有效地利用cpu缓存加快查询速度,并且序列化起来比较简单,但是删除数据时比较麻烦,因为删除数据时是将这个位置标记为已删除。并且冲突代价过高。
基于链表的散列冲突处理方法比较适合存储大对象、大数据量的散列表,而且,比起开放寻址法,它更加灵活,支持更多的优化策略,比如用红黑树代替链表。

设计一个工业级别的散列表

工业级别的散列表的特点
支持快速的查询、插入、删除操作;
内存占用合理,不能浪费过多的内存空间;
性能稳定,极端情况下,散列表的性能也不会退化到无法接受的情况。
设计思路
设计一个合适的散列函数;
定义装载因子阈值,并且设计动态扩容策略;
选择合适的散列冲突解决方法。

你可能感兴趣的:(散列表(二))