• ベストアンサー

部分和問題がわかりません。

部分和問題がわかりません。 [問題] n個の整数が配列Aに格納されていて、整数xの値を与えたときに、 A[i] + A[j] = x となるi,jが存在するかどうかを判定する、なるべく効率のよいアルゴリズムを示せ。 この問題は部分和問題のため、NP完全問題なので、総当たりのO(n^2)より効率のいい方法がないと思うのですが、もっと効率のよい方法が存在するのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.2

フォントによっては見難いですが アイ と ジェー ですね. 与えられた命題にこっそり隠されているヒント(条件)を見つけましょう ポイントは (1) "整数"と条件があること. 負数は含まれません. (2) "加算"のみであること. A[i] > x ならどんな整数を加算しても条件を満たしません. 付け加えるならば, (3) "存在するかどうかを判定する"のみで要素番号を示す必要はありません. 以上から ・配列Aをソートし配列aとする. ※ポイント(3) ・二分探索を用いてa[k] < xを満たすkを探す. ※ポイント(2) ・二分探索を用いてa[l] < x - a[k] を満たすlを探す ・HITしたら処理終了 ※ポイント(3) もっと良いアルゴリズムもあるかもしれませんが、 ざっくりとO(n^2)よりO(log2n)を使える状態にしたほうが効率は良いでしょう. さらに正解に近づけるためにはソートに掛かるコストも算出し, 処理効率が切り替わるnの値も出す必要があるでしょう.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

いかにもレポートや宿題のように見えるのであまり詳しい話は避けているのですが、自然数だけだと勘違いをしていましたので、補足です。 A[i]が自然数という前提なら、x個のバケツを用意すれば一回なめるだけでOKです。 A[i]が整数でも、自然数に変換してからバケツを用意すれば同じアルゴリズムが使えますので、これまたO(n)です。 ただ、メモリが確保出来るとは限らないので、実際はこの手段は取れません。ツリーかハッシュテーブルを作ることになります。 ハッシュテーブルの探索挿入は一応O(1)と言われているので、(やや回りくどいですが)これまた O(n) と言えないこともないでしょう。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

まずこの問題は「部分和問題」ではありません. そして, 「NP完全問題なので、総当たりのO(n^2)より効率のいい方法がないと思う」も間違い. NP完全なら O(n^2) はありえないし, NP完全であっても「総当たりより効率のいい方法がない」とも限りません. さておき, 今は加えるのが 2個に限定されてますから, A[i] + A[j] = x iff (A[i]+M) + (A[j]+M) = x+2M です. つまり, A[i] は全て正と仮定してもかまいません>#3. あと, ソートしたあとは O(n) でできます. どうせソートしてるので O(n log n) であることに変わりありませんが. 全体で O(n) は無理な気がするけどどう示すんだろう?

全文を見る
すると、全ての回答が全文表示されます。
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.3

ど勘違いしてました. 整数ですので負数が含まれますね. 手順はさほど変わりませんが負数をケアする必要があります ・配列Aをソートし配列aとする. ・最小値a[k]を二分探索. ・a[k]が負数の場合, a[l] > a[k]となるlを二分探索. ・a[k]が整数の場合, a[l] < x - a[k] となるlを二分探索. お恥ずかしい・・・

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

二つの合計だけを判定するなら、x個のバケツを用意して順次突っ込んでいけば、O(n)で済むように思えますね。 問題としては、 A[i] == A[j] となる組み合わせを探すアルゴリズムを答えよ と変わりないですよね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 部分和問題について

    部分和問題の問題例と、その問題の動的計画法に基づくアルゴリズムによる解を1つ教えて頂きたいです。

  • 高校数学 整数問題

    nは2以上の自然数とする。 (1) n個の自然数 x(1),x(2),…,x(n)のどれもnで割り切れないとき、 x(j)-x(i) (1≦i<j≦n) がnの倍数となる2つの自然数i,jが存在することを示せ。 (2) n個の自然数 a(1),a(2),…,a(n)からなる集合をSとする。Sの空でない部分集合で、その要素の和がnで割り切れるものが存在することを示せ。 (2)について、 (ア)a(1),a(2),…a(n)のうち少なくとも1つnで割り切れるものが存在する場合 と、 (イ)a(1),a(2)…a(n)がすべてnで割り切れない場合 に分けて、(イ)で(1)を利用すると思うのですが、どのように(1)を使えばよいのでしょうか?

  • m個の数字をn個のグループに分けるとき、

    m個の数字をn個のグループに分けるとき、 各グループの和s(i) ,(1<=i<=n) が、指定した比 r(0):r(1): ・・・ :r(n-1):r(n) ( = s(0):s(1): ・・・ :s(n-1):s(n) ) に一番近くなるようなグループ分けを導けるアルゴリズムはありますか。 例えば、{1, 3, 4, 6}を和の比が1:2に一番近くなるように2つのグループに分けると、 {1, 4}, {3, 6} となります。(もし違ってたら指摘してください) アルゴリズムでなくても、こうしたら良いんじゃないか、という考えがありましたら 教えてください。 総当たりで調べる場合はどのようにすれば、効率良く調べられるかという点もお願いします。 よろしくお願いします。

  • 和の集まりを一括して,ひとつの数式で表示する表現方

    X(i)とY(j)を正の整数とします.次の和の集まり X(i)+Y(j) があるとします. X(i)+Y(j), i=1,2,...,p.   (pは正の整数) j=1,2,...,q.   (qは正の整数) このとき,W(i,j)を W(i,j)=X(i)+Y(j), i=1,2,...,p, j=1,2,...,q, と書いたとすれば,W(i,j)は,pq個あるすべての和:X(i)+Y(j)を表している事になりますか? この場合,曖昧な点や,瑕疵はありませんか? また,上記の和 X(i)+Y(j),すなわち, X(1)+Y(1),X(1)+Y(2),・・・,X(1)+Y(q), X(2)+Y(1),X(2)+Y(2),・・・,X(2)+Y(q), ・・・・・・・・・・, X(p)+Y(1),X(p)+Y(2),・・・,X(p)+Y(q), を,一括して表現する既存の数学分野での数学的な表示方法は存在しますか? 存在するとすれば,名称は何ですか? 以上,教えて下さい.よろしくお願いします.

  • 証明

    a,bを整数とするときZ次の2つの条件(i),(ii)について(i)と(ii)は同値であることを証明する問題です。 (i) a,bはお互いに素である。すなわち、aとbの最大公約数は1である。 (ii) ax(0)+by(0)=1となる2つの整数x(0),y(0)が存在する。 という問題です。 参考書の答えに Zを整数の集合とし J={}ax+by|x,y∈z} とおく 定義からJは和と整数倍について閉じている a∈J,b∈J と書いてるのですがよく分かりません。 考え方など教えて貰えたら嬉しいです

  • 倍数の和の問題

    子供に聞かれたのですが、いろいろやってみても解けず、困っています。どうか分かり易く教えてください。 (問題) 2つの整数A,Bがあります。Aの倍数とBの倍数の和を求めていろいろな整数を作ります。このときどちらか一方の倍数だけでもよいものとします。すると、70より小さい整数の中には作れないものがありますが、70以上の整数は全て作れます。整数A,Bの組合せとして考えられるものを全て答えなさい。

  • 因数分解と部分分数の和に関する問題

    因数分解と部分分数の和に関する問題 f(x)=x^5-3x^4+5x^3-5x^2+3x-1の時、(1)因数分解せよ (2)(x^3-3x+3)/f(x)を部分分数の和に分解せよ。という問題です。(1)については、f(1)=0より、f(x)=(x-1)(x^4-2x^3+3x^2-2x+1)に因数分解できるのですが、さらに因数分解できるのでしょうか? (2)については、部分分数の和に分解するポイントはどうすれば良いのでしょうか?すみませんが、よろしくお願いします。

  • 数Iで全然解けない問題が2つあって困ってます 助けて^^;

    全然解けない問題があって困ってます^^; 1つ目は・・。 和が6である2つの数があり、それらの平方の和は32である。この2数を求めよ。 で、答えには3+√7、3-√7になっているのですが、 何度やっても3+√11、3-√11になってしまいます^^; (教科書に解説がありませんorz) 解と係数の関係を使って頑張って色々解いたのですが・・ 2つ目は・・。 不等式4-x≦3x≦2x+a を満たす整数xがちょうど3つ存在するような定数aの値の範囲を求めよ。 という問題で、こちらは解き方すら全く分かりませんorz どなたか教えてくださいおねがいしますorz

  • 数列の和の問題です。

     以下の2問にお答え願いますでしょうか? かなり時間かけたんですが解答がないんで困ってます。ご協力お願いいたします。    自然数xに対して√xの整数部分をf(x)で表す。 (1)kを自然数とするとき、f(x)=kを満たす自然数xの個数をkを用い て表せ。 (2)nを自然数とするとき、次のn^2個の整数  f(1),f(2),f(3),・・・・・・,f(n^2)の和をnを 用いて表せ。

  • 等差数列の和を利用・・?

    こんにちは。確率(情報量)の問題で分からないものがあるのでお願いします。 問. n個の事象E(i)【i=1~n】の生起確率をP(i)とするとき、 P(1)=a% P(i)=P(i-1)+1% とする。このとき生起確率の和が100%になるためには、最小の整数aとそのときのnをいくらにすればよいか。 【()内の文字、数字は小文字です】 私は、この問題を解くときに、 P1=a P2=a+1 P3=a+2 ・ ・ の関係から、等差数列を使うのかなと思い、初項a公差1で S(n)={n^2+(2a-1)n}/2 これが100%になるときなので、{n^2+(2a-1)n}/2=100という式を立てたのですが、 ここから最小の整数aとその時のnをどう求めていいか分りません。 そもそも数列を使用するべき問題なのかの自信もありません; どなたかご指導お願いいたします。