【发布时间】:2018-02-20 04:36:40
【问题描述】:
我应该编写一个代码,它应该有效地找到存在于 k 个 N 元素集合中的公共元素。所有的集合都是排序的,它们可能有不同的大小,但为了简单起见,我们假设大小相同。唯一重要的是元素之间的比较;应该小于 O((k-1)*N)。
我已经开发了下面的代码,但在提到的情况下,比较次数约为 (k-1)NN
提前感谢帮助。
//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};
这是作业。您有可能在教育的某个时间跨过。提前致谢。
【问题讨论】:
-
它们是可散列的吗?你能把记忆扔给它吗?你能遍历每个列表中的所有元素,存储在一个 HashMap 中,其中 value 是一个位域,指定哪些列表包含键?如果是这样,您实际上并不需要对元素进行排序。否则,简化问题。首先求解 k=2。然后尝试扩展。