在堆数据结构中环绕问题
Posted
技术标签:
【中文标题】在堆数据结构中环绕问题【英文标题】:Wrap around issue in a heap data structure 【发布时间】:2016-06-01 07:10:37 【问题描述】:我正在使用堆数据结构(std::priority_queue
或 boost::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
平台上,它会自动适应。
【讨论】:
以上是关于在堆数据结构中环绕问题的主要内容,如果未能解决你的问题,请参考以下文章