【发布时间】:2015-10-18 10:54:24
【问题描述】:
我有两个列表,L1 和 L2,包含多个元素的数据,每个元素都是抽象数据类型的(即:structs)。两个列表中的每一个:
- 可能包含零到一百个(含)元素。
- 不包含重复元素(每个元素都是唯一的)。
- 可能包含也可能不包含其他列表中的元素(即:L1 和 L2 可能相同,或包含完全不同的元素)。
- 未排序。
- 在最低级别,存储在
std::vector<myStruct>容器中。
我通常期望的是定期向 L2 添加一个新元素,或者从中减去/删除一个元素。我正在尝试尽可能有效地检测两个列表中的差异(即:用最少的比较):
- 如果条目不存在于 L2 中而存在于 L1 中,则执行一项操作:
Handle_Missing_Element()。 - 如果条目存在于 L2 中且不存在于 L1 中,则执行另一个操作:
Handle_New_Element()。
一旦执行了上述检查,L1 被设置为等于 L2,并且在将来的某个时间,L2 再次检查。
我怎样才能找出这两个列表之间的差异?我可以想到两种方法:
- 通过每个可能的元素组合比较两个列表。可能 O(n2) 执行复杂度(可怕)。
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++ 中有效地完成此任务?我发现了类似的此类问题,但是I need to do more than just find the intersection of two sets,或者只使用一组整数进行这样的测试,其中可以使用与总和相关的技巧,因为我需要对“新”与“缺失”执行不同的操作元素。
谢谢。
【问题讨论】:
-
C语言中
std::vector<myStruct>不好用,建议去掉C标签。 -
那么,您的列表并不是真正的链表(如
std::list),而是数组(如std::vector)? -
你有元素比较功能吗? (我的意思是
operator<,而不仅仅是operator==。) -
@stgatilov 正确,L1 是常数。
-
@Beta 我没有比较功能。此时它只是一个
struct,而不是一个完全定义的class。