9

我试图在更新表格数据时仅应用最少数量的更改(它是一个 iOS 应用程序,表格视图UITableView当然是,但我认为这与这里无关)。这些更改包括添加新项目、删除旧项目以及将一些现有项目移动到不同位置而不更新其内容。我知道关于 SO 也有类似的问题,但其中大多数只考虑添加和删除,现有问题要么被忽略,要么只是重新加载。

大多数移动涉及不超过几个现有元素,表格最多可以有 500 个元素。

数组中的项目是唯一的。

通过从旧数组中的项集中减去新数组中的项集,我可以轻松地获得添加的项。而相反的操作将产生一组已删除的项目。

所以问题归结为找到具有相同元素的两个数组之间的最小差异。

[one, two, three, four]
[one, three, four, two]

区分这些数组应该只是从索引 1 移动到 3。

该算法不知道是否只有一个这样的举动。改变也可以是:

[one, two, three, four, five]
[one, four, five, three, two]

这应该导致将索引 1 移动到 4 和 2 到 3,而不是将 3 和 4 两个索引向左移动,因为这可能会导致移动 300 个项目,而实际上更改应该要简单得多。就将视觉变化应用于视图而言,就是这样。这可能需要重新计算单元高度或执行大量动画和其他相关操作。我想避开他们。举个例子 - 将一个项目标记为收藏,这会导致将该项目移动到列表顶部或 300 个项目大约需要 400 毫秒。那是因为使用我目前使用的算法,例如 100 个项目向上移动一个索引,一个移动到索引 0,其他 199 个保持不变。如果我取消标记它,一个项目会向下移动 100 个索引,这很好,但这是完美的,但非常罕见的案例。

我尝试在旧数组中查找项目的索引,检查它是否在新数组中更改。如果有变化,我将项目从新索引移动到旧索引,记录相反的变化并比较数组,直到元素顺序相等。但这有时会导致移动实际上未更改的大量项目,具体取决于这些项目的位置。

所以问题是:我能做什么?

任何想法或指示?也许是修改后的 Levenshtein 距离算法?未修改的可以为此工作吗?如果是这样,我可能不得不以一种或另一种形式实现它。


橡皮鸭说:

考虑找到所有未更改的项目序列并移动所有其他项目。这可能是正确的方向吗?

4

1 回答 1

1

我有一个想法,不知道它是否可行.. 只是我的两分钱。如果您要在数组项上实现类似于最长公共子序列的算法,怎么样。

这个想法是找到保持初始序列的大数据“子字符串”,最大的在前。一旦你覆盖了“长序列”中项目的某个阈值百分比,就应用一个更简单的算法来解决剩余的问题。

对不起,有点含糊,这只是一个建议。希望你能解决你的问题。

于 2013-02-28T11:35:34.667 回答