所以我有两个不同的列表,需要协调不同的格式和结构。本质上,集合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,但我认为任何解决方案都可能与语言无关。
谢谢!
答案 0 :(得分:0)
这是另一种可能更有效的方法:
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 数组的费用肯定不比用于跟踪算法中的被访问项目的任何内容更差。
在某种程度上,最合适的算法可能取决于列表的形式(即矢量或链接列表等)。但我认为我的方法有可能更有效。