最快的数据结构或算法,可快速查找 2 个键
Fastest data structure or algorithm for fast lookup on 2 keys
在我的应用程序中,我存储了一组数据结构,其中包含 2 个整数引用值。
- 内部引用 - 表示数据库中的对象。
- 外部引用 - 外部世界如何引用对象。(它们不能使用相同的值(。
我正在使用以内部引用为键的 std::map,但这给我留下了一个问题,如果我必须通过外部引用查找,我必须潜在地遍历整个地图才能找到正确的条目。由于此列表可能包含数千个条目,因此考虑起来很痛苦。
下面的代码演示了一个简单的示例。
#include <iostream>
#include <map>
class MyData
{
public:
MyData(int internal_id, int external_id)
: internal_id_(internal_id), external_id_(external_id)
{}
int internal_id_;
int external_id_;
/* more data members ... */
};
int main(int argc, char** argv)
{
std::map<int, MyData*> datamap;
/*
Build the map structure with arbitrary values.
*/
for(int i = 0; i < 100; ++i)
{
MyData* md = new MyData(i, (100 - i));
std::cout << md->internal_id_ << " " << md->external_id_ << std::endl;
datamap.insert(std::make_pair(i, md));
}
/*
Find with internal id 50 Cheap lookup O(log N) (I think)
*/
std::map<int, MyData*>::iterator it1;
if((it1 = datamap.find(50)) != datamap.end())
{
std::cout << "Found Mydata with internal id 50 external id is " << it1->second->external_id_ << std::endl;
}
/*
Find with external id 35. Expensive lookup O(N)
*/
std::map<int, MyData*>::iterator it2;
for(it2 = datamap.begin(); it2 != datamap.end(); ++it2)
{
if(it2->second->external_id_ == 35)
{
std::cout << "Found with external id 35 internal id is " << it2->second->internal_id_ << std::endl;
break;
}
}
/* remove from map and clean up allocated MyData objects ... */
}
我可以采取哪种方法来改进从外部引用的查找?
我已考虑以下选项。
- 2 张地图都指向相同的事物,但键控的值不同。
- 一个简单的数据库(sqlite(。也许,但可能是矫枉过正。
- 维护另一个映射,该映射将外部引用映射到内部引用。
其中第三种选择似乎是最理智的。有没有更好的选择?
- 如果任何一个键是近乎连续的(即通常使用连续的值,中间没有太多未使用的数字(,那么数组 - 直接由该 id 索引 - 是最佳的,否则
- 如果要创建数值上越来越高的新键,则可以
push_back
vector
并使用std::binary_search
甚至插值搜索,否则 -
unordered_map
或map
.
与往常一样 - 要知道什么是最快的,实施替代方案并衡量(但我在上面按预期的性能顺序列出了它们(。
如果使用第一个或第三个选项,您可能希望将两个映射放入一个类中,以便插入和删除在两个映射中一致地完成,并且链接到的对象仅在不需要时才删除(您也可以使用共享指针来管理它,但这可能有点重量级 - 取决于您的需求。
只需将外部 id 映射到内部 id 就足够了。这样,始终可以在给定其任一 id 的情况下找到对象。如果您需要通过一个密钥删除某些内容,您可以找到它,确定它是另一个密钥,然后删除它及其外部密钥条目。
(这样您就不必更改现有的查找代码,只需添加新地图(
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- C++映射有2个键,这样任何1个键都可以用来获取值
- 无法添加多个键以映射将结构作为键
- C++中同一基础对象的多个键
- c++同一个键的多个键/值对
- 让用户输入一个键,如果找到多个键,则增加值
- C++类似于 std::map 的数据结构,具有多个键级别
- 在矢量中查找映射键的最快方法
- QML:多个键按 /发布后未处理一些键
- 使用 k 个键值对为零的存储桶初始化 c++14 unordered_map
- 首选数据结构,如果您有两个键并且无法使用Boost
- Cassandra驱动程序用多个键查询
- 在几个键的哈希表处搜索
- SORT(),vector<pair<int,int> >严格基于键值,即使两个键值相同
- Qt同时按下多个键
- 使用 GLFW 一次处理多个键输入
- 通过多个键和存储映射对大量向量进行排序
- Windows API-用多个键组合注册热键
- 两个键之间的键数
- 最快的数据结构或算法,可快速查找 2 个键