【问题标题】:Interpolating between two arrays with changing values在具有变化值的两个数组之间进行插值
【发布时间】:2017-02-21 22:38:19
【问题描述】:

我不知道这种问题是否有名称,更不用说解决方案,所以我所能做的就是尽力描述它。

假设我有一个处于以下状态的数组:

[0, 0, 3, 0]

后来数组中的值变成了:

[5, 0, 0, 0]

我们称旧状态为 A,新状态为 C。我们想找到一个状态 B 代表两者之间的中间形式。

我真正想要的中间形式是 [0, 4, 0, 0],这样通过所有三个阶段的状态变化代表正在改变位置和值的事物的运动。

简单地对两个状态进行平均是行不通的,因为这会产生以下中间形式:[2.5, 0, 1.5, 0],我所追求的完全错误的表示。

另一个例子:

A:[0, 2, 0, 0, 0, 6]

C: [0, 4, 0, 8, 0, 0]

中间形式应该是:

B:[0, 3, 0, 0, 7, 0]

部分问题是我无法定义问题。很清楚给定输入我想要什么结果,但我似乎无法使用足够精确的语言根据输入来描述结果。

用输入来描述结果的正确方法是什么,以便我可以更好地表述问题?

最终,有没有一种算法可以产生我所追求的东西?

【问题讨论】:

    标签: algorithm computer-science


    【解决方案1】:

    虽然我没有“明确的情况”(可能的向量状态),但我会假设如果输入向量中的两个元素大于零,则只能在两种情况下:

    a) i == j
    b) i == j + 2(或者一般来说:(i+j)%2 = 0

    i:v1 中元素的索引
    j: v2中元素的索引

    在这种情况下,这个伪代码可能会给出想要的结果:

    vector v1, v2;
    vector v3 = [0];  --all zeros in resultant vector 
    pos1 = pos2 = -1; --position of elements in vectors
    for (i = 0; i < size(v1); i++)
        {
        if (v1(i) > 0)
           pos1 = i;     
        if (v2(i) > 0)
           pos2 = i;
        if (pos1 >= 0 && pos2 >= 0)
           {
           pos3 = pos1 + pos2;
           if ((pos3 % 2) != 0)   
              {
              --how to handle this?
              --error? 
              } 
           pos3 = pos3/2;
           v3(pos3) = (v1(pos1) + v2(pos2) )/ 2;                   
           pos1 = pos2 = -1;
           }
        }
    

    v3 是合成向量,即具有“插值”值的向量。 它应该适用于您提出的案例......我希望如此:)

    【讨论】:

      【解决方案2】:

      这适用于您的两个测试用例。

      def avg(l1, l2, base=0):
          ans = []
          L = len(l1)
          i = 0
          while i < L:
      
              e1 = l1[i]
              e2 = l2[i]
      
              if e1 != base or e2 != base:
                  left = i
                  if e1 != base:
                      first = l1
                      second = l2
                  else:
                      first = l2
                      second = l1
      
                  while i < L and second[i] == base:
                      i += 1
      
                  ans += [base] * (i - left + 1)
                  avg_idx = (left + i) // 2
                  avg_val = (first[left] + second[i]) / 2
                  ans[avg_idx] = avg_val
      
              else:
                  ans.append(base)
      
      
              i += 1
      
          return ans
      
      print(avg([0, 0, 3, 0], [5, 0, 0, 0])) # [0, 4.0, 0, 0]
      print(avg([0, 2, 0, 0, 0, 6], [0, 4, 0, 8, 0, 0])) # [0, 3.0, 0, 0, 7.0, 0]
      print(avg([2,2,3,2], [5,2,2,2], base=2) # [2, 4.0, 2, 2]
      

      【讨论】:

      • 这在我的示例中未更改的值全部为 0 时有效,但我认为当它们是其他值时这不会有效。例如[2,2,3,2] 和 [5,2,2,2] 应该产生 [2,4,2,2]...我想知道这是否可以通过将 if e1 != 0 or e2 != 0 更改为 @987654323 来解决@?现在用我选择的语言试试这个...
      • 查看我的更新答案。一般来说,如果不指定它,我就无法识别“基础”。毕竟,[2,2,3,2] 和 [5,2,2,2] 可以是一个数组,其中 2 在索引 0 处变为 5,2 在索引 1 处变为 2,等等。
      • 我明白了。我想那时存在固有的歧义。我想我可以通过检查两个输入之间最常见的值来预先计算一个“基数”。当然,这在没有共同值的情况下不起作用,例如[1,2,3] 和 [5,6,7] ==> [3,4,5]
      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多