在c++中有效地管理数组二进制堆句柄
Efficiently manage handle for an array binary heap in C++?
是否有一种方法可以有效地跟踪数组二进制堆中的句柄?
由于传统的二进制堆中没有内置的快速查找,用户需要一个'handle_type'来删除或减少堆中的任意元素。
不能在数组中使用指针或索引,因为堆操作会移动元素的位置。我想不出一个简单的解决方案,像传统的堆实现那样,只使用类似堆栈的结构。否则,我必须使用'new/delete',感觉效率很低。
我不想太沉迷于早熟的优化,但我希望这是我的标准工具库的一部分,所以我想花一点精力去了解什么是被认为是这类事情的最佳实践。
也许只是一个天真的实现使用'new/delete'是这里的方式。但是如果可以的话,我想先从比我聪明的人那里得到一些建议。
c++标准库中的优先级队列实现似乎完全避开了这个问题,只是简单地不支持' elime_key '操作。我一直在浏览CLRS,他们提到了这个问题,但没有真正讨论它:
我们在这里不再追究它们,只是注意到……这些句柄需要正确保养
这里有一个简单的方法我忽略了吗?当"严肃"的库需要一个通用的数组堆,需要一个'减少键'操作时,他们会做什么?
是否有一种方法可以有效地跟踪数组二叉树中的句柄?
这是假设可能的(但不是很漂亮)。在内部,数据结构不是存储元素数组,而是存储指向包含索引和元素对的结构的指针(或智能指针)数组。
-
当一个元素第一次插入到数组i位置时,数据结构将初始化该结构体的索引为i。
-
当数据结构在数组中移动元素时,它应该修改索引以反映新的位置。
push
的结果可以是指向这个结构体的指针(可能包装在一个不透明的类中)。为了访问特定的元素(例如,对于decrease_key
),您将使用此返回值调用堆的某些方法。然后堆将
- 知道数组的地址(毕竟它是它的成员)
- 知道数组内的索引,通过你刚刚发送给它的结构体。
它可以因此实现decrease_key
。
然而,可能有更好(也不那么麻烦)的解决方案。注意,上面的解决方案不会改变数组堆的渐近复杂性,但常量会更糟。相反,如果您查看堆运行时间的摘要,您可以看到二进制堆对于decrease_key
操作并没有真正的良好性能。如果需要的话,最好使用斐波那契堆(或其他数据结构)。这就引出了最后一个问题
像boost::heap这样的库通常确实实现了其他更适合高级操作的数据结构(例如当"严肃"的库需要一个通用的数组堆,需要一个'递减键'操作时,他们会怎么做?
decrease_key
)。这些数据结构自然是基于节点的,并且自然支持不像在数组中那样容易失效的返回值。
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- 在c++中有效地管理数组二进制堆句柄