markdown
二分探索
lecture/information/algorithm/search/二分探索-講義.n.md

二分探索にぶんたんさく

algorithmsearchlecture

導入どうにゅう

二分探索にぶんたんさく最重要さいじゅうようなのは、なかることそのものではなく、1 かい比較ひかく半分はんぶんてられる条件じょうけんっていることです。

その条件じょうけんが、配列はいれつ整列せいれつしていることです。順序じゅんじょがあるからこそ、中央ちゅうおうあたいくらべた結果けっかから、左半分ひだりはんぶん右半分みぎはんぶんのどちらかをまとめて除外じょがいできます。この講義こうぎでは、その論理ろんり不変条件ふへんじょうけんとして整理せいりします。

用語ようご定義ていぎ

まず主役しゅやくになる用語ようごをそろえます。

二分探索にぶんたんさくBinary search とは、整列済せいれつずみの配列はいれつで、探索範囲たんさくはんい半分はんぶんずつせばめながら目標値もくひょうちさが方法ほうほうです。

整列済せいれつずsorted とは、A0[PARSE ERROR: Undefined("Command(\"le\")")]A1[PARSE ERROR: Undefined("Command(\"le\")")][PARSE ERROR: Undefined("Command(\"dots\")")][PARSE ERROR: Undefined("Command(\"le\")")]An-1つことです。

探索区間たんさくくかんsearch interval は、まだ x があるかもしれない範囲はんいです。この講義こうぎでは [l,r)使つかい、候補こうほAl,Al+1,[PARSE ERROR: Undefined("Command(\"dots\")")],Ar-1 とします。

中央ちゅうおうmiddle添字そえじm=l+r2 とします。

不変条件ふへんじょうけんinvariant とは、反復はんぷく各段階かくだんかいでずっとたもたれる条件じょうけんです。

方針ほうしん

二分探索にぶんたんさくでは、まず「もし x存在そんざいするなら、かなら探索区間たんさくくかん [l,r)なかにある」という不変条件ふへんじょうけんてます。

つぎに中央ちゅうおう Amxくらべます。配列はいれつ整列済せいれつずみなので、

  • x<Am なら m 以降いこう全部ぜんぶおおきすぎる
  • x>Am なら m 以前いぜん全部ぜんぶちいさすぎる

えます。つまり、中央ちゅうおう理由りゆうは「半分はんぶんてる証拠しょうこるため」です。

導出どうしゅつ

1. 探索区間たんさくくかんをどうつか

最初さいしょは、もし x存在そんざいするなら配列はいれつ全体ぜんたいのどこかにあります。したがって初期状態しょきじょうたいl=0,r=n として、候補こうほ[0,n) にします。

このときの不変条件ふへんじょうけんは、

[PARSE ERROR: Undefined("Command(\"boxed\")")]もしxが存在するなら、その位置は常に[l,r)の中にある

です。

2. 中央ちゅうおうとの比較ひかくなにてられるか

m=l+r2 として Amます。

まず Am=x なら、その探索たんさく成功せいこうです。

つぎに x<Am場合ばあいかんがえます。配列はいれつ整列済せいれつずみなので、Am,Am+1,[PARSE ERROR: Undefined("Command(\"dots\")")],Ar-1 はどれも Am 以上いじょうです。したがって、これらは x にはなりえません。よって候補こうほ[l,m) だけにしぼれます。つまり r=m としてよいです。

反対はんたいx>Am なら、Al,Al+1,[PARSE ERROR: Undefined("Command(\"dots\")")],Am はどれも Am 以下いかです。したがって、これらは x にはなりえません。よって候補こうほ[m+1,r)しぼれます。つまり l=m+1 としてよいです。

どちらの場合ばあいも、不変条件ふへんじょうけんたもたれたまま、探索区間たんさくくかんながr-lちぢみます。

3. なぜかならわるのか

Am=x でないかぎり、探索区間たんさくくかん[l,m) または [m+1,r)わります。どちらももと[l,r) よりしんみじか区間くかんです。

したがって r-l反復はんぷくのたびにります。よって有限回ゆうげんかいでかならず l=r になり、探索区間たんさくくかんからになります。このときは x存在そんざいしないと結論けつろんできます。

4. 計算量けいさんりょう

探索区間たんさくくかんながさは、おおむね 1 かいごとに半分はんぶんになります。したがって、n 候補こうほを 1 までしぼるのに必要ひつよう回数かいすうはおよそ log2n かいです。

よって二分探索にぶんたんさく計算量けいさんりょうO(logn) です。

どこまでつか

二分探索にぶんたんさく使つかえるのは、配列はいれつ探索対象たんさくたいしょう順序じゅんじょがあり、その順序じゅんじょ使つかって「こちらがわ全部ぜんぶ不可能ふかのう」とえるときです。

したがって、整列せいれつしていない配列はいれつにはそのままでは使つかえません。また、比較ひかく結果けっかから半分はんぶんてられない問題もんだいにも使つかえません。

つまり、前提条件ぜんていじょうけん線形探索せんけいたんさくよりつよいですが、そのわりに計算量けいさんりょうO(logn) までがります。

見分みわかた

  • 比較ひかく結果けっかだけで、ある範囲はんいをまとめて不可能ふかのうにできるなら、二分探索にぶんたんさくうたがいます。
  • 配列はいれつ整列せいれつしている、あるいは「単調たんちょう真偽しんぎわる」構造こうぞうがあるなら、半分はんぶんてられる可能性かのうせいがあります。
  • 順序じゅんじょはあるが、比較ひかくしてもどちらがわ全部ぜんぶててよいかえないなら、二分探索にぶんたんさくではなくべつ方法ほうほうかんがえます。

最終形さいしゅうけい

整列済せいれつず配列はいれつたいして、候補こうほ半開区間はんかいくかん [l,r)ちます。

  • 初期値しょきち[l,r)=[0,n) です。
  • 中央ちゅうおう m=l+r2ります。
  • Am=x なら成功せいこうです。
  • x<Am なら r=m にします。
  • x>Am なら l=m+1 にします。
  • l=r になったら「存在そんざいしない」と結論けつろんします。

したがって二分探索にぶんたんさく

[PARSE ERROR: Undefined("Command(\"boxed\")")]整列によって不可能な半分を捨て続ける探索

であり、計算量けいさんりょう[PARSE ERROR: Undefined("Command(\"boxed\")")]O(logn) です。

一言ひとことでいうと

  • 中央ちゅうおうるのは、中央ちゅうおう特別とくべつだからではなく、半分はんぶんてる根拠こんきょやすいからです。
  • 本体ほんたいは、「もし x があるなら [l,r)なかにある」という不変条件ふへんじょうけんです。
  • 整列せいれつという前提条件ぜんていじょうけん使つかって候補集合こうほしゅうごう半分はんぶんずつけずる、それが二分探索にぶんたんさくです。

関連かんれんリンク

data/lecture/information/algorithm/search/線形探索-講義.n.md
raw .n.md をコピー
loc をコピー (filepath:line ~ line)
copy share link
path をコピー
copy share link
copy share link
タブを全て閉じる