【发布时间】:2012-06-04 02:22:33
【问题描述】:
我已经在 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) 处返回元素的函数,它应该在那里选择,我现在修复了它,但我仍然得到错误的输出。至于缩进,代码没有错误,我看不出有什么问题:-??
LE2:我期待 50(对于当前 L),它给我的输出从 30 到 70,不多不少(还)
LE3:非常感谢你,它现在起作用了。不过我很困惑,我试图在这种方法和天真的方法之间进行比较,我只是对数组进行排序并输出结果。现在,从我目前阅读的内容来看,select 方法的时间复杂度应该是 O(n)Deterministic Selection。虽然我可能无法与 python 开发人员所做的优化竞争,但我确实期望得到比我得到的更接近的结果,例如,如果我将列表的范围更改为 10000000,则选择在 84.10837116255952 秒内输出结果,而排序和返回方法在 18.92556029528825 中进行。有什么好方法可以让这个算法更快?
【问题讨论】:
-
请修正您的格式。缩进似乎坏了。
-
getMed()未定义。你得到什么错误的输出,你正在执行的输出是什么?