我有一个binomial_heaps列表,算法的每次迭代都要更新某些binomial_heaps中元素的优先级。为此,我使用了boost binomial_heap的更新功能。然而,我必须完全删除和重建binomial_heaps之一(因为所有优先级都会更改)。而不是每次都使用push(如果我理解正确会有n * log(n)的复杂性)我想基于底层容器的迭代器构造它(一种heapify或make_heap操作,这将是线性时间)。这似乎可以在标准priority_queue中实现,但不能在boost实现中实现。另一方面,标准版没有为我提供更新功能。有没有办法解决这个问题,我可以同时拥有两者,或者另一个支持两者的库。或者也许我的理由是,推送空优先级队列上的所有元素都比较慢,不正确吗?
有些人可能会说,我需要重建整个优先级队列,这会使优先级队列的使用完全变得多余。我想要实现的算法是#34;在Aaron Clauset"中找到非常大的网络中的社区结构。其中作者正是这样做的(除非我没有正确解释)
(抱歉无法发布论文链接,因为我没有足够的声誉发布超过2个链接)
答案 0 :(得分:1)
Clauset等人的“快速模块化”算法。 (paper here,code here)使用一对链接的数据结构。一方面,您有一个稀疏矩阵数据结构(实际上只是一个邻接列表,其中不是将特定数组元素挂起的元素存储为链表,而是使用平衡二叉树数据结构存储它们),和最大堆。稀疏矩阵中的所有值(实际上是算法中潜在合并的dQ_ij值)也存储在max-heap中。
因此,max-heap只是在具有最大正值的稀疏矩阵中找到边缘的有效方法。一旦你有了该边缘的ij对,你想要将列(行)i的元素“插入”到列(行)j的元素中,然后你想要删除列(行)i。因此,在max-heap的每次弹出后,你不会重建整个max-heap。相反,您希望从中删除一些元素(从稀疏矩阵中删除的行/列中的元素)并更新其他元素的值(j的更新行/列中的值)。
这是链接数据结构有用的地方 - 在原始实现中,稀疏矩阵中的每个元素都存储指向max-heap中相应条目的指针,这样如果更新稀疏矩阵中的值,然后可以在max-heap中找到相应的元素并更新其值。执行此操作后,您需要重新堆叠更新的堆元素,方法是让它在堆中向上或向下移动(递归)。类似地,如果删除稀疏矩阵中的元素,则可以在堆中找到它的条目并在其上调用删除函数。