我有两个数据列表L1和L2,它们均包含多个元素,每个元素都是一个独特的抽象数据类型(如
- 可以包含零到一百个(含)元素 - 不包含重复元素(每个元素都是唯一的) - 可能包含在另一个列表中的元素(即L1和L2可能完全不同,也可能相同) - 没有排序 - 在最底层使用
通常情况下,我期望定期向L2添加新元素或者从其中删除元素。我想尽可能有效地(即使用最少比较次数)检测两个列表之间的差异:
- 如果条目在L1中存在而在L2中不存在,则执行一个操作:
如何找出这两个列表之间的差异?我可以想到两种方法:
1. 通过每种可能的元素组合来比较两个列表。可能的执行复杂度为O(n2)(可怕)。 2. 将两个列表排序并按元素顺序进行比较,该方法可能效率高一些。
structs
)。这两个列表:- 可以包含零到一百个(含)元素 - 不包含重复元素(每个元素都是唯一的) - 可能包含在另一个列表中的元素(即L1和L2可能完全不同,也可能相同) - 没有排序 - 在最底层使用
std::vector<myStruct>
容器存储通常情况下,我期望定期向L2添加新元素或者从其中删除元素。我想尽可能有效地(即使用最少比较次数)检测两个列表之间的差异:
- 如果条目在L1中存在而在L2中不存在,则执行一个操作:
Handle_Missing_Element()
- 如果条目在L2中存在而在L1中不存在,则执行另一个操作:Handle_New_Element()
完成上述检查后,将L1设置为等于L2,并且在将来的某个时间再次检查L2。如何找出这两个列表之间的差异?我可以想到两种方法:
1. 通过每种可能的元素组合来比较两个列表。可能的执行复杂度为O(n2)(可怕)。 2. 将两个列表排序并按元素顺序进行比较,该方法可能效率高一些。
bool found;
for i in 1 .. L2->length()
found = false;
for j in 1 .. L1->length()
if (L1[j] == L2[i]
// Found duplicate entry
found = true;
fi
endfor
endfor
- 将列表排序,并逐个元素比较两个列表,直到找到差异。这似乎是几乎线性的时间复杂度。问题在于我需要对列表进行排序。在每次添加/移除后手动对底层向量进行排序是不切实际的。只有当可以强制
vector::push_back()
自动插入元素以保留列表排序时,这才是合理的。
在C++中是否有一种高效的简单方法来实现这个呢?我找到了类似的问题,但是我不仅需要找到两个集合的交集,或者使用只包含整数的集合进行这样的测试,可以使用与求和相关的技巧,因为我需要针对“新”和“缺失”的元素执行不同的操作。
谢谢。
std::vector<myStruct>
很困难。建议去掉"C"标签。 - chux - Reinstate Monicastd::list
),而实际上是数组(如std::vector
)? - AnT stands with Russiastruct
,而不是一个完全定义的class
。 - Cloud