【发布时间】:2014-03-28 19:38:06
【问题描述】:
我需要经常在不断更新的集合中找到最小值对象。我需要有一个优先队列类型的功能。执行此操作的最佳算法或数据结构是什么?我正在考虑拥有一个排序的树/堆,并且每次更新对象的值时,我都可以删除该对象,然后将其重新插入树/堆中。有没有更好的方法来做到这一点?
【问题讨论】:
-
值是什么类型?
-
有多少项?值的范围是多少?
-
@user3473949 您是否尝试过使用存储桶代替优先级队列?我的意思是只为每个值存储一个具有该值的项目的链接列表。然后修改键只是从一个列表中删除项目并将其添加到另一个列表中的问题。如果你保留一个指向最小非空桶的指针,你可以在 O(1) 中找到它。当它指向的存储桶变空时维护该指针可能会稍微昂贵一些,但这只是对最多 100 个很容易放入 L1 的指针的线性扫描,所以这也很便宜(也许 min 也不会改变通常在您的场景中)
-
@NiklasB.:Delete-min 可以通过使用布尔值的(位压缩的)向量来加速,该向量说明哪些桶是非空的,并快速找到其中的最低有效位.
-
您说“不断更新”,但更新的种类非常重要。插入?删除分钟?随意删除?合并?减少键?增加键?其他人?
标签: algorithm sorting data-structures set priority-queue