栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何更新堆中的元素?(优先级队列)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何更新堆中的元素?(优先级队列)

典型解决方案

通常的解决方案是将元素标记为无效并插入新元素,然后在弹出无效条目时消除它们。

替代解决方案

如果该方法不能满足要求, 则只要知道要更改的值的位置就可以按O(log n)步骤还原最小堆不变式

回想一下,最小堆是使用两个基本变量“ siftup”和“
siftdown”构建和维护的(尽管各种来源对哪个向上和哪个向下有不同的看法)。其中一个将值向下推到树上,另一个将其向上浮动。

情况1:价值增加

如果新值 x1 大于旧值 x0 ,则仅需要固定 x 下的树,因为

parent(x) <= x0 < x1
。只需 按下 X
在树中通过交换 X 与它的两个孩子的小,而 X 是其子大于1

情况2:价值下降

如果新值 x1 小于旧值 x ,则 x 下方的树不需要调整,因为

x1 < x0 <= either_child(x)
。相反,我们只需要
向上移动,即可 在 x 小于其父级时将 x 与它的父级交换 __
不需要考虑同级节点,因为它们已经大于或等于父级,而父级可能会被较低的值替换。

情况3:值不变

无需任何工作。现有的不变量不变。

Python中的工作代码

测试1,000,000次试验:创建一个随机堆。更改随机选择的值。恢复堆条件。验证结果是最小堆。

from heapq import _siftup, _siftdown, heapifyfrom random import random, randrange, choicedef is_minheap(arr):    return all(arr[i] >= arr[(i-1)//2] for i in range(1, len(arr)))n = 40trials = 1_000_000for _ in range(trials):    # Create a random heap    data = [random() for i in range(n)]    heapify(data)    # Randomly alter a heap element    i = randrange(n)    x0 = data[i]    x1 = data[i] = choice(data)    # Restore the heap    if x1 > x0:      # value is increased        _siftup(data, i)    elif x1 < x0:    # value is decreased        _siftdown(data, 0, i)    # Verify the results    assert is_minheap(data), direction


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373638.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号