1. ホーム
  2. スクリプト・コラム
  3. パイソン

Python 二項対立型ルックアップのサンプルコード

2022-01-26 13:08:06

検索する要素が多い場合、2分法ルックアップは単純ルックアップよりも高速です。これは2分法ルックアップアルゴリズムの利点ですが、2分法アルゴリズムには欠点もあります。2分法アルゴリズムは順序付きリストのみなので、挿入と削除が非常に困難になります。

<スパン 二分探索は、配列の全要素を探さないという重要な特徴があり、探すデータ量は実際には要素の対数と一致し、通常は毎回半分ずつ減っていく。ですから、二分探索の時間計算量はO(log2n)であることに間違いはありません。もちろん、最良の場合は一度だけ探すことになりますが、最悪かつ一般的な場合は、確かに逐次探索よりはるかに優れています。

質問1:n個の要素を持つ順序付き(昇順)整数配列numsとターゲットが与えられたとき、numsからターゲットを探し、ターゲットが存在すれば添え字を返し、そうでなければ-1を返す関数を書きなさい。
class Solution:
    def search(self,nums:List[int],target:int)->int:
        left=0
        right=len(nums)-1
        while(left<=right):
            mid=(left+right)//2
            if nums[mid]==target:
               return mid
            if nums[mid]<target:
                left=mid+1
            else:
                right=mid-1
        return -1

問2 厳密に減少する配列において、目標値targetより大きい2番目の数値の添え字を求めよ。存在しない場合は-1を返す。 
class Solution:
    def search(self,nums:List[int],target:int)->int:
        left=0
        right=len(nums)-1
        while(left<=right):
            mid=(left+right)//2
            if nums[mid]==target:
               return mid
            if nums[mid]>target:
                left=mid+1
            else:
                right=mid-1
        return -1

質問3:この関数は2つの数値の添え字を長さ2の整数の配列として返す必要があります。数値の添え字は1から数えるので、答えの配列は1 <= answer[0] < answer[1] <= numbers.length を満たす必要があります。各入力は一意な答えにのみ対応し、同じ要素を再利用することはできないと仮定することができる。
class Solution:
     def twoSum(self, numbers: List[int], target: int) -> List[int]:
        for i in range(len(numbers)-1):
            left=i
            right=len(numbers) - 1
            while(left<=right):
                mid=(left+right)//2
                if numbers[mid]+numbers[i]==target:
                    return [i+1,mid+1]
                elif numbers[mid]+numbers[i]<target:
                    left=mid+1
                else:
                    right = mid-1
            return [-1,-1]

概要

python dichotomous lookupの記事はこれで終わりです。もっと関連するpython dichotomous lookupのコンテンツは、Script Houseの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください!今後ともScript Houseをよろしくお願いします。