ビューティフルコードの7章で、この章を読み進む前に2分探索を実装しろと書いてあった。
ということでPythonで実装してみる。
最初に書いたコードはこれ。
PYTHON:
-
def mybinarysearch(a, t, f):
-
n = len(a)
-
if n <= 0:
-
return -1
-
if n == 1:
-
if a[0] == t:
-
return 0
-
else:
-
return -1
-
m = int(n / 2)
-
r = f(t, a[m - 1])
-
if r <= 0:
-
x = mybinarysearch(a[:m], t, f)
-
if x>= 0:
-
return x
-
else:
-
return -1
-
else:
-
x = mybinarysearch(a[m:], t, f)
-
if x>= 0:
-
return m + x
-
else:
-
return -1
配列、検索対象、比較関数を渡す。
さすがにこれだと、いちいちlenを計算していたり効率悪すぎだし、コードも汚いのでもう少しましにする。
PYTHON:
-
def mybinarysearch(a, t, f):
-
def func(array, i, n):
-
if n <= 0:
-
return -1
-
elif n == 1:
-
if f(array[0], t) == 0:
-
return i
-
else:
-
return -1
-
else:
-
m = int(n / 2)
-
if f(t, array[m - 1]) <= 0:
-
return func(array[:m], i, m)
-
else:
-
return func(array[m:], i + m, n - m)
-
return func(a, 0, len(a))
これで、配列中で対象に合致する最小のIndexが返るはず?
最小にこだわらなければこうなるかな
PYTHON:
-
def mybinarysearch(a, t, f):
-
def func(array, i, n):
-
if n <= 0:
-
return -1
-
m = int(n / 2)
-
r = f(t, array[m])
-
if r == 0:
-
return i + m
-
elif r <0:
-
return func(array[:m], i, m)
-
else:
-
return func(array[m + 1:], i + m + 1, n - m - 1)
-
return func(a, 0, len(a))
この章の主題であるテストはまだちゃんとやってない。
これから考えてやってみよう。
再帰で書いてしまったので遅そうだけど、2分探索だったらあふれることはないだろう。
- Newer: [SAStruts]ボタン名とメソッドがうまく紐つかないと思ったけど。。。
- Older: GWに読む本
Comments:1
- 常山日記 08-05-13 (火) 14:59
-
[Python][Mercurial]巡回
第2回 Trac Lightningで簡単インストール wax 0.3.19 Pythonライブラリのインストールパス確認 Python で wave …
Trackbacks:0
- Trackback URL for this entry
- http://blog.joyfullife.jp/archives/2008/05/13023417.php/trackback
- Listed below are links to weblogs that reference
- [Python]2分探索 from 30からのBlog