将二维空间中的项目映射到内存中

Mapping items in 2-dimensional space into memory

本文关键字:项目 内存 映射 空间 二维      更新时间:2023-10-16

我得到了由其二维坐标(带符号的短距离)标识的项目数。每个项目都是包含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)时间内检索和添加,但为了获得更精确的答案,我们必须知道您需要什么操作才能快速

四叉树似乎就是您想要的。