1

私は他のみんなと同じようにこの問題に苦しんでおり、この問題を説明するのに十分な数の投稿があると確信しています. ただし、それを完全に理解するという点では、サブセットサムの問題に関連して、ここにいるすべての偉大な人々から私の考えを共有し、より効率的な解決策を得たいと思いました.

インターネットで検索しましたが、実際には多くの情報源がありますが、完全に理解するために、アルゴリズムを再実装するか、独自のアルゴリズムを見つけたいと思っています.

私が苦労している重要なことは、セットのサイズが大きくなることを考慮した効率です。(制限はありません。概念的に大きいだけです)。私がアイデアを実装しようとしている 2 つのフェーズは、与えられた整数Tに等しい2 つの数値を見つけ、3 つの数値を見つけ、最終的にKの数値を見つけることです。私が持っているいくつかのアイデア;

2 つの整数部分については、基本的に配列O(nlogn)をソートし、配列内の各要素についてその負の値を検索しています。(つまり、配列要素が-3を検索する3の場合)。要素にインデックスを付けるO(1)を提供することで、ハッシュ テーブルを含める方がよいのではないでしょうか?

3 つ以上の整数については、すばらしいブログ投稿を見つけました。ただし、著者自身でさえ、多数には適用できないと述べています。

したがって、サブセットの問題にどのようなアイデアを適用できるかを23 およびそれ以上の整数にしました。大きな入力に対しても効率的な動的計画法を設定するのに苦労しています。

4

1 に答える 1

1

リンク先のブログ投稿は、実際にはかなり見栄えがしました。結局のところ、これはNP完全問題です...

しかし、あなたはそれをさらに高速化できると思います。私はベンチマークを行っていませんが、マトリックスの使用が彼の最大の時間の浪費であると推測します。まず、いくつかの非常に些細な入力 (たとえば、[-1000, 1000] には 2001 列が必要です! 残念!) に膨大な量のメモリが必要になり、各行をスキャンするサイクルが大量に無駄になります。"T"多くの場合、かなりまばらになる sを探します。

代わりに、「セット」データ構造を使用してください。これにより、スペースと反復時間が最小限に抑えられます*が、値も同様に保存されます。セット内にある場合、それは"T"; です。それ以外の場合は、"F".

それが役立つことを願っています!

*: もちろん、「最小」=「小さい」とは限りません。

于 2012-06-09T22:34:37.657 に答える