欢迎访问宙启技术站
智能推送

在Python中利用heapq模块实现中位数查找算法

发布时间:2024-01-17 22:01:31

在Python中,可以使用heapq模块来实现中位数查找算法。heapq模块实现了一个纯Python的最小堆算法,通过使用最小堆,我们可以轻松地找到中位数。

下面是使用heapq模块实现中位数查找算法的步骤:

1. 导入heapq模块:使用import语句导入heapq模块。

import heapq

2. 创建两个堆:创建一个最小堆和一个最大堆,分别用来存储较大和较小的一半数字。

max_heap = []
min_heap = []

3. 将数据插入两个堆中:根据数据的大小,将数据插入到最大堆或最小堆中。

# 假设要插入的数据为num
# 如果最大堆为空或者num小于最大堆的根节点,则插入最大堆
if len(max_heap) == 0 or num < -max_heap[0]:
    heapq.heappush(max_heap, -num)
else:
    heapq.heappush(min_heap, num)

# 调整两个堆,使其平衡
if len(max_heap) > len(min_heap) + 1:
    heapq.heappush(min_heap, -heapq.heappop(max_heap))
elif len(min_heap) > len(max_heap):
    heapq.heappush(max_heap, -heapq.heappop(min_heap))

4. 查找中位数:根据两个堆的大小来判断中位数的位置,如果两个堆的大小相同,取两个堆的根节点的平均值;如果最大堆的大小大于最小堆,直接取最大堆的根节点作为中位数;如果最小堆的大小大于最大堆,取最小堆的根节点作为中位数。

if len(max_heap) == len(min_heap):
    median = (-max_heap[0] + min_heap[0]) / 2
elif len(max_heap) > len(min_heap):
    median = -max_heap[0]
else:
    median = min_heap[0]

下面是一个完整的使用heapq模块实现中位数查找算法的例子:

import heapq

def find_median(nums):
    max_heap = []  # 最大堆,存储较小的一半数字
    min_heap = []  # 最小堆,存储较大的一半数字

    for num in nums:
        if len(max_heap) == 0 or num < -max_heap[0]:
            heapq.heappush(max_heap, -num)
        else:
            heapq.heappush(min_heap, num)

        # 调整两个堆,使其平衡
        if len(max_heap) > len(min_heap) + 1:
            heapq.heappush(min_heap, -heapq.heappop(max_heap))
        elif len(min_heap) > len(max_heap):
            heapq.heappush(max_heap, -heapq.heappop(min_heap))

    # 查找中位数
    if len(max_heap) == len(min_heap):
        median = (-max_heap[0] + min_heap[0]) / 2
    elif len(max_heap) > len(min_heap):
        median = -max_heap[0]
    else:
        median = min_heap[0]

    return median

# 测试例子
nums = [1, 2, 3, 4, 5, 6]
median = find_median(nums)
print(median)  # 输出3.5

在上述例子中,我们通过使用heapq模块来实现了中位数查找算法。通过维护最大堆和最小堆,我们可以轻松地找到中位数。这种方法的时间复杂度为O(log n),效率较高。