前提・実現したいこと
二分探索法で中点以外を分割点としたアルゴリズムの計算量を明らかにしようとしています。
今回は中点ではなく、1:2に分ける点を分割点とした二分探索を考えています。
中点を分割点とする二分探索法の計算量はO(log n)
ですが、1:2に分ける点を分割点とした場合はどのようになるのか知りたいです。
発生している問題・エラーメッセージ
やってみたこととして、分割の仕方によって探している値にたどり着くまでに計算する分割点の回数に違いがあるか確認しました。
しかし、探す値が配列のどの位置にあるかによって回数の差の傾向はバラバラで
・中点を分割点とする場合と1:2に分ける点を分割点とする場合の二分探索法どちらが速いのか
・1:2に分ける点を分割点とする二分探索法の計算量の求め方
がわからず困っています。
該当のソースコード
中点を分割点として選ぶ二分探索法
python
1def solution(A, N): 2 lo = 0 3 hi = len(A)-1 4 5 while hi>lo: 6 mid = round((hi+lo)/2) 7 8 if A[mid] == N: 9 return "位置" + str(mid) + "に存在する" 10 11 elif A[mid] >= N: 12 hi = mid -1 13 14 elif A[mid] < N: 15 lo = mid + 1 16 17 return "None"
1:2に分ける点を分割点として選ぶ二分探索法
python
1def solution(A, N): 2 lo = 0 3 hi = len(A)-1 4 5 while hi>lo: 6 point = round(2*lo/3 + hi/3) 7 print('point =' + str(point)) 8 9 if A[point] == N: 10 return "位置" + str(point) + "に存在する" 11 12 elif A[point] >= N: 13 hi = point -1 14 15 elif A[point] < N: 16 lo = point + 1 17 18 return "None"
試したこと
A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
N1 = 9
N2 = 17
とした時のそれぞれの分割点の変遷を確認しました。
中点を分割点としたときは
N1 mid =10 mid =4 mid =7 mid =8 N2 mid =10 mid =16
一方で1:2に分割した時は
N1 point =4 point =7 point =9 N2 point =7 point =12 point =15 point =17
補足情報(FW/ツールのバージョンなど)
python 3.6
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/05/04 04:47