Har*_*men 9 algorithm optimization text-processing
我有一个包含文本添加和删除位置的列表,如下所示:
Type Position Text/Length
1. + 2 ab // 'ab' was added at position 2
2. + 1 cde // 'cde' was added at position 1
3. - 4 1 // a character was deleted at position 4
Run Code Online (Sandbox Code Playgroud)
为了更清楚,这就是这些操作将要做的事情:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
---------------------------------
t | e | x | t | | | | |
1. t | a | b | e | x | t | | |
2. c | d | e | t | a | b | e | x | t
3. c | d | e | a | b | e | x | t |
Run Code Online (Sandbox Code Playgroud)
行动的数量可以减少到:
Type Position Text/Length
1. - 1 1 // 't' was deleted at position 1
2. + 1 cdeab // 'cdeab' was added at position 1
Run Code Online (Sandbox Code Playgroud)
要么:
Type Position Text/Length
1. + 1 cdeab // 'cdeab' was added at position 1
2. - 6 1 // 't' was deleted at position 6
Run Code Online (Sandbox Code Playgroud)
这些操作将保存在我的数据库中,以便对此进行优化:如何减少为获得相同结果而要执行的操作数量?有没有比O(n*n)更快的方法?
请注意,这些操作是按时间顺序排列的,更改操作的顺序会产生另一个结果.
不是解决方案,只是一些想法:
我没有看到最短解决方案的简单算法。然而,使用规则 1 + 2 的启发式方法可能是:
应用于样本,这意味着:
+ 2 ab
+ 1 cde
- 4 1
Run Code Online (Sandbox Code Playgroud)
规则 1 (2x):
+ 2 ab
- 1 1 // position adjusted by -3
+ 1 cde
Run Code Online (Sandbox Code Playgroud)
。
- 1 1
+ 1 ab // position adjusted
+ 1 cde
Run Code Online (Sandbox Code Playgroud)
规则 2:
- 1 1
+ 1 cdeab // watch correct order!
Run Code Online (Sandbox Code Playgroud)
原始实现将是 O(N*N) - 基本上是带有附加停止条件的冒泡排序。我不确定是否可以降低这种复杂性,因为由于必须调整位置,标准算法在这里没有用。
但是,您可能能够显着改进事情 - 例如您不需要“完整排序”