2017-02-21 7 views
2

この種の問題の名前があるかどうかはわかりませんが、解決策はそれほど多くないので、私ができることはできる限り最善の方法で記述しようとしています。値が変化する2つの配列間の補間

[5:その後、アレイ内の値に変更している

[0、0、3、0]

は考えIは、次の状態の配列を有します、0、0、0]

のは、と新しい状態C古い状態を呼ぶことにしましょう。我々は、その2つの中間的な形を表す状態Bを見つけたいと思っています。

私が実際に中間形式にしたいのは、[0、4、0、0]です。この3つのフェーズのすべての状態変化は、位置と値を変更しているものの動きを表します。 [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]

問題の一部は、問題の定義に問題があります。どのような結果を入力したいのかはっきりしていますが、正確な言語を使用して入力の結果を記述することはできません。

私は問題をよりよく表現できるように、入力の結果を記述する正しい方法は何ですか?

そして、最終的には、私が後にしているものを生み出すアルゴリズムがありますか?

答えて

0

これは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

これは私の例のように未変更の値がすべて0である場合に機能しますが、例えば[2,2,3,2]と[5,2,2,2]は[2,4,2,2]を生成するはずです...もしif e1!= 0を変更することで解決できるか、 e2!= 0'を 'if e1!= e2'に変更しますか?私の選択した言語でこれを試してみてください... – Joey

+0

私の更新された答えを見てください。一般的に、私はそれを指定することなく "ベース"を特定する方法がありません。結局のところ、[2,2,3,2]と[5,2,2,2]は、2がインデックス0で5になり、2がインデックス1で2になる配列になる可能性があります。 – BallpointBen

+0

です。私はそこに本質的なあいまいさがあると思います。私は2つの入力間の最も一般的な値を調べることによって、「ベース」をあらかじめ計算することができると思います。もちろん、これは共通の値がない場合には機能しません。 [1,2,3]および[5,6,7] ==> [3,4,5] – Joey

0

私は「明確な状況」(可能なベクトル状態を)持っていませんが、私は、入力ベクトルに2つの要素がゼロより大きいある場合、それが唯一の2つのケースであることができることを仮定します:

A)は、i == J
B)は、i == J + 2(または一般的に:(iはJ + 1)%2 = 0

I:V2の要素のインデックス:V1
j内の要素のインデックス

この場合、この擬似コードはg所望の結果:

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は、「補間された」値を持つベクトルです。 これはあなたが提示した場合にはうまくいくはずです。私はそう望みます:)