存储和搜索大型数据集

Storing and Searching Large Data Set

本文关键字:数据集 大型 搜索 存储      更新时间:2023-10-16

我对C++编程相对较新,我正在尝试创建一个只有两个值的数据集:ID号和字符串。将有大约 100,000 对。我只是不确定哪种数据结构最适合我的需求。

数据集具有以下要求:

-字符串对应的 ID 号是 6 位数字(因此 000000 到 999999)

- 并非所有介于 000000 和 999999 之间的 ID 值都将使用

-用户将无权修改数据集

-我希望按 ID 或字符串中的单词搜索并返回到用户 ID 和字符串

-搜索速度很重要

所以基本上我想知道我应该使用什么(向量、列表、数组、SQL 数据库等)来构建这个数据集并快速搜索它?

字符串对应的 ID 号是 6 位数字(因此 000000 到 999999)

好,使用 int ,或者更准确地说,int32_t 作为 ID

- 并非所有介于 000000 和 999999 之间的 ID 值都将使用

没问题...

-用户将无权修改数据集

将您的数据封装在一个类中,您就可以开始了

-我希望按 ID 或字符串中的单词搜索并返回到用户 ID 和字符串

很好,使用Boost.Bimap

-搜索速度很重要

我知道,这就是您使用C++的原因... :-)

您可能还需要检查SQLite:SQLite也可以用作内存数据库。

使用 std::map

void main()
{
   std::map<string /*id*/, string> m;
   m["000000"] = "any string you want";
}

如果你不对它们进行排序,Vector & list 是最不好用的,你不想遍历所有内容。我建议你使用地图,即使构建整个地图也可能需要更长的时间(nlogn)。我仍然推荐它,因为搜索的运行时是 log(n),这非常快!

"搜索速度很重要"

我建议像一个类,它包含一个id/字符串对的向量,一个将id映射到迭代器或引用到该向量的unordered_map,以及一个将字符串映射到迭代器或引用到该向量的unordered_map。然后,类中的两个搜索函数根据 id 或字符串查找 id/字符串对。

你有几个选择。

    使用数据库,
  1. MySQL,SQLite等,性能取决于您使用的数据库。

  2. 或者,如果要在C++代码中执行此操作,可以使用向量。一个向量用于键,另一个向量用于字符串。您还需要在 2 个向量之间映射相关索引。

添加新项目后对两个向量进行排序。记得更新相关索引的地图

然后使用二叉搜索查找键或值。它应该足够快。