アレイ識別論理

0K、ここでそれは問題です、私は可能な限り明確にしようとします。

So, we have an array of key-value pairs in the form unique id => number.

pseudo code array A= array(0 => 17, 1 => 26, 2 => 17, 3 => 2, 4 => 7, 5 => 8);

数字の合計が60であることがわかります。これは常に正しいため、配列内の合計は常に正しいです。

now we have array B in array B, also unique id => value pairs, BUT here some of the values are PHONY/INCORRECT, and total(array B)-total(array A) has to be 0.

i.e. for the upper example array A= array(6 => 22, 7 => 11, 8 => 8, 9 => 9, 10 => 5, 11 => 10, 12 => 7, 13 => 17, 14 => 10);

現在、配列Bの合計は99です。60-99 = -39です。つまり、配列Bから39に等しい数のすべての組み合わせを見つける必要があります。この場合、@ eyeを見るだけで、これの唯一の2つの組み合わせに見えますユニークなids 10,12,13,14が正しくないか、10,11,12,13がPHONY/INCORRECT(5 + 7 + 17 + 10 = 39)である可能性があります。このような小さな配列では、これらのループを使用してすべての可能なオプションを繰り返し検索するのは簡単ですが、配列は数千(一意のID)に及んでいます。これを行う最善の方法は何ですか?どのようにコンピュータが偽/不正確なペアを最も速く見つけるか?

また、私は最高の(そして良い)答えを与える人にビールを借りています。

0
これは部分集合和問題です
追加された 著者 Eric,
匿名アカウントの後ろにいる人が私に無料のビールを提供しています。誘惑、しかし...ナ。
追加された 著者 Fred Foo,
配列が大きいほど、「有効な」組み合わせの数が多くなります。物事を確認する前に、私は値で "b"をソートし、その差より大きいすべての値を除外します。
追加された 著者 roselan,

1 答え

配列Bの合計は99です。60-99 = -39。これは、配列Bと等しい39のすべての数の組み合わせを見つける必要があることを意味します。

これは、間違っているすべての数字が0であるべきであることが分かっている場合にのみ当てはまります。

アレイ内の任意の数またはすべての数は、エラー量の合計が39であるような量だけオフになることによってエラーに寄与することができます。

つまり、特定の合計に追加される数字のリストのサブセットを見つける問題は、問題の通常のステートメントはそのようなサブセットの存在を確認するだけですが、あなたはそのようなサブセットのリストを探しています。

大きなセットでは効果的なソリューションが存在するとは思えず、ブルートフォースのソリューションは指数関数的に増加しています。

1
追加された
この場合、指数時間の複雑さは実際にはそれほど難しくないかもしれません。擬似多項式解はO(KN)であり、Kは差(例えば39)である。違いがかなり小さいことが分かっているなら、この解決法はかなり速いかもしれません。そして、より速い解決策を見つけることはできません。
追加された 著者 svick,
通常、そのようなサブセットの数は指数関数的に増加するため、効率が向上します。
追加された 著者 Daniel Fischer,
これは、間違っているすべての数字が0であるべきであることが分かっている場合にのみ当てはまります。 < - これは事実である。数字はこのケースでは部分的に正しいものではなく、まったく間違っているか正しくありません。どのようにこれを行うためのアイデアを持っている(もちろん、ブルートフォースはオプションではない)?
追加された 著者 user1043658,