バイナリ合計プレフィックス (C++ バージョン)

1、2点

二分探索は、順序付けされた配列内のターゲット値を迅速に見つけることができる一般的な検索アルゴリズムです。二分探索の基本的な考え方は、順序付き配列の場合、検索対象の値が target であると仮定して、毎回配列の中間位置 Mid を見つけて、target と nums[mid] を比較することです。 if target が nums[mid] 未満の場合は配列の左半分の検索を続行し、それ以外の場合は配列の右半分の検索を続行します。

二分探索の実装では、次の問題に注意する必要があります。

  1. 境界条件: 配列の左右の境界に関して特別な判断を行う必要があります。そうしないと、配列の添字の範囲外の問題が発生する可能性があります。
  2. ループ条件:通常、左ポインタと右ポインタを使用して検索します。ループ条件は、左 <= 右です。左 > 右の場合、検索は終了します。
  3. 中間位置の計算: 一般に、左 + (右 - 左) / 2 の方法が中間位置の計算に使用され、オーバーフローの問題を回避できます。
  4. 比較演算: target が nums[mid] に等しい場合、ターゲット値を見つけて Mid を返します。target が nums[mid] より小さい場合、左半分、つまり右 = Mid - 1 を検索します。それ以外の場合は、左半分を検索します。右半分、つまり左 = 中央 + 1。

以下は、順序付けされた配列 nums でターゲット値 target を見つけるための単純な C++ コード実装です。
 

int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

 このアルゴリズムの時間計算量は O(log n) (n は配列の長さ)、空間計算量は O(1) です。二分探索は、順序付けされた配列の探索問題を解決するためによく使用されます。たとえば、LeetCode の「回転ソートされた配列の探索」や「2 次元行列の探索」などの問題は、二分探索を使用して解決できます。

2. プレフィックス

プレフィックスは、最初の文字で始まる文字列の連続する部分文字列を指します。たとえば、文字列「hello」には、「h」、「he」、「hel」、および「hell」という接頭辞が付けられます。文字列処理では、プレフィックス合計、プレフィックス最大値などのプレフィックス関連のアルゴリズムがよく使用されます。

Prefix sum は、配列内の prefix 要素を順番に追加して得られる新しい配列を指し、通常、特定の範囲の要素の合計を高速に計算するために使用されます。配列 nums を例にとると、そのプレフィックスと配列 prefix_sum は次のコードで計算できます。
 

vector<int> prefix_sum(nums.size() + 1, 0);
for (int i = 1; i <= nums.size(); i++) {
    prefix_sum[i] = prefix_sum[i - 1] + nums[i - 1];
}

プレフィックス合計配列を計算した後、prefix_sum[j+1] - prefix_sum[i] を使用して、nums[i...j] の要素合計をすばやく計算できます。ここで、i と j は区間の左右の境界です。 。

プレフィックス アルゴリズムは、要素の合計、最大値、最小値など、間隔に関連する統計を迅速に計算するために使用できる非常に一般的な文字列アルゴリズムです。実際のプログラミングでは、プレフィックス アルゴリズムを習得することは、コード効率を向上させ、プログラムのパフォーマンスを最適化するのに非常に役立ちます。

おすすめ

転載: blog.csdn.net/DonFred/article/details/129995097