我一直在阅读罗伯特·塞奇威克(Robert Sedgewick)的“算法”(Algorithms)一书中的“算法”(Algorithms),我一直坚持锻炼问题。这是一个问题:
给出3个N
名称列表,找到一个算法来确定是否有任何三个列表共有的名称。该算法必须具有O(Nlog N )复杂度。您只能使用排序算法,您可以使用的唯一数据结构是堆栈和队列。
我想我可以使用HashMap解决这个问题,但问题限制了我们这样做。即便如此,仍然没有Nlog N 的复杂性。
答案 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)
步骤:
O(N lgN)
排序算法对三个列表进行排序。第1步采用O(N lgN)
,其余步骤采用O(N)
,因此整体复杂度为O(N lgN)
。