最快的 c++ / stl 算法来查找成对的字符串

Posted

技术标签:

【中文标题】最快的 c++ / stl 算法来查找成对的字符串【英文标题】:fastest c++ / stl algorithm to find strings in set of pairs 【发布时间】:2015-03-24 15:36:26 【问题描述】:

我正在寻找一种非常快速的算法来返回存储在这样的集合中的对的值set<pair<string,string>>

更具体地说,我查找所有第二个值,其中第一个值以字符串开头。

示例: 我有一套这对:

<"asdf","qwer">,
<"asdfghj", "qwertyui">,
<"lkj","mno">

然后我用“asdf”调用我的方法,我想取回这些字符串的集合或向量:

"qwer"
"qwertyui"

谢谢!

【问题讨论】:

你能改变你原来的数据结构吗?这不是这项任务的最佳选择。 您将这些对存储在std::set 中的事实意味着它们已经按键排序。您可以使用std::set::lower_bound() 来查找第一个具有按字典顺序大于或等于您的搜索键的键的元素,然后迭代直到该条件不再有效。一个更好的问题可能是是否有更好的数据结构可供使用。 实际上,数据集有多大?这对您解决问题的方式有很大的影响。 数据结构必须保持这样。这个集合中将有大约 500.000 个元素 一般来说没有“最快”的算法。对于特定的数据集,可能存在最快的算法,或者存在具有某些特征的算法。它们的行为方式取决于数据和您的要求(可用内存等)。 【参考方案1】:

您将这些对存储在std::set 中的事实意味着它们已经按键排序。您可以使用std::set::lower_bound() 来查找第一个具有按字典顺序大于或等于您的搜索键的键的元素,然后迭代直到该条件不再有效。

【讨论】:

谢谢,我试试这个。但是,如果我的集合包含一对,lower_bound 是如何工作的? @Karl:std::set 默认使用operator&lt; 排序。如果您在operator&lt; 中查找std::pair,那么您会看到它根据该对的第一个元素按字典顺序排序,然后是第二个。因此,如果您的条目与第一个字符串匹配,则您的集合将按对的第一个元素排序,然后按第二个元素排序。

以上是关于最快的 c++ / stl 算法来查找成对的字符串的主要内容,如果未能解决你的问题,请参考以下文章

C++里使用二分法查找和lambda表达式进行比较

python中最快的成对距离度量

如何使用python查找成对的卡片包列表

位运算-查找数组中唯一成对的数

用于成对比较和跟踪最大/最长序列的 STL 算法

最快的内容查找算法-----暴雪的Hash算法