在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),效率较高。
