我正在寻找一种比我的方案中的C ++的unordered_map更快的数据结构。
我在地图中存储未分类的唯一C-String char *
(map.first
)和整数(map.second
)。我可以为这个数据结构使用大约10MB的内存。在我添加新项目之前,我需要先检查它是否存在。所以,我正在进行大量搜索和大量插入。数据结构通常包含很少的项目(< 500),然后它将被删除。所以,我不需要删除单个项目。
我实现了自己的AVL自平衡树(对我来说似乎非常好)但与std::unordered_map
相比实际上更慢。
在我的情况下,你知道任何数据结构比unordered_map更好吗?
答案 0 :(得分:4)
对此的一个很好的答案是线性查找和二进制搜索的组合。
基本上有一个可以二进制搜索的项目的排序向量。这将具有出色的缓存局部性,并且对于您正在查看的那种大小可能会更快。如果你需要插入只需将它推到一个单独的未分类矢量上。当您接下来需要搜索时,都会对未排序的向量进行线性搜索,并对已排序的向量进行二进制搜索。当你的未分类的向量变得足够大时(比如10,但是分析将在这里有帮助)然后将它们插入到已排序的向量的后面并使用它然后清除'未排序的'向量。
这没有最好的复杂性保证,但是对于你正在看的那种尺寸,在现代硬件上可能会更快(线性存储器访问是快速的,并且可能会超过树/列表,直到你变得非常大)。
对未排序的向量进行排序然后将其合并到已排序的向量中会以代码的复杂性为代价提高速度。
答案 1 :(得分:3)
如果内存真的无关紧要,你可以创建一个巨大的vector<bool>
并存储,如果你的AVL树中插入了给定的值。
e.g。看看Counting sort。你可以像这样实现它。
答案 2 :(得分:2)
听起来您的用例需要设置而不是地图。你真的需要一张地图吗?如果没有,unordered_set
将是一个更好的选择,如果你正在处理一个足够小的范围vector<bool>
,如Thomas Sparber所建议。