【備忘録】二分探索

python3
あくまで備忘録なんで雑に記録します

検索対象に何を持ってくるか?

IndexNumでやる(インデックスナンバー)※要素が複数あると、rightなら先頭の要素、leftなら末尾の要素、のインデックスを返す
return をhighやlowやm
要素→indexは遅いのに、「要素をバイナリサーチ」をdef化してindexを組み込んでしまった失敗あり

左端と右端をlowとhighに指定

(low = -1 / high = n+1 とかにして失敗あり、out of range)
low = 0 / high = len(List)-1 に合わせる

①完全一致

whileで、追い越しまで続けるright – left > 0(left:1 m:1 high:2で終了すると4が検索できない)

if x == mで return m
elif mより上?or下? high = m-1 (low = m+1)を繰り返し、
抜けたら return 無かったです

②曖昧一致

whileで、最後の隣同士 high – low > 1で終了(left:1 m:1 high:2)
(隣同士で終わらないと永遠に続く(例x=9))
if mより上?or下? high = m (low = m)を繰り返し、
抜けたら return high(low)

サンプル

#完全一致
def binary_search(numbers, value):
    left, right = 0, len(numbers) - 1
    while right - left > 0:
        mid = (left + right) // 2
        if numbers[mid] == value:
            return mid
        elif numbers[mid] < value:
            left = mid + 1
        else:
            right = mid - 1
    return "無かったです"
#あいまい
def binary_search(numbers, value):
    left, right = 0, len(numbers) - 1
    while right - left > 1:
        mid = (left + right) // 2
        if numbers[mid] < value:
            left = mid
        else:
            right = mid
    return right
#A = [2, 3, 3, 4, 4, 5]で4をサーチ(return right)-->3
#A = [2, 3, 3, 4, 4, 5]で4をサーチ(return left)-->2
#再帰
def binary_search(numbers, value):
    def _binary_search(numbers, value, left, right):
        if left > right:
            return -1

        mid = (left + right) // 2
        if numbers[mid] == value:
            return mid
        elif numbers[mid] < value:
            return _binary_search(numbers, value, mid + 1, right)
        else:
            return _binary_search(numbers, value, left, mid - 1)

    return _binary_search(numbers, value, 0, len(numbers) - 1)

コメント

"+r+""+h+""+">"}var c,i=n(45),u=n(74),f=n(64),s=n(53),p=n(76),l=n(41),y=(n=n(52),"prototype"),h="script",v=n("IE_PROTO"),g=function(){try{c=new ActiveXObject("htmlfile")}catch(r){}var r;g="undefined"==typeof document||document.domain&&c?function(r){r.write(a("")),r.close();var t=r.parentWindow.Object;return r=null,t}(c):((r=l("iframe")).style.display="none",p.appendChild(r),r.src=String("javascript:"),(r=r.contentWindow.document).open(),r.write(a("document.F=Object")),r.close(),r.F);for(var t=f.length;t--;)delete g[y][f[t]];return g()};s[v]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(o[y]=i(t),n=new o,o[y]=null,n[v]=t):n=g(),e===r?n:u.f(n,e)}},function(r,t,e){var n=e(5),o=e(44),a=e(43),c=e(45),i=e(11),u=e(75);t.f=n&&!o?Object.defineProperties:function(r,t){c(r);for(var e,n=i(t),o=u(t),f=o.length,s=0;s=t||56320!=(64512&i(r,e))))return!1}return!0}})},function(r,t,e){var n=e(91),o=String;r.exports=function(r){if("Symbol"===n(r))throw new TypeError("Cannot convert a Symbol value to a string");return o(r)}},function(r,t,e){var n=e(2),o=e(7),a=e(13),c=e(15),i=e(102),u=(e=e(6),Array),f=a("".charAt),s=a("".charCodeAt),p=a([].join),l="".toWellFormed,y=l&&e((function(){return"1"!==o(l,1)}));n({target:"String",proto:!0,forced:y},{toWellFormed:function(){var r=i(c(this));if(y)return o(l,r);for(var t=r.length,e=u(t),n=0;n
タイトルとURLをコピーしました