Java 循环与比较优化
我有以下代码:Java 循环与比较优化,java,algorithm,optimization,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).e
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);
}
}
}
是否有任何方法可以对此进行优化,从而减少运行程序所需的时间
我已经看了这个:还有更多的页面,但是解决方案在我的例子中没有帮助
---------更新----------
比较是针对整数值的,如果“list”包含数字8四次,而“l”包含数字8,则计数器应递增至4
与哈希映射的作用类似,但是我个人不喜欢哈希映射,这就是我不使用它们的原因
任何帮助都将不胜感激。据我所知,您正在尝试计算
列表中的元素出现在l
中的次数
目前,您已经实现了一个相当简单的解决方案,其复杂性为O(n*m)
(假设list
有n
个元素,l
有m
个元素)
为了提高性能,您需要提高解决方案的时间复杂性。您可以创建一个HashMap
,它将保存一个数字在l
中出现的次数,然后在遍历列表的元素时使用它
Map<Integer, Integer> map = new HashMap<>();
for (Integer i : l) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
由于查询HashMap
需要一个恒定的时间(O(1)
),因此此解决方案将以O(n+m)
的复杂度工作,这比O(n*m)
要好得多
但是,由于您没有解释您的问题是什么,也没有解释列表的内容,我无法保证这些代码片段正是您所需要的,但是您应该能够调整这种方法来解决您的问题。您可能希望包括一个解释,说明这个循环应该做什么。还包括一个带有输入和输出的。它看起来像一个朴素的事件计数器。使用Map
对count
而不是List
进行排序,如果我理解清楚,嵌套循环最终将迭代150000 x 150000次。难怪这需要一些时间。你知道怎么做吗?@KevinEsche它的意思是在两个数组列表中的元素都匹配的情况下增加计数器变量。我不知道为什么你不喜欢HashMap
s?它们有特定的用途,在像您这样的情况下可能非常有用。您是重构之王)我不太确定这是否是OP想要的,但如果他想检查列表中的元素出现在l
中的次数,这会不会为不存在的值创建错误的结果(如count==1)?。(如果那是他想要的)@KevinEsche,你说得对。我想如果一个数字x
出现在任何列表中,它应该被计数一次。但正如我所说,我不能保证这正是OP需要的,但他们应该能够轻松地调整这种方法以解决他们的问题。:)对于两个不同的整数值,哈希函数可能给出相同的位置。最好放一个数组。@JoseLuis,是的,你说得对。但是在这种情况下,我们需要知道列表中的最大值,因为我们需要知道数组的大小。:)如果是10^18
,那么我们的解决方案将是O(10^18)
(因为数组初始化),这并不比简单的O(n*m)
方法好
Map<Integer, Integer> map = new HashMap<>();
for (Integer i : l) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
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);
}
}