迭代有序HashMap条目对的最快方法

时间:2015-04-12 00:22:32

标签: java hashmap iteration

以下代码使用O(N^2)时间来处理HashMap的所有有序对。在这个例子中,我不能使用另一个数据结构,如TreeMap,所以想知道是否有可能改善迭代时间? Java 8成语受到欢迎。我想也许可以使用months filter by condition逻辑,其中条件可以用lambda表示法表示为months filter ( (l, r) -> (l < r) )。如果数据存储在已排序的ArrayList中,那么此次迭代将采用O(N^2 / 2),其速度更快2,并且最佳时间复杂度。

Map<String, Integer> months = new HashMap<String, Integer>();
months.put("January", 1);
months.put("February", 2);
months.put("March", 3);
months.put("April", 4);
months.put("May", 5);
months.put("June", 6);
months.put("July", 7);
months.put("August", 8);
months.put("September", 9);
months.put("October", 10);
months.put("November", 11);
months.put("December", 12);
for (Map.Entry<String, Integer> entry : months.entrySet()) {
    String month = entry.getKey();
    Integer index = entry.getValue();
    for (Map.Entry<String, Integer> entry2 : months.entrySet()) {
        Integer index2 = entry2.getValue();
        if (index < index2) {
            // process ordered pair of months
            String month2 = entry2.getKey();
            System.out.println(month + " " + month2);
        }
    }
}

编辑:我找到了我的解决方案 - 我需要使用LinkedHashMap保留订单月份的插入,即我可以获得所有与O(N^2 / 2)的对,如果我正在使用ArrayList

1 个答案:

答案 0 :(得分:2)

时间复杂度相同。具体地,

  

O(N 2

  

O(N 2 / 2)

是相同的复杂性类。这是一个在数学上可证明的事实。

即使N 2 大于N 2 / 2 ......也是如此,但这不是表征&#34; Big O&# 34;符号正在解释。

要考虑的另一件事是,对列表进行排序的成本通常会超过您节省的N ^ 2 / 2.无论哪种方式,您都需要在整体计算中包含该成本。


我的直觉是,您可以更好地实施备选方案(在较大的应用程序中)和测量性能 1 。您正在寻求超越&#34;普通&#34;复杂性分析,这使我们迅速进入特定库方法,编译器等行为的领域。 AFAIK,除了通过经验测量之外,没有实用的方式来获得你可以依赖的答案。

但在您这样做之前,您应该配置您的应用程序,以确保您不会浪费时间优化对整体没有重大影响的内容性能


1 - 特别是因为您的最新评论已将多线程性能投入已经过于复杂的问题。