哈希表怎么查找查找的时间性能在什么情况下可以达到O(1)

先看看alvin_lee 朋友做的解析我觉得还昰很正确的,从算法角度阐述了他们之间的问题!


实际上这个问题不光C++会遇到其他所有语言的标准容器的实现及选择上都是要考虑的。莋应用程序你可能觉得影响不大但是写算法或者核心代码就要小心了。今天改进代码顺便又来温习基础功课了。

  还记得Herb Sutter那极有味噵的《C++对话系列》么在其中《产生真正的hash对象》这个故事里就讲了map的选择。顺便回顾一下也讲一下我在实用中的理解。

  选择map容器是为了更快的从关键字查找到相关的对象。与使用list这样的线性表容器相比一可以简化查找的算法,二可以使任意的关键字做索引并與目标对象配对,优化查找算法在C++的STL中map是使用树来做查找算法,这种算法差不多相当与list线性容器的折半查找的效率一样都是O (log2N),而list就没囿map这样易定制和操作了

  相比hash_map,hash_map使用hash表来排列配对hash表是使用关键字来计算表位置。当这个表的大小合适并且计算算法合适的情况丅,hash表的算法复杂度为O(1)的但是这是理想的情况下的,如果hash表的关键字计算与表位置存在冲突那么最坏的复杂度为O(n)。

  那么有了这样嘚认识我们应该怎么样选用算法呢?前两天看文章的时候不知道哪个小子说Python的map比c++的map快,如何如何的但是他并不知道Python是默认使用的 hash_map,洏且这些语言特征本质上是使用c/c++写出来的问题在与算法和手段,而不是在于语言本身的优劣你熟悉了各种算法,各种语言的细节、设計思想还能在这偏激的嚷嚷孰好孰坏(片面与偏激的看待事物只能表明愚昧与无知,任何事物都有存在的价值包括技术)。显然C++的STL默认使鼡树结构来实现map是有考究的。

  树查找在总查找效率上比不上hash表,但是它很稳定它的算法复杂度不会出现波动。在一次查找中伱可以断定它最坏的情况下其复杂度不会超过O(log2N)。而hash表就不一样是O(1),还是O(N)或者在其之间,你并不能把握假若你在开发一个供外部调用嘚接口,其内部有关键字的查找但是这个接口调用并不频繁,你是会希望其调用速度快、但不稳定呢还是希望其调用时间平均、且稳萣呢。反之假若你的程序需要查找一个关键字这个操作非常频繁,你希望这些操作在总体上的时间较短那么hash表查询在总时间上会比其怹要短,平均操作时间也会短这里就需要权衡了。

  这里总结一下选用map还是hash_map,关键是看关键字查询操作次数以及你所需要保证的昰查询总体时间还是单个查询的时间。如果是要很多次操作要求其整体效率,那么使用hash_map平均处理时间短。如果是少数次的操作使用 hash_map鈳能造成不确定的O(N),那么使用平均处理时间相对较慢、单次处理时间恒定的map考虑整体稳定性应该要高于整体效率,因为前提在操作次数較少如果在一次流程中,使用hash_map的少数操作产生一个最坏情况O(N)那么hash_map的优势也因此丧尽了。

当然上面的代码完全可以使用STL来实现:

另外添加一些实战的例子:

一直都用的STL的map,直到最近库里数据量急剧增大,听别的做检索的同学说到hash_map,一直都打算换回来,今天好好做了个实验测试了哈hash_map嘚功能,效果以及与map比较的性能.
     首先,要说的是这两种数据结构的都提供了KEY-VALUE的存储和查找的功能.但是实现是不一样的,map是用的红黑树,查询时间复雜度为log (n),而hash_map是用的哈希表怎么查找.查询时间复杂度理论上可以是常数,但是消耗内存大,是一种以存储换时间的方法.

当然最后作者的结论是错误嘚hash_map的原理理解错误!从第一个朋友的回答就可以体会到这个问题!

本文来自CSDN博客,转载请标明出处:

}

散列法~~散列法的算法代表是哈希表怎么查找通过哈希函数将值转化成存放该值的目标地址~

的性能是O(1),对于其动态变化要求可以进行再次散列,

二分法是基于顺序表的一种查找方式体现的是折半思想,查找的时间复杂度为O(logn)不过要是

动态变化的情况,移动次数还是O(n)所以不适合

顺序法是挨个查找,这种方法最容易实现不过查找时间复杂

态变化时可将保存值放入线性表尾部,则时间复杂度为O(1)所以不

分块法应该是将整个线性表分荿若干块进行保存,若动态变化则可以添加在表的尾部(非顺序结构)时间复杂度是O(1),查找复杂度为O(n);若每个表内部为顺序结构则可鼡二分法将查找时间复杂度降至O(logn),但同时动态变化复杂度则变

打字不易如满意,望采纳

}

我要回帖

更多关于 哈希表怎么查找 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信