为什么使用Hashmap.containsKey比Arrays.binarySearch运行得更快?

时间:2015-08-04 02:31:28

标签: java arrays algorithm list sorting

我有两个电话号码列表。第一个列表是第二个列表的子集。我在下面运行了两种不同的算法,以确定两个列表中包含哪些电话号码。

  • 方式1:
    • 排序第一个列表:Arrays.sort(FirstList);
    • 循环第二个列表以查找匹配的元素:如果是Arrays.binarySearch(FistList,'每个第二个列表')那么确定
  • 方式2:
    • 将第一个列表转换为带键/值的HashMap('每个第一个列表',Boolean.TRUE)
    • 循环第二个列表以查找匹配的元素:如果FirstList.containsKey('每个第二个列表')然后确定

结果在5秒内跑2的方式比用39秒的方式1快得多。我无法理解原因。

感谢您的任何评论。

4 个答案:

答案 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)