在堆数据结构中环绕问题

Posted

技术标签:

【中文标题】在堆数据结构中环绕问题【英文标题】:Wrap around issue in a heap data structure 【发布时间】:2016-06-01 07:10:37 【问题描述】:

我正在使用堆数据结构(std::priority_queueboost::heap::binomial_heap)以便使用 unsigned int 对项目进行排序。

struct Item  uint32_t i; ;
std::priority_queue<Item> myHeap;

我将 i 的每个项目的计数器 i 提升到堆中,当我从堆中 pop() 时,因为我正在使用 i 进行排序(未在此具体显示代码示例),我除了得到最低的uint32_t

有没有办法用堆很好地解决环绕问题?;

i 到达2^32 时,它将返回到0。这将导致堆给我项目0,而不是0之前的所有项目。

我应该使用其他排序技术吗?

【问题讨论】:

为什么不使用uint64_t 如果您为每个推送的项目增加i,您真的需要优先队列吗?那普通队列不就行了吗? @MukulGupta uint64_t 也有同样的问题 @KarstenKoop 我试图在我的示例中使其更简单,但我实际上是指具有原子 uint64_t 的多线程环境 看来,对于您的用例,您需要一个带有自定义比较器的 bigint 类。在那种情况下,它永远无法环绕。 【参考方案1】:

您不应该直接使用uint32_t 甚至uint64_t

对于索引,您应该size_t 等于运算符sizeof 返回的类型。所以,如果你在x64 平台上,它会自动适应。

【讨论】:

以上是关于在堆数据结构中环绕问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在堆数据结构中删除?

java 类元数据是不是在堆上?

在 Node.js 中,数据何时存储在堆中?

垃圾收集器在堆中移动数据时引用会更新吗?

是否通过强制转换为有符号的未定义行为来检测无符号环绕?

Java开发学习(十九)----AOP环绕通知案例之密码数据兼容处理