Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于多字段搜索大型数据集的有效方法_C++_Algorithm_Sorting_Search - Fatal编程技术网

C++ 基于多字段搜索大型数据集的有效方法

C++ 基于多字段搜索大型数据集的有效方法,c++,algorithm,sorting,search,C++,Algorithm,Sorting,Search,我想知道基于不同字段搜索大型数据集的最佳方法是什么。 例如,Person对象定义如下: Person: first name last name phone numbers 我有100k个Person类型的对象,我想根据字段中的任何一个搜索特定的Person 我尝试使用不同的字段对数据集进行排序,以便在O(logn)时间内执行搜索操作,但我知道这不是正确的方法。您可以尝试: Boost Multi-index Containers库提供了一个名为Multi_index_

我想知道基于不同字段搜索大型数据集的最佳方法是什么。 例如,Person对象定义如下:

Person:
    first name
    last name
    phone numbers
我有100k个Person类型的对象,我想根据字段中的任何一个搜索特定的Person

我尝试使用不同的字段对数据集进行排序,以便在O(logn)时间内执行搜索操作,但我知道这不是正确的方法。

您可以尝试:

Boost Multi-index Containers库提供了一个名为Multi_index_container的类模板,该类模板支持构建容器,以维护具有不同排序和访问语义的一个或多个标记:


但是,如果您想自己尝试一下,那么最简单的解决方案之一是:对所有数据使用一个容器,此外,还要使用适当的索引维护多个映射:

class Indixer
{
    vector<Record> values; // without specific order
    unordered_map<field_type1, Record*> index1; // Search: O(1) average
    unordered_map<field_type2, Record*> index2; // Search: O(1) average
    map<field_type3, Record*> index3; // Search: O(log N) worst case
public:
    // ...
};
输出为:

L1
L2
F1
F2

这个问题没有一个答案,因为正确的答案(很大程度上)取决于您对速度和额外存储的关注程度

如果您想要绝对的最大速度,并且根本不关心使用额外的存储,那么可以创建三个数据副本,每个字段一个,当输入搜索时,只使用适当的一个。这可能不像它第一次出现时那么可怕。让我们假设字符串平均每个约10字节,因此结构的总大小约为30字节。其中10万个副本的每个副本大约有3兆字节,总计约为9兆字节。有一段时间,这显然是禁止的——但对于一台典型的机器来说,现在至少有8G的RAM,这并没有那么可怕

假设排除这种情况,下一个最明显的可能性是将索引构建到原始数据中——将原始数据放入一个数组中,然后为每个字段构建一个索引,其中索引中的每个条目包含一个字段的数据,以及主数据的指针/下标。每个索引项可以是~14字节,因此每个索引大约是整个数据大小的一半。只有三个字段,您不会节省很多,但确实节省了一些,而且复杂性的成本非常低。有了更多的字段,您可以节省更多


另一种可能是将索引实现为哈希表。这里的主要优点是可以避免重复存储日期。例如,如果您计算一个16位哈希,每个bucket有2个条目,那么您可以在~512K字节中存储一个索引。如果一个bucket已满,但两个条目都与您的输入不匹配,则重新散列并尝试另一个bucket。继续,直到您找到您的项目或找到一个空桶。

您可以尝试:“Boost Multi-index Containers库提供了一个名为Multi-index-container的类模板,它支持构建容器,以维护一个或多个具有不同排序和访问语义的索引。”谢谢你的回复。我可以很容易地使用这个库,但我想开发我自己的解决方案。你用什么样的流程来构建你的结构?
insert\u all->build\u once->search
场景是否适合您的需要?例如,您是否需要频繁插入/删除?插入将是批量的,然后将有大量基于任何字段的搜索。+1用于探索备选方案。为什么第二种情况下的索引项是~14字节?每个索引项只需要一个指向数据的指针(4或8字节,取决于32位或64位),并且每个索引都有一个单独的比较函数。它只是用适当的比较函数调用了
binary\u search
。@JimMischel:在第二种情况下,我想的至少是一个包含“key”数据副本的索引,以及指向相应记录的索引/指针。当然,也可以按照正确的顺序设置指针/索引数组——这是速度和内存使用之间的另一个折衷(更多的间接操作通常会降低速度)。感谢您的响应。既然我已经完成了第一部分,我一定会尝试你的第二和第三种方法
L1
L2
F1
F2