我有以下代码:
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的原因。
非常感谢任何帮助。
答案 0 :(得分:4)
从我所看到的情况来看,您正在尝试计算来自list
的元素出现在l
中的次数。
目前,您已经实施了一个相当天真的解决方案,其复杂性为O(n * m)
(假设list
有n
个元素且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>
但是,既然你没有解释你究竟是什么问题,也不知道列表的内容是什么,我不能保证这些片段完全你需要什么,但你应该能够根据你的问题调整这种方法。