• 検索結果がありません。

アルゴリズムとデータ構造 補足資料 4-3 「 2 分探索」

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズムとデータ構造 補足資料 4-3 「 2 分探索」"

Copied!
30
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズムとデータ構造 補足資料 4-3

「 2 分探索」

横浜国立大学

理工学部

数物・電子情報系学科

富井尚志

(2)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

あらかじめ「昇順」に整列された配列

(3)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

19 を探せ!

x =

(4)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

i = 0 :左端 j = 9 :右端

19 を探せ!

x =

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(5)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

i = 0 j = 9

k = (i+j)/2 = 4

※ 整数の演算なので 小数点以下切り捨て

:中央

:左端 :右端

19 を探せ!

x =

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(6)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

i = 0 j = 9

k = (i+j)/2 = 4

※ 整数の演算なので 小数点以下切り捨て

:中央

:左端 :右端

19 を探せ!

x =

x > a[k] : 解は右にある!

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(7)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

i = 0 j = 9

k = (i+j)/2 = 4

※ 整数の演算なので 小数点以下切り捨て

:中央

:左端 :右端

19 を探せ!

x =

x > a[k] : 解は右にある!

これより左に解はない:

探索しない

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(8)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 9 k = (i+j)/2 = 4

:右端

19 を探せ!

x =

5

i = k+1 = :左端

右隣

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(9)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 9 :右端

19 を探せ!

x =

i = 5 :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

これより左に解はない:

探索しない

(10)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 9 :右端

19 を探せ!

x =

i = 5 :左端

7

k = (i+j)/2 = :中央

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

これより左に解はない:

探索しない

(11)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 9 :右端

19 を探せ!

x =

i = 5 :左端

7

k = (i+j)/2 = :中央

x < a[k] : 解は左にある!

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(12)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = j-1 = 6 :右端

19 を探せ!

x =

i = 5 :左端

7

k = (i+j)/2 = :中央

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

左隣

これより右に解はない:

探索しない

(13)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 6 :右端

19 を探せ!

x =

i = 5 :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

これより右に解はない:

探索しない

(14)

5 k = (i+j)/2 =

※ 整数の演算なので 小数点以下切り捨て

:中央

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

6

j = :右端

19 を探せ!

x =

i = 5 :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(15)

5 k = (i+j)/2 =

※ 整数の演算なので 小数点以下切り捨て

:中央

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

6

j = :右端

19 を探せ!

x =

i = 5 :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

x > a[k] : 解は右にある!

(16)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

6

j = :右端

19 を探せ!

x =

i = i+1 = 6 :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

右隣

5 k = (i+j)/2 =

※ 整数の演算なので 小数点以下切り捨て

:中央

(17)

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 6 :右端

19 を探せ!

x =

6

i = :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

(18)

6 k = (i+j)/2 =

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 6 :右端

19 を探せ!

x =

6

i = :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

:中央

(19)

6 k = (i+j)/2 =

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 3 5 8 9 16 19 22 54 60

j = 6 :右端

19 を探せ!

x =

6

i = :左端

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

:中央

x == a[k] : ビンゴ!

(20)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

あらかじめ整列された配列の中から求める解があるかどうか探索する

(21)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

(22)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補

(23)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補

(24)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補

解の候補

(25)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補

解の候補

(26)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補 解の候補

解の候補

(27)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補 解の候補

解の候補

(28)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補 解の候補

解の候補 解の候補

(29)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補 解の候補

解の候補 解の候補

(30)

解の候補

2分探索のイメージ: 解の候補を片側「半分」に絞り込む

解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む

n 件のデータ 解

解の候補 解の候補

解の候補

解の候補

log

2

n

O( log n ) (オーダ ろぐエヌ) のアルゴリズム:

n 件のデータに対して、 log n に比例する探索回数で済む→

n が 1,000 件に増えても、探索回数は 10 回程度

n が 1,000,000,000,000 件に増えても、探索回数は 40 回程度

参照

関連したドキュメント

東京大学 大学院情報理工学系研究科 数理情報学専攻. [email protected]

情報理工学研究科 情報・通信工学専攻. 2012/7/12

関東総合通信局 東京電機大学 工学部電気電子工学科 電気通信システム 昭和62年3月以降

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

 当図書室は、専門図書館として数学、応用数学、計算機科学、理論物理学の分野の文

清水 悦郎 国立大学法人東京海洋大学 学術研究院海洋電子機械工学部門 教授 鶴指 眞志 長崎県立大学 地域創造学部実践経済学科 講師 クロサカタツヤ 株式会社企 代表取締役.

静岡大学 静岡キャンパス 静岡大学 浜松キャンパス 静岡県立大学 静岡県立大学短期大学部 東海大学 清水キャンパス

講師:首都大学東京 システムデザイン学部 知能機械システムコース 准教授 三好 洋美先生 芝浦工業大学 システム理工学部 生命科学科 助教 中村