我试图找出一个有效的算法,它需要两个QAbstractItemModels(树)(A,B)并计算它们之间的差异,以便获得A中不存在的项的列表(但在B - 添加),或已被修改/删除的项目。比较两个QAbstractItemModels
我能想到的唯一的当前方式是对B中的每个项目项进行A的广度搜索,但这看起来效率不高。任何想法都欢迎。
我试图找出一个有效的算法,它需要两个QAbstractItemModels(树)(A,B)并计算它们之间的差异,以便获得A中不存在的项的列表(但在B - 添加),或已被修改/删除的项目。比较两个QAbstractItemModels
我能想到的唯一的当前方式是对B中的每个项目项进行A的广度搜索,但这看起来效率不高。任何想法都欢迎。
你试过使用魔法吗?
尽管如此,这是一个非常广泛的问题,特别是如果我们考虑它是QAbstractItemModels
而不是QAbstractListModel
。对于一个列表来说它会简单得多,但是一个抽象的项目模型实现了一个树结构,所以有很多变量。
您需要进行所有这些考虑并提出一个有效的解决方案。不要指望它会像“书本算法”一样简单。好消息是,因为你正在处理孤立的项目,所以比为文本做这件事要容易得多,而对于后者,你不可能希望得到与孤立项目一样简洁的任何地方。我已经得到了一些荒谬的愚蠢的github diff结果。
而且,如果这是您的实际目标,通过跟踪派生数据集的历史记录要比做盲目比较要容易得多。如果要确定添加内容,删除内容,移动内容和修改内容,则跟踪历史记录要容易得多。因为它会考虑实际的事件流,而不仅仅是最终的结果比较。特别是如果你没有实施任何持久性ID方案。有没有办法判断项目X是否已被删除或移动到新的级别/索引和修改过的东西。
另外,只有在经验性地确定了性能问题后才担心效率问题。一些算法可能看起来过于复杂,但现代机器过于快速,除非你在紧密循环中运行,否则你不应该担心。最终,它不会归结为它的复杂程度,它归结为它是否足够快。
你应该澄清你的问题。我不清楚你的意思是“差异”。可能有2种差异:树结构的差异和节点值的差异。目前还不清楚,您想如何比较节点(应该将哪些数据用作关键字)? –
你可以建立两个'std :: vector',然后对它们进行排序并使用自定义比较器(从相应模型中获取数据),然后使用'std :: set_difference'(也有类似的比较器)来获取区别。这应该是O(n log(n))而不是O(n^2)。或者如果您从空树开始 - 您可以在每次插入/删除模型时保持不同。但正如@Saz所说,需要更多细节。 –
Rostislav
@Rostislav - 这可能适用于原始值,但我非常怀疑它可用于功能数据树。 – dtech