【发布时间】:2014-03-02 12:13:48
【问题描述】:
所以我正在尝试学习以正确的方式编写代码,并且正在阅读一本算法和数据结构的书。作为向读者传授算法价值的练习的一部分(在我们开始学习算法之前),我正在解决一个编码练习问题,该问题将在 O(N) 时间内找到整数列表中的第 k 个最小整数。我避免寻找答案,因为我想自己解决它以进行大脑锻炼。无论如何,我的代码主要使用公认的笨拙的分而治之算法。
我不想对算法本身有任何帮助!!我只想知道我做错了什么,因为我可以打印输出,但返回它不起作用。
alg_list = [7, 10, 18, 3, 8, 11, 9, 15, 0, 14, 12, 16, 6, 5, 2, 13, 17, 4, 1, 19]
def kth_smallest(k, input_list):
N = len(input_list)
if N == k:
input_list.sort()
M = input_list[-1]
print M # used this to get some output to ensure the algorithm works at least
return M #this is where Im confused. Why no return?
else:
if N == 1:
M = input_list[0]
#print '2nd condition'
return M
elif N%2 == 0:
M = input_list[N/2]
#print '3rd condition'
else:
M = input_list[(N - 1)/2]
#print '4th'
list_small = [x for x in input_list if x < M]
list_large = [x for x in input_list if x > M]
if len(list_small) == k - 1:
#print '5th'
return M
elif len(list_small) > k - 1:
#print '6th'
kth_smallest(k, list_small)
elif (len(list_large) + len(list_small)) == (k - 1):
#print '7th'
return M
elif (len(list_large) + len(list_small)) == k:
#print '8th'
new_list = list_large + list_small
kth_smallest(k, new_list)
else:
#print '9th'
kth_smallest(k, list_large)
kth_smallest(3, alg_list)
在这里打印3,但是如果我注释掉打印语句,它不会返回3。我在这里返回值“M”做错了什么??同样,我确信我在算法上的糟糕尝试很糟糕,但我在本书的开头,这个练习只是为了让读者思考,所以我现在可以接受它很糟糕。我只想知道我在返回值时做错了什么。我假设我错过了一些非常明显的东西。
谢谢!!
【问题讨论】:
-
只有少数几个分支可以退回任何东西。仔细检查你的递归调用,看看你是否应该把
return放在它们前面。我认为你应该这样做。 -
谢谢!这非常有帮助。让我吃惊的是,我的大脑竟然会因为这样的微妙细节而变得愚蠢!
-
那个算法不是
O(n),顺便说一句……重点是避免排序 -
你也删除了等于
M的元素 -
谢谢尼克拉斯。你是对的,我放弃了 M。我将不得不调整。也意识到需要摆脱排序。