我用Python写了中位数算法的实现,但是它似乎没有输出正确的结果,而且对我来说也不是线性复杂度,你有什么想法吗?
def select(L):
if len(L) < 10:
L.sort()
return L[int(len(L)/2)]
S = []
lIndex = 0
while lIndex+5 < len(L)-1:
S.append(L[lIndex:lIndex+5])
lIndex += 5
S.append(L[lIndex:])
Meds = []
for subList in S:
print(subList)
Meds.append(select(subList))
L2 = select(Meds)
L1 = L3 = []
for i in L:
if i < L2:
L1.append(i)
if i > L2:
L3.append(i)
if len(L) < len(L1):
return select(L1)
elif len(L) > len(L1) + 1:
return select(L3)
else:
return L2
该函数的调用方式如下:
L = list(range(100))
shuffle(L)
print(select(L))
LE: 抱歉。GetMed 是一个简单的函数,它只是对列表进行排序并返回 len(list) 处的元素,应该在那里选择 select,我已经修复了,但仍然得到错误结果。至于缩进,代码没有错误,我看不出有什么问题 :-??
LE2: 我期望得到 50(对于当前 L),它给我输出从 30 到 70,没有更多也没有更少(目前为止)
LE3: 非常感谢,这解决了问题,现在它可以工作了。但我很困惑,我试图比较这种方法和天真的方法之间的差异,即我仅仅对数组进行排序并输出结果。从我到目前为止所读到的内容来看,select 方法的时间复杂度应该是 O(n) 确定性选择。虽然我可能无法与 Python 开发人员的优化竞争,但我确实希望得到比我得到的更接近的结果,例如,如果我将列表的范围更改为 10000000,则 select 在 84.10837116255952 秒内输出结果,而排序和返回方法则在 18.92556029528825 秒内完成。有哪些好的方法可以使此算法更快?
getMed()
未定义。你得到了什么错误输出?你期望得到什么输出? - Joel Cornett