【问题标题】:heapify function does not give sorted listheapify 函数不给出排序列表
【发布时间】:2019-11-28 02:14:37
【问题描述】:

heapq.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]

我们如何使用堆找到中值?列表是否应该排序?

【问题讨论】:

标签: heap python-3.7


【解决方案1】:

如果您查看theory section of heapq,您会发现它不会对您的列表进行排序。但它把它们放在一个带有奇怪的不变量的oder中:

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

【讨论】:

    【解决方案2】:

    如果您每次添加元素后都想要排序列表,请尝试将这些元素添加到列表中(附加它们)。然后像你一样堆积列表。它每次都会给你排序的列表。 :-)

    【讨论】:

    • 没有。这不是 heapify 所做的。并且OP在附加后尝试了heapify,但没有奏效。
    猜你喜欢
    • 2022-07-05
    • 2020-10-25
    • 2011-05-21
    • 2016-11-27
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多