将二维空间中的项目映射到内存中
Mapping items in 2-dimensional space into memory
我得到了由其二维坐标(带符号的短距离)标识的项目数。每个项目都是包含64KB数据的类。任何时候都有大约500-1500件物品。项目通常以20个为一组,围绕一个点。我的问题是,我应该如何绘制它们,这样就不会占用太多内存。项目的添加/删除速度很慢(每秒1-10个),并且会经常被提取,因此从列表中提取元素(指向更大结构的指针)应该尽可能快。
我想到的是,会有一些gridContainer类,比如说它会存储64x64指针的矩形。我会有一个主网格容器,它将存储其他网格容器,而这个嵌套的网格容器将存储我想要映射的实际项目(这将允许4096x4096个实际项目)。为了访问一个特定的项,例如[260130],我将它除以64,并取商来查找父网格容器位置,余数来查找嵌套网格容器位置。所以对于[270145],我会有[4,2]和[14,17]。
我也在考虑使用std::map
,但我不知道它的内部结构,也不知道它应该有什么性能
对我的方法有什么建议吗?或者有更好的方法吗?
您可以使用已经建议的std::map,它只是一个b树容器,也可以使用哈希表,它可能会更快。四叉树也是一个选项,它将比前两个选项涉及更多,但将提供早期退出选项。
负载最小的哈希表很有可能是O(1)查找,但当n=项存在时,最坏的情况是O(n)。如果你能把负载保持在10%以下,那么你就必须有一个非常糟糕的哈希函数才能比O(1)更糟糕。这显然消耗了大量额外的内存,但它有可能成为最快的选择。哈希表的比较类型相当复杂。您有一个hasher函数,它接受键类型的输入,在本例中是一条短裤,并返回一个索引。该索引对应于对象的半固定数组上的一个位置。如果那里已经有物体,那么必须解决碰撞,这可能会导致有害的运行时间,所以越稀疏越好。
四叉树的最佳返回时间为O(1),但仅适用于空单元格,而如果存在项,则它的查找时间为0(logn),其中n是所需字段的大小。除非你的对象很少,否则这可能会比哈希表占用更多的内存,但如上所述,你会得到一个不错的运行时间,并且不会产生结果的查找可以以相对速度终止。四叉树的比较类型通常只是级联布尔检查。
std::映射的查找时间为O(logn),其中n是映射中的元素。这是内存效率最高的选项,但对于任何查找都有保证的运行时间。std::map的比较类型是级联小于运算,在int(((short1<<16)|short2)的情况下,该运算也相当快。
对您可能使用的容器有一个很好的概述。你应该使用的一个取决于你期望你的表加载的程度。只有几个对象(<500),std::map可能是你的最佳选择。对于500到5000,你可能应该使用四叉树。除此之外,您将开始为树使用大量的内存,并且可能应该使用哈希表。
您可以始终使用std::map<std::pair<short, short>, *item>
,这将允许在log(n)
时间内检索和添加,但为了获得更精确的答案,我们必须知道您需要什么操作才能快速
四叉树似乎就是您想要的。
- 哪些带有开源的项目您可以看到高级内存管理的使用
- 需要析构函数来释放内存空间,即使所有项目都已弹出
- 默认Win32项目具有恒定数量的内存泄漏
- 在UWP C++项目中,程序集分配的内存指针自动更改为0xffffffff
- 如何为大型项目制作一个简单的工具来检测Linux中的双倍空闲或内存溢出
- 我是否必须在Xcode iOS项目中释放C的内存分配
- 是否有一个快速的内存中队列,我可以使用它在达到一定大小时交换项目
- 在没有第三方工具/项目的情况下,在 MFC C++发布版本中查找内存泄漏
- 编译时间和内存 大型C++项目的使用情况?
- 无法重现项目示例项目中的内存清理结果
- 如何在使用JNI的C++/Java项目中使用CRT中的工具检测内存泄漏
- 由于库与EXE项目中的编译器指令不匹配,内存损坏
- 内存管理容器设计问题 - 项目需要继承
- 是否可以进一步减少此小型 MSVC++ 项目的内存使用量"private bytes"?
- 将二维空间中的项目映射到内存中
- vc++ 10项目为对象分配了太多内存
- 为什么在同一x64机器的2个不同项目上对内存的解释不同?这是Endianness吗?
- 用于混合模式项目的内存泄漏检测:托管、非托管和本机
- 将带有XML命令和大量内存项目数据的本地c++服务器移植到webservice.如何做以及使用哪个框架
- 如何统计本地c++项目中每个类的实例数以及它们在高峰期消耗的内存?