Skip to main content
AI EducademyAIEducademy
🌳

AI基礎

🌱
AI Seeds(種)

実社会で役立つAIリテラシー

🌿
AI Sprouts(芽)

インテリジェントシステムを支える基礎

🌳
AI Branches(枝)

今日のAIの実力を活かして作る

🏕️
AI Canopy(樹冠)

信頼できる生成AIシステムを設計する

🌲
AI Forest(森)

責任あるかたちでAIプロダクトを世に出す

🔨

AIマスタリー

✏️
AI Sketch(スケッチ)

AIを作る人のためのエンジニアリング基礎

🪨
AI Chisel(鑿)

より難しい問題を解くためのパターン

⚒️
AI Craft(制作)

AIをスケールさせるシステムを設計する

💎
AI Polish(磨き上げ)

AI時代に伝え、導く

🏆
AI Masterpiece(傑作)

あなたの本番AIキャップストーン

🚀

キャリア準備

🚀
面接ローンチパッド

AIエンジニアリングの求人市場を切り拓く

🌟
行動面接マスター

自分がどう成果を生み出すのかを語る

💻
技術面接

プレッシャーの中で解き、設計し、伝える

🤖
AI・ML面接

最新のMLと生成AIの面接に備える

🏆
オファーとその先

自信を持って、納得のうえで次の一歩を踏み出す

全プログラムを見る→

ラボ

7つの実験がロード済み
🧠ニューラルネットワーク プレイグラウンド🤖AIか人間か?💬プロンプトラボ🎨画像生成😊感情分析ツール💡チャットボットビルダー⚖️倫理シミュレーター
🎯模擬面接ラボへ入る→
ジャーニーブログ
🎯
概要

すべての人にAI教育をアクセス可能にする

❓
よくある質問

よくある質問への回答

🧰
AI ツール

私たちが使い、おすすめする厳選ツール

✉️
お問い合わせ

お気軽にご連絡ください

⭐
オープンソース

GitHubで公開開発

料金
始める
AI EducademyAIEducademy

© 2026 AI Educademy. 無断転載を禁じます。

学ぶ

  • プログラム
  • レッスン
  • ラボ
  • AIスターターキット
  • 料金

コミュニティ

  • GitHub
  • 貢献する
  • 行動規範
  • 概要
  • よくある質問

サポート

  • コーヒーをおごる ☕
  • 利用規約
  • プライバシーポリシー
  • お問い合わせ
  • Sitemap
AI & エンジニアリング プログラム›🪨 AI Chisel(鑿)›レッスン›2 つのポインターとスライディング ウィンドウ - AI がデータを効率的にスキャンする方法
👆
AI Chisel(鑿) • 中級⏱️ 15 分で読める

2 つのポインターとスライディング ウィンドウ - AI がデータを効率的にスキャンする方法

🤖

このレッスンは日本語に自動翻訳されたもので、まだ人によるチェックを受けていません。表現に違和感がある場合は、英語の原文が正となります。

スマートなスキャンが重要な理由

AI がライブ ビデオ フィードで不審なアクティビティを監視していると想像してください。録画全体を毎秒再視聴することはできません。ストリーム全体に注意を向けるウィンドウをスライドさせて、十分なコンテキストを追跡する必要があります。これはまさに 2 つのポインター と スライディング ウィンドウ パターンが順次データに対して行うことです。

どちらの手法も、総当たりの O(n²) スキャンをエレガントな O(n) パスに変換します。

配列の両端から集まる 2 つのポインターと、データ ストリームを移動するスライディング ウィンドウ
2 つのポインターは検索スペースを縮小します。スライディング ウィンドウにより、実行中のビューが維持されます。

ツーポインターテクニック

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
10のレッスン10%完了
←プログラムに戻る
続ける: ツリーと二分探索 - AI がどのように迅速な意思決定を行うか→

ディスカッション

サインイン してディスカッションに参加

このレッスンの修正を提案する

各ステップでは、ウィンドウに入る新しい要素が追加され、ウィンドウから出ていく要素が減算されます (移動ごとに 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
🤯
Apache Flink などのストリーミング分析プラットフォームは、スライディング ウィンドウとタンブリング ウィンドウをファーストクラスのプリミティブとして使用します。同じ概念が 1 秒あたり数百万のイベントに拡張されます。

実際の AI アプリケーション

|パターン | AI の使用例 | |-----------|-----------| |固定ウィンドウ |最後の k 個のセンサー読み取り値にわたる異常検出 | |変数ウィンドウ |すべてのクエリキーワードを含む最短のテキスト範囲を見つける (検索エンジン) | |収束するポインター |ソートされた埋め込み次元での効率的な最近傍チェック | |同方向ポインタ |複数の検索モデルからのソート結果リストのマージ |

🤔
Think about it:音声アシスタントはウェイク ワードを検出するために最後の 3 秒間の音声をバッファリングします。これは固定ウィンドウと可変ウィンドウのどちらのパターンですか?ウェイク ワードがバッファより長い場合はどうなりますか?

いつどれを使用するか

  • 2 つのポインター (収束): ソートされた入力、ペア/トリプレット検索、回文チェック。
  • 2 つのポインター (同じ方向): インプレース変更、高速/低速ランナーの問題。
  • 固定スライディング ウィンドウ: 既知のウィンドウ サイズを超えて集約されます。
  • 可変スライディング ウィンドウ: 条件を満たす最小または最大のウィンドウを見つけます。
🧠クイックチェック

合計が指定された値を超える最小の部分配列を見つけるには、どのパターンを選択しますか?

🤔
Think about it:2 つのポインターとスライディング ウィンドウを組み合わせることはできますか?データのローリング ウィンドウ内でペアを見つける必要がある問題について考えてください。たとえば、5 分のウィンドウ内で重複トランザクションを検出するなどです。

重要なポイント

  1. 2 つのポインターは、順序付けまたは分割を利用してネストされたループを排除します。
  2. スライディング ウィンドウは実行状態を維持するため、各要素は最大 2 回処理されます。
  3. どちらのパターンも、異常検出から検索ランキングに至るまで、リアルタイム AI パイプラインの基礎となります。
🧠クイックチェック

ブルートフォースの入れ子ループを 2 ポインターまたはスライディング ウィンドウ ソリューションに変換することによって達成される一般的な時間計算量はどれくらいですか?