同步两个点数组

本文关键字:两个 数组 同步 | 更新日期: 2023-09-27 18:33:23

我有两个格式为 {Time,Y Value} 的点数组,例如:

A - [{1,1} {2, 2} {3, 3} {5, 5}]
B - [{1,1} {4, 4} {5, 5}]

我需要两个数组具有相同的时间离散化。 因此,对于 A 中时间为 t 的每个点,B 中都需要有一个具有相同时间的点,反之亦然。 如果数组中不存在它,则应添加一个 Y 值等于前一个点的新点。

因此,在同步 A 和 B 后,它们应如下所示:

A - [{1,1} {2, 2} {3, 3} {4, 3} {5, 5}]
B - [{1,1} {2, 1} {3, 1} {4, 4} {5, 5}]

有没有人对如何为大型数组执行此操作有任何想法?

同步两个点数组

如果您知道最大数组大小并且时间始终是 1 的倍数,如您的示例所示,您可以使用两个可为空的数组int s ( int? ),其中所有值都以 null 开头,然后根据加载初始数组的方式将它们设置为整数值。 然后,您不必做任何丑陋的事情,例如搜索不同长度的列表,每次需要插入值时增加列表等 - 这一切都由数组索引完成。 如果需要更紧凑形式的列表,则可以快速浏览数组并将所有非空项作为坐标对添加到列表中,如您所显示的那样。

我想如果你不知道最大时间值,你可以使用List<int?>而不是int?[];你只需要确保每个时间值都被表示(这意味着每个时间值都有一个null不在列表中)。 关键是能够从时间值映射到列表索引,因此不涉及搜索。

假设 AB 的伪代码按时间排序:

Sync(A, B)
    def indA = 0
    def indB = 0
    while indA < length(A) and indB < length(B)
        if A[indA].time == B[indB].time
             indA++
             indB++
        else if A[indA].time < B[indB].time
             insert {time: B[indB].time, value: A[indA].value} to A at indA+1
             indA++
        else
             insert {time: A[indA].time, value: B[indB].value} to B after indB+1
             indB++