我正在开发一个包含大数字行的应用程序,
transNum[20000][200]//this is the 2d array containing the numbers and always keep track of the line numbers
我使用嵌套循环来查找最常用的项目。
for(int i=0/*,lineitems=0*/;i<lineCounter;i++)
{
for(int j=0,shows=1;j<lineitem1[i];j++)
{
for(int t=i+1;t<lineCounter;t++)
{
for(int s=0;s<lineitem1[t];s++)
{
if(transNum[i][j]==transNum[t][s])
shows++;
}
}
if(shows/lineCounter>=0.2)
{
freItem[i][lineitem2[i]]=transNum[i][j];
lineitem2[i]++;
}
}
}
当我使用像test [200] [200]这样的小输入数组进行测试时,这个循环工作正常并且计算时间是可以接受的,但是当我尝试处理包含12000行的数组时,计算时间太长,所以我在想是否有其他方法来计算频繁项目而不是使用这个循环。我只是在10688行上进行测试,获得所有频繁项目的时间是825805ms,这是昂贵的。
答案 0 :(得分:1)
请记住,这是最好的O(n ^ 2)算法,可能会更糟。这意味着操作次数与平方项目的数量成正比。经过一定数量的线后,性能会迅速下降,除了改进算法外,你无能为力。
答案 1 :(得分:0)
取决于您的输入。如果您也在同一代码中插入数据,那么您可以在插入数据时计算频繁项目。
这是一个伪C解决方案:
int counts[1000000];
while(each number as n)
{
counts[n]++;
// then insert number into array
}
编辑#2:请确保将数组中的所有项初始化为零,以免造成意外结果。
答案 2 :(得分:0)
Google Guava项目的Multiset实施在这种情况下可能很有用。您可以在那里存储项目,然后检索每组事件的计数值。
答案 3 :(得分:0)
为此考虑算法。这是我提出的解决方案:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class NumberTotalizerTest {
public static void main(String args[]) {
HashMap<Integer,Integer> hashMap = new HashMap<Integer,Integer>();
// Number input
Random randomGenerator = new Random();
for (int i = 1; i <= 50; ++i ) {
int randomInt = randomGenerator.nextInt(15);
System.out.println("Generated : " + randomInt);
Integer tempInt = hashMap.get(randomInt);
// Counting takes place here
hashMap.put(randomInt, tempInt==null?1:(tempInt+1) );
}
// Sorting and display
Iterator itr = sortByValue(hashMap).iterator();
System.out.println( "Occurences from lowest to highest:" );
while(itr.hasNext()){
int key = (Integer) itr.next();
System.out.println( "Number: " + key + ", occurences: " + hashMap.get(key));
}
}
public static List sortByValue(final Map m) {
List keys = new ArrayList();
keys.addAll(m.keySet());
Collections.sort(keys, new Comparator() {
public int compare(Object o1, Object o2) {
Object v1 = m.get(o1);
Object v2 = m.get(o2);
if (v1 == null) {
return (v2 == null) ? 0 : 1;
}
else if (v1 instanceof Comparable) {
return ((Comparable) v1).compareTo(v2);
}
else {
return 0;
}
}
});
return keys;
}
}