質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

4回答

6086閲覧

【基本情報技術者】2分探索法

ai5

総合スコア40

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2017/03/03 05:22

基本情報技術者試験

2分探索法
・データ領域の中央値で比較し、探索範囲を絞りこみ、目的のデータを探し出す。
・データは、昇順もしくは降順に整列されてなければならない。
・データがN件のとき、「き」は何回目で見つかるか?

|1|2|3||4|5|6|7|8|
|:--|:--:|--:|
|あ|い|う|え|お|か|き|く|

【答え】3回目

公式ーーーーーーーーーーーーーーーーーーーーーー
平均比較回数:log2乗N回
最大比較回数:log2乗N+1回

2x≦N<2x+1
ーーーーーーーーーーーーーーーーーーーーーーーー

上記の公式をどう使えば答えの3回目が見つかるかよくわからないため、
ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/03/03 05:51

logについている2は2乗ではなく、対数の「底」です。
ai5

2017/03/13 08:22

対数の「底」とはどういう意味ですか?初歩的な質問申し訳ないです。。。
swordone

2017/03/13 10:39

log2_Nの2は、本来的logの右下に小さく表記されるものです。これは「2を何乗したらNになるか」ということを表し、その「何乗」がかかる数を底と呼びます。
ai5

2017/03/14 01:01

そういうことだったんですね。ありがとうございます。
guest

回答4

0

公式で求めることができるのはあくまで「平均比較回数」と「最大比較回数」です。
この問題の場合はデータと値および検索する値も提示されているので公式で求めることはできません。

・データがN件のとき、「き」は何回目で見つかるか?

これ問題そのままでしょうか?回答が出ないです。
「データーが8件の以下の場合」ではないでしょうか?

12345678

以下のとおり3回です
0. 1~8の半分4の値より小さい
0. 5(4+1)+8の半分6の値より小さい
0. 7(6+1)+8の半分7の値と同じ


もし問題文が

・データが8件のとき、「き」は平均何回目で見つかるか?

なら公式平均比較回数log2Nを使用してN=8なのでlog2 8=3と求まります。

投稿2017/03/03 05:45

編集2017/03/03 06:22
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜかと言われれば、二分木探索とは、1回の探索で範囲を半分に絞り込むからです。
元のデータ個数が N として、探索回数が
1回: N/2
2回: N/4 (N/2 /2)
3回: N/8 (N/2 /2 /2)

n回: N/(2^n)
となりますから、最悪でも 2^n >= N となる n までの回数で探索が完了(対象個数が1以下になる)します。これを数学的に表現すると、log2N となります。
今回の場合、N=8 ですから、 log2 * 8 = 0.301 *8 = 2.408 なので、切り上げて 3 が答えです。
※平均試行回数でいうと切り上げずに 2.4 回がそのまま解になります

投稿2017/03/03 05:58

編集2017/03/03 06:03
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/03/04 01:08

log2Nの2は対数の底なのに、いつの間にか常用対数の真数になってる…
guest

0

1〜8にデータがあり、N=8です。
探したい対象はきで、s="き"とします。

1

二分探索は、まず名前の通りデータを二分します。
範囲は1〜8なので
(1+8)/2 = 4 ※切り捨て

データから、4番目の"え"と"き"を比較すると、"き"のほうが大きいです。

つまり、sはデータの5〜8にあることがわかります。

2

更に範囲内の中央を取るために平均を取ります。
(8+5)/2 = 6

6番目の"か"と"き"を比較すると、"き"のほうが大きいです。

sはデータの7〜8にあることがわかります。

3

同様に
(7+8)/2 = 7

7番目の"き"と"き"を比較すると、等しいです。
sはデータの7番。探索終了です。


  • なぜ、データがより上(または下)にあることがひとつのデータをみただけでわかるのか?

二分探索はデータが整列済みであることを前提としているからです。

  • 公式は使わないのか?

例えば"き"を探すときは最大でも平均でもない比較回数(1回)になります。
回数が最大か平均かを判断できない場合は公式は無意味です。

投稿2017/03/03 05:46

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai5

2017/03/13 08:35

お返事遅くなり申し訳ありません。 ものすごくわかりやすい解説かと存じますが、私の理解が追い付いてないです。。。 以下質問です。 1 二分探索は、まず名前の通りデータを二分します。 範囲は1〜8なので (1+8)/2 = 4 ※切り捨て →データは8個しかないのになんで1+8なんですか? また、なんで切り捨てするのでしょうか? データから、4番目の"え"と"き"を比較すると、"き"のほうが大きいです。 つまり、sはデータの5〜8にあることがわかります。 2 更に範囲内の中央を取るために平均を取ります。 (8+5)/2 = 6 2では更に範囲内の中央を取るために平均を取ります。と書いてあるのですが、 1の計算は平均を取ってるものではなかったのですか?
swordone

2017/03/13 10:27

横から失礼。 1.要は、「真ん中」を知りたいのです。1〜8の真ん中は、並べてみると 12345678 の真ん中ですから、4と5の間になります。これを数値的に、(1+8)/2としています。 この答えは4.5と出ますが、配列の番号として使う以上、整数にする必要があります。切り上げでも切り捨てでもいいのですが、一般的にコンピュータでの整数の除算は余り切り捨てで出るため、切り捨てを採用しています。 2.これも、5〜8の「真ん中」を知りたいのです。説明は同じなので省略。
intelf___

2017/03/13 14:10

swordoneさん的確な回答ありがとうございます >1の計算は平均を取ってるものではなかったのですか? 平均を取ってます。公式にするなら、 (範囲の下限+範囲の上限)/2 で平均が取れます。最初は1~8なので、これを代入して (1+8)/2 としたわけです。 8/2でもいいですが、それをすると2回目以降で同じ公式が使えなくなるので避けました。
swordone

2017/03/13 16:15

最近調べてて知ったのですが、この「足して2で割る」という方法は間違った方法(数値が大きいとオーバーフローを起こす)で、一時期多くの実装で間違っていたそうです。Javaでは1998~2006まで間違っていたとのこと(Wikipedia-二分探索より)。 正しい実装はこの例でいうと1+(8-1)/2とのこと。「最小値に区間の半分を足す」という方法ですね。
intelf___

2017/03/13 18:06

left+(right-left)/2 ってことですかね 文章題ではオーバーフローは起きえないので本題とはずれている気もしますが、勉強になります。
ai5

2017/03/14 00:56

皆様理解が進みました。ありがとうございました。
guest

0

回答としてはこちらのホームページをご覧ください

https://oshiete.goo.ne.jp/qa/3092132.html

投稿2017/03/03 05:36

dekky0910

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問