我有一个数据,我需要对其进行搜索和排序。数据只是一堆结构对象,看起来像这样:
struct ContactInfo {
std::string name;
std::string description;
std::string phoneNumber;
std::string email;
ContactInfo(std::string name, std::string phone, std::string email, std::string desc);
ContactInfo();
};
如果我将其保存在以“名称”为关键字的地图中,如果我搜索“description”,“phoneNumber”或“email”,我将必须执行线性搜索。
我的问题是:我有更好的办法让数据保持更快的搜索速度吗?
答案 0 :(得分:1)
关联STL容器(map
和unordered_map
)围绕单个索引的最典型情况构建。
如果您希望在多个字段上编制索引,则可以使用以下几种解决方案:
std::shared_ptr<ContactInfo>
)在您的情况下,如果您需要更新记录,我会从(1)开始并转到(2)。
请记住,更新是一项复杂的任务,因为每次更新记录时都必须在更新的字段上重新编制索引。为了简化查找,您可以在每个容器中保留一个迭代器来引用该项,并使用它们进行擦除而无需查询:当您将项目放入{{insert
时,调用map
会返回此迭代器。 1}}(或unordered_map
)。
答案 1 :(得分:0)
如果您希望能够在为多个字段指定查询值的情况下进行查询,那么如果字段总数很大,则每个查询获得最佳O(1)运行时间是一个痛苦的问题。但是,听起来您只想一次基于一个字段值进行查询。为此,只需使用Hashmap或您正在使用的任何名称来快速按名称编制索引,并对所有其他字段执行相同的操作。由于您需要O(#records *#fields)存储来存储您的原始数据,并且每个Hashmap或已排序的数组或您正在使用的任何内容都具有大小为O(#records),如果您执行此操作,则您拥有#fields对于每个字段,存储总量渐近地不大于原始数据存储大小(当然,您需要存储指向搜索结构中记录的指针而不是记录本身才能获得此存储绑定)。