核对两个列表
Reconcile two lists
所以我有两个不同的列表,需要协调不同的格式和结构。从本质上讲,集合B需要匹配集合A中的内容,但我希望保留集合B中现有项目的状态,而不是用集合A中内容覆盖它们。
作为参考,列表实际上并不意味着列表。"列表"有几种不同的形式,从直数组到映射。所有这些都使用标准迭代器来访问元素。
我通常处理的方式是这样的…
for item in listA
if listB contains item
mark item in list B as visited
else
add item to list b
for item in listB
if visited is true
continue
else
add item to removeList
for item in removeList
remove item from list B
这是可行的,也是我能想到的唯一真正的方法。不过,我不喜欢我必须做多少次迭代,让三个for循环背靠背感觉不对。但是,由于我使用迭代器,所以在检查列表时无法从列表中删除任何内容,而是必须将它们添加到第三个删除列表中。
在潜在的答案中,请记住速度和内存占用对我来说比编写代码的容易程度更重要。
我的问题实际上可以归结为——有没有更好的方法可以做到这一点,而我没有想过?
我在C++/C FWIW中,尽管我认为任何解决方案都可能与语言无关。
谢谢!
这里有另一种可能更高效的方法:
removeList = listB
for item in listA
if listB contains item
remove item from removeList
else
add item to listB
for item in removeList
remove item from listB
因此,它不是从无到有地构建removeList,而是从所有内容开始,然后从中删除项目
您还可以通过使用removeList存储索引而不是实际项来提高效率。只要在初始循环中将项添加到listB的末尾,并按相反的顺序删除项,索引就应该仍然有效。
事实上,如果将removeList替换为要保留的布尔项数组,则会更简单。所以算法变成了这样:
initialise all itemsToKeep to false
savedListLength = length of listB
for item in listA
offset = find item in listB
if found
mark itemsToKeep[offset] as true
else
add item to listB
for offset from savedListLength-1 down to 0
if itemsToKeep[offset] is false
remove the offset from listB
这避免了最初需要将任何内容复制到removeList中。itemsToKeep数组的开销肯定不会比您在算法中用来跟踪已查看项目的任何东西差。
在某种程度上,最合适的算法可能取决于列表的形式(即向量或链表等),但我确实认为我的方法无论哪种方式都有可能更有效。
相关文章:
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 如何在两个列表中比较和获取非包含值
- 将两个列表合并为一个蛇形列表
- 使用特征查找两个列表之间的差异
- c 中的两个列表在o(1)复杂性中
- 关于合并两个列表的算法的一些问题
- 特殊使用功能 - 两个列表的产品
- 如何获取两个列表的公共元素并将其存储在新列表中而不会重复
- 使用两个列表中的组合生成函数调用
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 从两个列表中随机配对
- 在有限边界下有效地合并两个列表
- 用c++合并两个列表
- 用merge在C++中合并两个列表
- 核对两个列表
- 读取Txt文件,逐行,在两个列表中存储多个类型,如果存在的话
- 在两个列表中匹配元素算法
- 比较两个列表并查找缺失元素的有效方法
- 如何在C++中应用两个列表之间的交集