我应该编写一个代码,该代码应该有效地找到存在于N个元素的k个集合中的公共元素。所有集合都经过排序,它们可能有各种不同的尺寸,但为了简单起见,我们假设它们具有相同的尺寸。唯一重要的是元素之间的比较;应该小于O((k-1)* N)。
我开发了以下代码,但在上述情况下,比较次数约为(k-1) N N
提前感谢帮助。
//Arrays are sorted and the shortest array is chosen as the query automatically
boolean com;
loop1: for (int i=0; i <QuetyList.length; ++i){
com = false;
loop2: for (int k=0; k<OtherLists.length; ++k){
com = false;
loop3: for (int y=0; y<OtherLists[k].size(); ++y){
++comparisons;
if (QueryList[i].compareTo(OtherLists[k][y]) == 0)
{
com = true;
break loop3;
}
++comparisons;
if (QueryList[i].compareTo(OtherLists[k][y]) < 0)
{
break;
}
}
if(com == false){
break;
}
}
if(com == true){
commons.add(QueryList[i]);
}
}
样本测试
Comparable [] QuetyList = {200,200,200,200};
Comparable [] collection2 = {2,10,50,200};
Comparable [] collection3 = {2,10,40,200};
Comparable [][] OtherLists = {collection2,collection3};
这是作业。您有可能在某些时候接受过教育。提前致谢。
答案 0 :(得分:1)
基本思想是在每个列表上保留一个索引,并且只有当索引中的值在所有列表中最小时才推进该索引。
我无法一次查看它是否可以用于k列表,但它一次只能做2个列表,每个列表应该进行N次比较,这应该会给你{{1 (k-1运行N比较)。
类似的东西:
O(k * N)
由此,您可以将列表2分组2,直到只剩下一个列表。