- ベストアンサー
最小回数で応答を得るには
- 送信側が得られる受信の情報は、関数ask(・)から返される値である。
- 送信側は、受信側4人それぞれの情報を獲得したい。
- 送信側は最小何回で受信側A~Dのそれぞれの情報を知ることができるか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
関数ASK(*)がORで値を返すかぎり、複数に問い合わせるなら人数分以上の回数聞く必要があると思いますし、不定(決まらない)ことが起こります。 例示されているシーケンスだと1回目(全員に聞く)は、2回目以降に影響を与えないため不要と思われますが、例示の問い合わせだけではA~Dの送信を確認できていません。 例えば、2回目はAB両者がYESではなくA,BまたはABがYESです。例えばAがNO(A=0、B=1、C=1、D=1)でも例示の方法では全てYESが帰ってきます。(AorB=1、CorD=1、BorC=1,AorD=1) このケースでは、A以外が1のためORで複数に聞くとAの送信内容が判りません。 同様にA=C=0、B=D=1でもAC以外の組み合わせではORは全て1が帰ってきます。 したがって、効率的な検索方法以前に関数ASK_AND(*)のようなANDで値を返すものを合わせて用意する必要があると思います。(複数同時に聞くという条件を満たすため) 以下、AND/ORが実装されたとした場合・・・・ もし、一人ずつ聞くより同じか少ない回数でA~Dの状態をOR等の関数を使うことで知ることができるか?ということならできないと思います。(ANDとORの回答がまとめて1回で聞けても個別情報を分離するのに人数より多い回数を必要としそうです) ABCDが1010のケースだと 1)AB:AND=0,OR=1 2)BC:AND=0、OR=1 3)CD:AND=0、OR=1 4)AD:AND=0、OR=1 5)AC:AND=1、OR=1 A=C=1が確定 6)BD:AND=0、OR=0 B=D=0が確定 BDという問い合わせとACという問い合わせの組み合わせがあるまで確定できない 3つ以上合わせて聞いても全てが同じという幸運を期待するもので無い限り、回数を減らすためとしては聞く意味がないと思われます。 例えば上記の例で、どの3つの組み合わせの問い合わせを入れても任意の2つ以上の問い合わせと交換することができない(等価ではない)です。(例えば、ABCという問い合わせと#5,#6と入れ替えられない。ABCD=0101でもABCD=1010と同じ返り値) 以上は、普遍的に100%判別するのに必要な最小問い合わせ数(最悪のケース)の話であって、現実の運用では聞く順番を入れ替えるとそれより少ない回数でできることもあります。上記の例だと#5,#6と2回聞けば答えがわかります。(YES,NOが3つ有るようなケースだと3回、全てYESかNOなら2回)これらを考慮しても平均は大体4回ちょっとになりそうですね。
その他の回答 (4)
- stomachman
- ベストアンサー率57% (1014/1775)
A,B,C,Dの答がYESなのかNOなのかを(1=YES, 0=NOとして)<Aの答 Bの答 Cの答 Dの答>と表しますと、 <0000> <0001> <0010> ... <1111> の16通りあります。また質問の仕方を(N1 N2 N3 N4)で表しますと、これは (0001) (0010) ... (1111) の15通り。 16通りの答がどれも同じ確率p=1/16で生じると仮定すると、そのうちの一つが選ばれるという事象の持つ情報量は、どの答が実現した場合でも4 Shannonです(4 = -log p ただしlogの底は2)。また、質問の仕方をどう工夫しても、YESかNOかの1bitしか出力がないのだから、1回の質問で得られる情報量は1 Shannon以下です。(情報量が1 Shannonになるのは、YESとNOがどちらも確率1/2になるように質問を選んだ場合。)質問回数をnとすれば、得られる情報量はn Shannon以下ということです。 なので、「16通りの答がどれも同じ確率で生じる」という仮定の下では、どんなに上手に質問しても、質問回数の期待値を4未満にすることは不可能です。 一方、16通りの答が生じる確率に偏りがある場合には、情報量の平均値 -Σp[j] log p[j] (logの底は2、Σはj=<0000>~<1111>についての総和) が4未満になりますから、質問の仕方を工夫することで質問回数の期待値を4未満にできる可能性があります。 ところで、<1111>, <0111>, <1011>, <1101>, <1110> の5つがどれも発生確率p>0である場合、質問回数は4以下になりません。なぜなら、<1111>と<0111>を比べてみると、質問(1000)に対しては出力が違いますが、他のどんな質問に対しても出力が同じになります。だから、<1111>と<0111>を区別するためにはどうしても質問(1000)をする必要があります。同様に <1111>と<1011>を区別するためには質問(0100) <1111>と<1101>を区別するためには質問(0010) <1111>と<1110>を区別するためには質問(0001) が必要です。言い換えれば「<1111>ではない」と断言するだけのために、少なくとも4回の質問(1000)(0100)(0010)(0001)が不可欠です。
- nag0720
- ベストアンサー率58% (1093/1860)
#2、#3で指摘されているとおり、OR情報だけでは4人の情報を確定することはできません。 では、#3さんの提案したORとANDの両方を受信できるとした場合はどうかというと、 「初回は4人全員に聞くものとする」という条件のもとでは最大5回、その条件がなければ最大4回で十分です。 考え方は、 例えばA=1,B=0,C=1,D=0のケースを単に1010と書くことにすると、 4人の状態は、0000,0001,0010,0011,0100,・・・・,1111の16通りあります。 一方、質問の仕方は、個別質問を除くと11通りあり、 受信のパターンは、OR=0,AND=0、OR=1,AND=0、OR=1,AND=1の3通りあります(OR=0,AND=1はありえない)。 初回に4人全員に聞くと、 OR=0,AND=0 → 0000 OR=1,AND=0 → 0001,0010,0011,・・・,1110 の14通り OR=1,AND=1 → 1111 のケースに分かれます。 最悪の回答を想定してOR=1,AND=0となった場合、2回目の質問の対象をABにすると、 OR=0,AND=0 → 0001,0010,0011 OR=1,AND=0 → 0100,0101,0110,0111,1000,1001,1011,1011 OR=1,AND=1 → 1100,1101,1110 同様に最悪の回答を想定してOR=1,AND=0となった場合、3回目の質問の対象をCDにすると、 OR=0,AND=0 → 0100,1000 OR=1,AND=0 → 0101,0110,1001,1011 OR=1,AND=1 → 1100,1011 というように常に最悪の回答になった場合のケース数が少なくなるように質問していけば5回で確定できます。 初回に4人全員に聞くという条件がなければ4回で十分です。 5人以上の場合でも、人数分の回数で確定できるでしょう。 1回の質問でORかANDの片方しか受信できないとした場合は、初回に4人全員に聞くという条件があっても8回で確定できます。
- gohtraw
- ベストアンサー率54% (1630/2965)
だれか一人がNOの場合(例えばAとします)でも 全員⇒出力は1 AとB⇒BはYESなので出力は1 CとD⇒出力は1 BとC⇒出力は1 AとD⇒DはYESなので出力は1 となるので全員YESの場合と区別できません。
- Cupper-2
- ベストアンサー率29% (1342/4565)
最小回数ですか。 1回 入力:N1=1,N2=1,N3=1,N4=1 出力:0 返事がない。まるで屍のようだ…以上! こんなケースも考える必要があります。