循环和比较优化

时间:2016-03-29 08:17:13

标签: java algorithm optimization

我有以下代码:

    ArrayList<Integer> count = new ArrayList<>();
    for(int i=0;i<l.size();i++)
        count.add(0);

    for(int i=0;i<list.size();i++)
    { 
        for(int j=0;j<l.size();j++)
        {
            if(list.get(i).equals(l.get(j)))
            {
                int val = count.get(j);
                count.set(j, val+1);
            }   
        }
    }

我的问题是,当运行两个for循环和比较时,运行需要很长时间,因为我正在迭代的循环有:

size > 150000, also both "list" and "l" are ArrayLists

有没有办法优化它,以便运行程序所用的时间减少?

我看过这个:for loop optimization以及更多页面,但解决方案对我的实例没有帮助。

--------- ---------- UPDATE

比较是针对整数值,这个&#34; list&#34;包含数字8四次和&#34; l&#34;包含数字8,计数器应增加到4。

类似于Hash Map的功能,但我个人不喜欢Hash Maps,这就是我不使用Hash Maps的原因。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

从我所看到的情况来看,您正在尝试计算来自list的元素出现在l中的次数。

目前,您已经实施了一个相当天真的解决方案,其复杂性为O(n * m)(假设listn个元素且l有{ {1}}元素)。

为了提高性能,您需要提高解决方案的时间复杂度。您可以创建m来保存HashMap<Integer, Integer>中出现的数字的次数,然后在迭代l的元素时使用它。

list

然后,对于Map<Integer, Integer> map = new HashMap<>(); for (Integer i : l) { map.put(i, map.getOrDefault(i, 0) + 1); } 的每个元素,您只需要检查其值在list中出现的次数。我再次使用l

Map

由于查询Map<Integer, Integer> count = new HashMap<>(); for (Integer value : list) { Integer temp = count.get(value); if (temp != null) { count.put(value, temp + 1); } else { count.put(value, map.getOrDefault(value, 0) + 1); } } 需要一段时间(HashMap),因此此解决方案将使用O(1)复杂度,这比O(n + m)要好得多。< / p>

但是,既然你没有解释你究竟是什么问题,也不知道列表的内容是什么,我不能保证这些片段完全你需要什么,但你应该能够根据你的问题调整这种方法。