在散列表和排序后的列表中找一个元素,哪个查找速度最快?
关于这个问题我感觉平均情况下散列表会比排序后的列表要快。
1.原理
a.散列表的查找的原理依赖散列函数,而查找次数则有负载因子决定。
与整个容量没有关系,也就是说与长度没有关系。
b.排序后的列表查找跟列表的长度有直接关系。
2.查找时间复杂度
a.散列表
散列表所花费的时间主要在计算地址和发生冲突时再次散列所花费的时间。
假设一个常见的情况:
散列函数用开放式寻址法,
负载因子是a=0.75(Java的HashMap的默认负载因子就是0.75)
那么期望的探查次数最多是:1/a * ln(1/(1-a)) 其中ln是自然对数
也就是 1.8次左右。
b.排序后的列表
假设常见的二分查找法,时间复杂度是O(log(2)n) 其中log(2)表示以2为底的对数
也就是n越大的时候,需要的查找次数越多。
(其他的查找算法,比如费氏查找时间也快 不了多少)
如果散列表每次查找的时间常数是T1, 排序后的列表的每次查找的时间常数是T2,
很显然T1会比T2大很多,但是从上面的结果可以看出来,当列表的大小n逐渐增大,
二分查找法所花费的时间也就会越多,而且会比散列表的时间要多。