Oli*_*sen 27 language-agnostic algorithm synchronization list
我很确定这必须在某种教科书中(或者更有可能在所有这些教科书中)但我似乎使用了错误的关键词来搜索它...... :(
我在编程时遇到的一个反复出现的任务是我正在处理来自不同来源的对象列表,我需要以某种方式保持同步.通常有一些"主列表",例如由一些外部API返回,然后是我自己创建的对象列表,每个对象都与主列表中的对象相对应(想想"包装"或"适配器" - 它们通常包含扩展信息关于特定于我的应用程序的外部对象和/或它们简化了对外部对象的访问.
那么我通常如何解决这个问题呢?我应该google算法的名称是什么?
在过去,我已经以各种方式实现了这一点(参见下面的示例),但总觉得应该有更清洁,更有效的方式,尤其是不需要两次迭代的方法(每个列表一个).
这是一个示例方法:
更新1
感谢您的所有回复!我需要一些时间来查看链接.
[...] (文字移至问题主体)
更新2 将中间段重构为(希望)更易于解析的项目符号列表,并在第一次更新中添加后续添加的详细信息.
两种典型的解决方案是: 1. 将主列表复制到同步列表。2. 在所有元素对之间进行 O(N*N) 比较。
您已经排除了智能选项:共享身份、排序和更改通知。
请注意,列表是否可以以有意义的方式进行排序甚至完全排序并不相关。例如,在比较两个字符串列表时,最好按字母顺序排序。但是如果您按字符串长度对两个列表进行排序,列表比较仍然会更有效!您仍然需要对相同长度的字符串进行完整的成对比较,但这可能会少得多。
这看起来像集合协调问题,即同步无序数据的问题。有人就此提出了关于SO的问题:Implementation of set reconciliationalgorithm。
谷歌上的大部分参考文献都是技术论文摘要。
在 C++ STL 中,该算法称为 set_union。此外,如果您将并集合并到第三个列表中,则实现该算法可能会简单得多。