【问题标题】: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 类。在那种情况下,它永远无法环绕。

标签: c++ algorithm sorting heap


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2018-11-26
    • 2011-03-19
    • 2021-08-17
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多