gpt4 book ai didi

algorithm - 如何计算两个列表的增量(插入/删除/移动索引)?

转载 作者:IT王子 更新时间:2023-10-29 05:23:24 25 4
gpt4 key购买 nike

假设我有两个对象列表,它们具有唯一 ID 和一个确定它们顺序的属性,我如何才能有效地获取增量索引(哪些索引被插入,哪些被删除,哪些被移动)?

输入示例:

let before: [(id: String, timestamp: String)] = [
("A", "2015-06-04T12:38:09Z"),
("B", "2015-06-04T10:12:45Z"),
("C", "2015-06-04T08:39:55Z"),
("D", "2015-06-03T23:58:32Z"),
("E", "2015-06-01T00:05:51Z"),
]

let after: [(id: String, timestamp: String)] = [
("F", "2015-06-04T16:13:01Z"),
("C", "2015-06-04T15:10:29Z"),
("A", "2015-06-04T12:38:09Z"),
("B", "2015-06-04T10:12:45Z"),
]

let delta = deltaFn(before, after)

这是上面的可视化:

BEFORE                                   AFTER
+-------+----+----------------------+ +-------+----+----------------------+
| index | id | timestamp | | index | id | timestamp |
+-------+----+----------------------+ +-------+----+----------------------+
| 0 | A | 2015-06-04T12:38:09Z | | 0 | F | 2015-06-04T16:13:01Z |
| 1 | B | 2015-06-04T10:12:45Z | | 1 | C | 2015-06-04T15:10:29Z |
| 2 | C | 2015-06-04T08:39:55Z | | 2 | A | 2015-06-04T12:38:09Z |
| 3 | D | 2015-06-03T23:58:32Z | | 3 | B | 2015-06-04T10:12:45Z |
| 4 | E | 2015-06-01T00:05:51Z | | - | | |
+-------+----+----------------------+ +-------+----+----------------------+

预期结果(增量):

Inserted indexes:  [0]
Deleted indexes: [3, 4]
Moved indexes: [(from: 0, to: 2), (from: 1, to: 3), (from: 2, to: 1)]

最佳答案

可以通过使用 2 个映射来解决,将每个元素的 ID 映射到它的索引,然后比较它们。

HashMap 的时间复杂度为 O(n),基于树的映射的时间复杂度为 O(nlogn)。

伪代码:

map1 = empty map
map2 = empty map
for each element x with index i in before:
map1.insert(x,i)
for each element x with index i in after:
map2.insert(x,i)

//find moved and deleted:
for each key x in map1:
id1 = map1.get(x)
id2 = map2.get(x)
if id2 == nil:
add id1 to "deleted indexes"
else if id1 != id2:
add (id1,id2) to "moved indexes"
map2.delete(x)
//find new indexes:
for each key x in map2:
add map2.get(x) to "inserted indexes"

编辑:(在评论中建议)

您可以将内存输出最小化到 O(min{m,n}) 并且在基于树的映射的情况下将时间最小化到 O(max{m,n}log(min{ m,n})),其中 m,n 是两个列表的大小,通过仅映射最小列表,然后迭代数组(未映射)而不是 map 。

map = empty map
for each element x with index i in smaller list:
map.insert(x,i)

for each element x with index i1 in larger list:
i2 = map.get(x)
if i2:
if i1 != i2:
add (i2, i1) to "moved indexes" if smaller list is before
add (i1, i2) to "moved indexes" if smaller list is after
map.delete(x)
else:
add i1 to "inserted indexes" if smaller list is before
add i1 to "deleted indexes" if smaller list is after

// Find new indexes:
for each key x in map:
add map.get(x) to "deleted indexes" if smaller list is before
add map.get(x) to "inserted indexes" if smaller list is after

关于algorithm - 如何计算两个列表的增量(插入/删除/移动索引)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com