两个列表中的匹配元素算法 C++

Posted

技术标签:

【中文标题】两个列表中的匹配元素算法 C++【英文标题】:match elements algorithm in two lists C++ 【发布时间】:2013-06-06 18:31:00 【问题描述】:

我正在考虑一种改变两个循环顺序的方法 这里有两个列表:

list<element> aList1;
list<element> aList2;

我想检查两个列表中的每个元素,以确保 aList1 中的元素等于 aList2 中的元素。

列表中的内容可以是:

<a,b,c,d> aList1
<k,a,b,z> aList2

所以,结果应该在aList1中记录不匹配的位置3-4。

但内容也可以是:

<a,b,c>
<d,d,b,d>

所以,结果应该在aList1中记录不匹配的位置1-2和4。我只关注 aList1 的位置。

另一个:

<a,b,c,d,e,f>
<z,e,f,g>

列表长度可以不同,匹配的元素在位置 5-6 是一致的。

我用for(aList1)for(aList2)来做这个,但是浪费了很多,你能给我一些好的方法吗?非常感谢!

不只是列表,容器可以是vector,也可以是map。

PS:元素比较复杂,不是0也不是1,实际上是指针(每个元素包含几个因素,我需要一一比较,所以我想比较比循环少的元素)。

【问题讨论】:

0 和 1 是唯一可能的值吗? 抱歉,我再次编辑了我的问题。 【参考方案1】:

如果您想避免嵌套循环,请尝试以下操作:

for (auto aIt = a.begin(), bIt = b.begin(); aIt != a.end() &amp;&amp; bIt != b.end(); ++aIt, ++bIt)

【讨论】:

【参考方案2】:

您可能想要实现的模式如下:

auto it1, it2;
for  (it1 = aList1.begin(), it2 = aList2.begin(); 
     it1 != aList1.end() && it2 != aList2.end();  ++it1, ++it2) 
     // code to check elements equality here

它允许您验证两个列表中具有相同等级的元素的某些属性,或者支持标准库“可迭代”接口的容器(可以这么说)。请注意,您需要您的容器始终以一致的顺序返回元素,以便比较有意义。

【讨论】:

【参考方案3】:

如果您可以对列表进行排序,则对两者进行排序并在一个循环中通过两个指针进行比较( O(N log N) )。

如果有少量不同的值(例如,如果只有 0 和 1 - 它只是 2 个不同的数字),您可以计算每个数字的计数(例如 0 和 1 的数量)并检查结果。 ( O(N) )

如果您可以将数字(如索引)与列表元素相关联,则可以有效地使用 std::bitset。它更复杂,但具有高性能。看this,操作AND。

不过,看看std::set_intersection。它非常清晰和简单,实际上也适用于指针。

【讨论】:

其实元素比较复杂,为了匹配我需要比较元素中的每个因素。它们不是整数。

以上是关于两个列表中的匹配元素算法 C++的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中比较两个大型数据列表的有效算法是啥?

算法——蛮力法之顺序查找和蛮力字符串匹配

使用 STL 在相反类别中查找具有匹配属性的元素的算法

数据结构与算法之四 搜索算法

VC++如何使用C++ STL标准模板库中的算法函数(附源码)

二分图匹配--匈牙利算法