このレッスンは日本語に自動翻訳されたもので、まだ人によるチェックを受けていません。表現に違和感がある場合は、英語の原文が正となります。
AI がライブ ビデオ フィードで不審なアクティビティを監視していると想像してください。録画全体を毎秒再視聴することはできません。ストリーム全体に注意を向けるウィンドウをスライドさせて、十分なコンテキストを追跡する必要があります。これはまさに 2 つのポインター と スライディング ウィンドウ パターンが順次データに対して行うことです。
どちらの手法も、総当たりの O(n²) スキャンをエレガントな O(n) パスに変換します。
2 つの参照をシーケンスに配置し、ルールに従って移動します。味は大きく分けて2つあります。
それぞれの端から 1 つのポインターを開始し、それらを内側に移動します。 並べ替えられたデータに最適です。
古典的な問題 - ペアの合計: ソートされた配列を指定して、ターゲットに加算する 2 つの数値を見つけます。
function pairSum(arr, target):
left = 0
right = arr.length - 1
while left < right:
sum = arr[left] + arr[right]
if sum == target: return (left, right)
if sum < target: left += 1
else: right -= 1
return null
配列はソートされているため、leftを右に移動すると合計が増加し、rightを左に移動すると合計が減少します。これにより、有効なペアを見逃さないことが保証されます。
どちらのポインタも前に進みますが、速度が異なります。 パーティション化またはサイクル検出に役立ちます。
例 - 重複をその場で削除します。 遅いポインタは書き込み位置をマークします。高速ポインターは前方をスキャンします。
function removeDuplicates(arr):
slow = 0
for fast in 1..arr.length - 1:
if arr[fast] != arr[slow]:
slow += 1
arr[slow] = arr[fast]
return slow + 1
ソートされた配列の収束 2 ポインター手法では、現在の合計がターゲットより小さい場合はどうすればよいでしょうか?
スライディング ウィンドウは、サイズ k (固定) または可変長の連続したサブシーケンスを維持し、最初から再計算するのではなく、集計を段階的に更新します。
正確に k 個の要素のウィンドウを配列全体にスライドさせます。
例 - k 個の連続する要素の最大合計:
function maxSubarraySum(arr, k):
windowSum = sum(arr[0..k-1])
best = windowSum
for i in k..arr.length - 1:
windowSum += arr[i] - arr[i - k]
best = max(best, windowSum)
return best
サインイン してディスカッションに参加
各ステップでは、ウィンドウに入る新しい要素が追加され、ウィンドウから出ていく要素が減算されます (移動ごとに O(1))。
ウィンドウを拡大してさらに多くのデータを含め、制約に違反した場合はウィンドウを縮小します。
例 - 繰り返し文字を含まない最長の部分文字列:
function longestUnique(s):
seen = {}
left = 0
best = 0
for right in 0..s.length - 1:
if s[right] in seen and seen[s[right]] >= left:
left = seen[s[right]] + 1
seen[s[right]] = right
best = max(best, right - left + 1)
return best
|パターン | AI の使用例 | |-----------|-----------| |固定ウィンドウ |最後の k 個のセンサー読み取り値にわたる異常検出 | |変数ウィンドウ |すべてのクエリキーワードを含む最短のテキスト範囲を見つける (検索エンジン) | |収束するポインター |ソートされた埋め込み次元での効率的な最近傍チェック | |同方向ポインタ |複数の検索モデルからのソート結果リストのマージ |
合計が指定された値を超える最小の部分配列を見つけるには、どのパターンを選択しますか?
ブルートフォースの入れ子ループを 2 ポインターまたはスライディング ウィンドウ ソリューションに変換することによって達成される一般的な時間計算量はどれくらいですか?