heapify如何工作?
我试图找到使用堆的中位数。
heapify给我一种排序的方式
当我使用heapq.heappush()
添加元素时,将其插入到列表中。
当我再次调用heapify时,返回的列表未列出。
import heapq
l=[5,15,1,3]
heapq.heapify(l)
print(l)
这给了我[1, 3, 5, 15]
但是当我添加heapq.heappush(l,2)
时
它返回
[1, 2, 5, 15, 3]
当我再次进行heapq.heapify(l)
还是,它给了我相同的东西。
[1, 2, 5, 15, 3]
如何使用堆来找到中位数?列表应该排序吗?
答案 0 :(得分:1)
如果您查看theory section of heapq
,则会发现它没有对列表进行排序。但这会将它们置于带有奇怪的不变变量的中:
lst[k] <= lst[2*k+1] and lst[k] <= lst[2*k+2]
您的列表很满意;如果您以“二叉树”形式查看它:
1
2 5
15 3
2
小于15
和3
。满足条件。将5
与不存在的元素(被认为是无限的-因此条件成立)进行比较。
为了对列表进行排序,最好使用sorted
:
lst = sorted(lst)
# [1, 3, 5, 15]
然后有效地 在已排序的列表中插入bisect
模块:
from bisect import insort_left
insort_left(lst, 2)
# [1, 2, 3, 5, 15]
中位数现在为lst[len(lst)//2]
。
print(f"median = {lst[len(lst)//2]}")
# median = 3
或者,根据您的约定(这里是statistics.median
中使用的约定):
def median(lst):
ln = len(lst)
if ln % 2 != 0:
return lst[ln // 2]
else:
return (lst[ln // 2 - 1] + lst[ln // 2]) / 2
答案 1 :(得分:-2)
如果您希望在每次添加元素后都进行排序,请尝试将这些元素添加到列表中(附加它们)。然后像您一样堆放列表。它将每次给您排序列表。 :-)