通用目的,快速差异算法支持 [m] 级嵌套差异。
时间复杂度
- 线性 [O(n)]
为什么?
- 比主流算法更快。大多数差异算法是 O(nlogn) 或 O(n.m)。此算法是线性的 (O(n))。
- 大多数算法解决最小公共子序列问题,实现起来很难理解。这个算法只用了 6 次简单的循环遍历。
- 支持嵌套差异(如果您需要)
安装
通过 Cocoapods
pod 'FastDiff'
然后在终端中执行 pod update
。如果您是 Cocoapods 新用户,请查看 Cocoapods 安装
通过 Swift Package Manager
在 swift Package.swift
文件中声明依赖项,如这样
dependencies: [
///.... other deps
.package(url: "https://www.github.com/kandelvijaya/FastDiff", from: "1.0.0"),
]
执行更新命令 swift package update
,然后 swift package generate-xcodeproj
。
运行测试
转到源目录,并运行
$ swift test
用法
算法 & 验证
let oldModels = ["apple", "microsoft"]
let newModels = ["apple", "microsoft", "tesla"]
/// Algorithm
let changeSet = diff(oldModels, newModels)
// [.addition("tesla", at: 2)]
/// Verification
oldModels.merged(with: changeSet) == newModels
// true
请注意,`diff` 通常会产生无法直接合并到旧集合中的更改集,大多数情况下需要 `ordered` 才能成功地合并。如果你想将更改集应用到 `UITableView` 或 `UICollectionView`,这也很有用。
let chnageSet = diff(["A","B"], [“C”,"D"])
// [.delete("A",0), .delete("B",1), .add("C",0), .add(“D",1)]
let orderedChangeSet = orderedOperation(from: changeSet)
// [.delete("b",1), .delete("a",0), .add("c",0), .add("d",1)]
iOS 列表视图控制器中的概念和高级使用
请查看我在 @mobiconf 2018 上提供的这份演示文稿
贡献
欢迎使用Pull Requests贡献代码。如果您需要更多功能、发现bug或者想提出新想法,请自由地提交issue。
潜在任务
- 查看问题部分,了解更多有助于完成任务和描述。这是一个开始贡献的好地方。
作者
- @kandelvijaya (https://twitter.com/kandelvijaya)
许可证
该项目遵循MIT许可证 - 详细信息请查看LICENSE.md文件。
鸣谢
- 受Paul Heckel的论文和算法启发