【发布时间】:2015-08-05 17:43:46
【问题描述】:
def max_k_sort(k, nums):
# sort nums first using timsort
# add O(n*log(n)) time complexity
sorted_nums = sorted(nums)
return sorted_nums[-1*k:len(nums)]
def max_k(k, nums):
# build initial max number list
max_nums = {}
# add O(k) time complexity?
i = 0
while i < k:
max_nums[i] = 0
i += 1
# add O(n) time complexity?
least_max_key = min(max_nums, key=max_nums.get)
least_max = max_nums[least_max_key]
# add O(n) time complexity?
for n in nums:
if n > least_max:
max_nums[least_max_key] = n
least_max_key = min(max_nums, key=max_nums.get)
least_max = max_nums[least_max_key]
return max_nums.values()
print(max_k(5, [2, 8, 4, 9, 0, 12, 12, 6, 5]))
我不太确定这段代码的时间复杂度。任务是从未排序的整数数组中返回最大 k 个数字。数组中的每个数字都在 [0, 10000) 范围内。我的目标是有一个明显的解决方案 max_k_sort(k, nums) 以 O(n*log(n)) 时间复杂度完成任务,另一种方法 max_k(k, nums) 以 O(n) 时间复杂度完成任务其中 n 是传递的整数数量,k 是要查找的最大值的数量。我不禁想知道是否有办法返回按 O(n) 时间复杂度排序的最大值。
【问题讨论】:
-
“我不禁想知道是否有办法返回按 O(n) 时间复杂度排序的最大值。” - 只要您进行比较,就没有骰子。如果有的话,你可以通过
k=n在 O(n) 时间内对数组进行排序,你无法区分 n! O(n) 比较的可能输入顺序。 -
max_k是O(n)?我不太确定。for中的min呢? -
另外,您真的需要按排序顺序排列的最大 k 值,还是只需要最大 k 值?如果您不关心它们的顺序,您可以使用 O(n) selection algorithm 来选择第 k 个最高值,然后构建每个元素的数组 >= 该值。
-
@user2357112,使用选择算法似乎是完美的答案。但是如果我们通过选择算法来解决它,我们没有利用问题陈述给我们的信息,即数字的范围。 “数组中的每个数字都在 [0, 10000) 范围内。”
标签: python algorithm dictionary big-o time-complexity