对于k个集合,它们都具有长度= N,找到具有O((k-1)* N)的公共元素

时间:2018-02-20 04:36:40

标签: java sorting sos

我应该编写一个代码,该代码应该有效地找到存在于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};

这是作业。您有可能在某些时候接受过教育。提前致谢。

1 个答案:

答案 0 :(得分:1)

基本思想是在每个列表上保留一个索引,并且只有当索引中的值在所有列表中最小时才推进该索引。

我无法一次查看它是否可以用于k列表,但它一次只能做2个列表,每个列表应该进行N次比较,这应该会给你{{1 (k-1运行N比较)。

类似的东西:

O(k * N)

由此,您可以将列表2分组2,直到只剩下一个列表。