在列表中查找共同名称的算法

时间:2012-09-28 16:54:40

标签: algorithm sorting

我一直在阅读罗伯特·塞奇威克(Robert Sedgewick)的“算法”(Algorithms)一书中的“算法”(Algorithms),我一直坚持锻炼问题。这是一个问题:

给出3个N名称列表,找到一个算法来确定是否有任何三个列表共有的名称。该算法必须具有O(Nlog N )复杂度。您只能使用排序算法,您可以使用的唯一数据结构是堆栈和队列。

我想我可以使用HashMap解决这个问题,但问题限制了我们这样做。即便如此,仍然没有Nlog N 的复杂性。

2 个答案:

答案 0 :(得分:3)

如果您对每个列表进行排序,那么您可以通过选择列表A的第一个名称来检查所有三个列表是否在O(n)时间内具有任何1个名称,并将其与列表B中的第一个名称进行比较,如果是元素是<列表A的那个,弹出列表b元素并重复直到列表B> =列表A.如果找到匹配,则在C上重复该过程。如果在C中找到匹配也返回true,否则返回到下一个元素一个。

现在你必须在n log n时间内对所有列表进行排序。您可以使用自己喜欢的排序算法进行操作,尽管您只需要使用堆栈和队列进行创作。我可能会建议合并排序

下面的伪代码有点乱,因为我正在更改我正在迭代的列表

伪代码: 假设listA,b和c是排序队列,其中最小的名称位于队列的顶部。

eltB = listB.pop()
eltC = listC.pop()
for eltA in listA:
    while(eltB<=eltA):
        if eltB==eltA:                
            while(eltC<=eltB):
                if eltB==eltC:
                    return true
                if eltC<eltB:
                    eltC=listC.pop();
        eltB=listB.pop()           

答案 1 :(得分:0)

步骤:

  1. 使用O(N lgN)排序算法对三个列表进行排序。
  2. 弹出每个列表中的一个项目。
  3. 如果您尝试弹出的任何列表为空,则表示您已完成,即不存在公共元素。
  4. 否则,请比较这三个要素。
  5. 如果元素相等,那么你就完成了 - 你找到了共同元素。
  6. 否则,保留三个元素的最大值(恒定时间)并从相同列表中补充,从中删除这两个元素。
  7. 转到第3步。
  8. 第1步采用O(N lgN),其余步骤采用O(N),因此整体复杂度为O(N lgN)