假设apples
是n个苹果的列表,我有一个函数apple_evaluator(apple)
来评估苹果的“优点”。要按“善”排序apples
,请使用apples.sort(key = apple_evaluator)
或sorted(apples, key=apple_evaluator)
。
将apple_evaluator
调用O(n)次(例如,对apple_evaluator(apple)
中的每个apple
进行Python预计算apples
,然后使用这些值对apples
进行排序)或O(n log n)次(例如Python计算每次排序进行比较时重新计算apple_evaluator
值)?
答案 0 :(得分:5)
试试:
count = [0]
def _sort_key(x):
count[0] += 1
return x
a = list(np.random.rand(12))
print count
a.sort(key=_sort_key)
print count, len(a)
答案是O(n)。
答案 1 :(得分:4)
用cmp
替换key
的重点是对关键函数进行O(n)调用。这称为Schwartzian transform或decorate-sort-undecorate
在key
参数出现之前,发现cmp
几乎无用,因为执行此过程效率更高。其中f
是关键功能
L = [(f(i), i) for i in L] ## decorate
L.sort() # there was no "sorted()" at the time ## sort
L = [i[1] for in L] ## undecorate