比较两个QAbstractItemModels

时间:2015-08-29 12:00:28

标签: c++ algorithm qt

我正在试图找出一个有效的算法,它接收两个QAbstractItemModels(树)(A,B)并计算它们之间的差异,这样我得到一个A中不存在的项目列表(但是在B - 添加),或已修改/删除的项目。

我能想到的唯一现有方法是对B中的每个项目进行A的广度搜索。但这似乎不是很有效。欢迎任何想法。

1 个答案:

答案 0 :(得分:0)

你尝试过使用魔法吗?

但严重的是,这是一个非常广泛的问题,特别是如果我们认为它是QAbstractItemModels而不是QAbstractListModel。对于列表来说,它会更简单,但是抽象项模型实现了树结构,因此存在很多变量。

  • 检查总项目数
  • 您是否检查每个级别的项目数
  • 您是否检查两个模型中是否包含项目
  • 如果是,是否包含在同一级别
  • 如果是,它是否包含在相同的索引
  • 是处于原始状态或已被修改的项目

您需要做出所有这些考虑因素并提出有效的解决方案。并且不要指望它会像书本算法一样简单"。好消息,因为你正在处理孤立的项目,它比试图为文本做更容易,而在后者的情况下,你不可能希望得到几乎与孤立的项目一样简洁。我已经公平地分享了荒谬的github diff结果。

如果这是您的实际目标,通过跟踪派生数据集的历史记录比盲目比较更容易实现。如果要确定添加内容,删除内容,移动内容和修改内容,则跟踪历史记录要容易得多。因为它会考虑实际的事件流而不仅仅是最终结果比较。特别是如果您没有实施任何持久性ID方案。有没有办法判断项目X是否已被删除或移动到新的级别/索引并进行了修改和类似的事情。

此外,只有在凭经验确定性能问题后才会担心效率问题。有些算法似乎过于复杂,但现代机器速度过快,除非你在紧凑的循环中运行,否则你不应该真的担心它。最后,它并没有归结为它的复杂程度,它归结为它是否足够快。