【发布时间】:2015-05-30 18:56:56
【问题描述】:
为了在 nlogn 中搜索重复项,我决定使用修改后的合并排序。 主要问题是出现错误,我不知道如何解决这个问题:结果有时完全错误。
如果找到一对(具有相同值的元素),我的算法必须返回 True,如果没有一对,则返回 False。所有这些都必须在分治算法中完成。(没有额外的 for 循环 ecc。)
这是代码
def check_duplicates(X):
if len(X)>1:
mid = len(X)//2
lefthalf = X[:mid]
righthalf = X[mid:]
check_duplicates(lefthalf)
check_duplicates(righthalf)
i=0
j=0
k=0
while i<len(lefthalf) and j<len(righthalf):
if lefthalf[i] == righthalf[j]:
return True
if lefthalf[i]<righthalf[j]:
X[k]=lefthalf[i]
i=i+1
else:
X[k]=righthalf[j]
j=j+1
k=k+1
while i<len(lefthalf):
X[k]=lefthalf[i]
i=i+1
k=k+1
while j<len(righthalf):
X[k]=righthalf[j]
j=j+1
k=k+1
return False
让我们举几个例子:
让X=[1,2,3]函数返回false,就可以了。
让X=[1,3,2]函数返回false,也可以。
主要问题在于这种情况:
让X=[1,3,3]函数返回false,这是错误的(应该返回true)。
让X=[4,6,6]函数返回false,错误等等。
主要问题是当我将两个相同的值放在列表末尾时,我不知道如何解决它......
ps:我为我的英语道歉
【问题讨论】:
-
所以,基本上这是一个合并排序,它还检查合并部分是否有重复项?
-
是的...但是当两个相同的值位于列表末尾时会出现问题..
-
如果these numbers 是正确的,我认为你可以使用
len(set(X)) != len(X)在O(N) 中做到这一点 -
@Matt 我们不能使用集合...只是数组和基本操作...
标签: algorithm python-3.x mergesort divide-and-conquer