在 C++ 中存储和搜索数字的最佳方法

Posted

技术标签:

【中文标题】在 C++ 中存储和搜索数字的最佳方法【英文标题】:Best way to Store and Search Numbers in C++ 【发布时间】:2014-10-06 11:37:41 【问题描述】:

我有一个非常大的数组来存储一些数字。我的任务是查找特定数字是否存在于数组中或是否有效。我应该使用哪种算法和数据结构?

几个假设:

    数组中的每个数字都是唯一的。 我不关心数据在数组中的位置,我只想在找到数据时返回 true,否则返回 false。

我会使用 C++ 作为编程语言。

请提出建议。

谢谢

【问题讨论】:

使用std::set。或排序后的std::vectorstd::binary_search 您实际上有一个非常大的数组,还是您正在寻找比非常大的数组更好的数据结构? 你在优化什么,数字的分布是什么?没有“最好”的方式来表示一个集合。 实现散列或使用实现散列的内置数据结构。 【参考方案1】:

使用unordered_set 进行恒定时间查找。

还有 bitset 等选项。具体取决于“非常大”的大小以及存储的值与实际存在的值相比的稀疏程度。

【讨论】:

【参考方案2】:

似乎 unordered_set 适合您的要求。

PS:请记住这个集合中的所有元素都是不可变的

【讨论】:

【参考方案3】:

检查元素(数字)是否是集合(数组)成员的已知最佳方法是使用bloom filters。如果集合随时间变化或者集合之间存在集合操作,它会很好地工作。布隆过滤器很容易实现,很好的实现are availble

如果 set 是静态的(即永远不会改变),那么好的方法是使用 perfect hash function。构建需要时间,但会优于 std::unordered_set 提供的通常散列函数

【讨论】:

以上是关于在 C++ 中存储和搜索数字的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

永久存储具有512个浮点数和100万条记录的数组以便快速搜索的最佳方法是什么?

在 C++ 中将数字转换为字符串的最佳方法? [复制]

拟合数字的最佳方法

Django - 在DB答案中存储可以是数字还是文本的最佳方法是什么?

Qt - 保持指向存储在 QList 中的内容的指针的最佳方法是啥?

建模音乐(音符)以在特定时间快速搜索音符的最佳方法