我有两个电话号码列表。第一个列表是第二个列表的子集。我在下面运行了两种不同的算法,以确定两个列表中包含哪些电话号码。
结果在5秒内跑2的方式比用39秒的方式1快得多。我无法理解原因。
感谢您的任何评论。
答案 0 :(得分:5)
因为散列是 O(1)而二进制搜索是 O(log N)。
答案 1 :(得分:1)
HashMap
依赖于一种称为“散列”的非常有效的算法,该算法已使用多年,并且可靠且有效。基本上它的工作方式是将集合中的项目拆分成更小的组,这些组可以非常快速地访问。找到组后,可以使用效率较低的搜索机制来定位特定项目。
通过称为“散列函数”的算法识别项目的组。在Java中,散列方法是Object.hashCode()
,它返回表示该组的int
。只要为您的班级定义了hashCode
,您就应该期望HashMap
非常高效,这正是您所发现的。
关于Map
的各种类型以及Difference between HashMap, LinkedHashMap and TreeMap
我的简写经验法则是始终使用HashMap
,除非您无法为您的钥匙定义合适的hashCode
或需要订购的项目(自然或插入)。< / p>
答案 2 :(得分:0)
查看HashMap的源代码:它为每个添加的(键,值)对创建并存储哈希值,然后containsKey()方法计算给定键的哈希值,并使用非常快的操作来检查它已经在地图上了。所以大多数检索操作都非常快。
答案 3 :(得分:0)
方式1:
排序:约O(nlogn)
搜索:O(logn)
方式2:
创建HashTable:O(n)
用于小密度(无碰撞)
包含:O(1)