AIUnlimited
🌳

AI基礎

🌱
AI Seeds(種)

ゼロから始める

🌿
AI Sprouts(芽)

基礎を築く

🌳
AI Branches(枝)

実践に活かす

🏕️
AI Canopy(樹冠)

深く学ぶ

🌲
AI Forest(森)

AIをマスターする

🔨

AIマスタリー

✏️
AI Sketch(スケッチ)

ゼロから始める

🪨
AI Chisel(鑿)

基礎を築く

⚒️
AI Craft(制作)

実践に活かす

💎
AI Polish(磨き上げ)

深く学ぶ

🏆
AI Masterpiece(傑作)

AIをマスターする

📘

AI実践

📖
オープンソースモデルを理解する

オープンソースモデルの基礎とリソース

🎯
問題からモデルタスクへ

ビジネス問題をモデルタスクに変換

⚡
最初のモデルを実行する

30分で最初の結果を見る

🔧
ファインチューニングと評価

モデルをファインチューニングし、パフォーマンスを評価

🚀
アプリケーションシステム

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

🎨
生成AI

オープンソースAIGCモデルを探索

🤖
エージェント

エージェントフレームワークとMCPツールを学ぶ

📐
補足基礎

LLMの基礎と評価

🎓

Claude アカデミー

🤖
Claude 101

Learn AI basics with Claude

💻
Claude Code 101

Code with Claude as your pair programmer

🤝
Introduction to Claude Cowork

Collaborate with Claude on complex projects

⚙️
Claude Platform 101

Build apps with the Claude API

ラボ

7つの実験がロード済み
🧬ニューラルネットワークサンドボックス🤖AI か人間か?🥋プロンプトエンジニアリング道場🏁アルゴリズムレース🧠AIトリビアチャレンジ🏗️システム設計キャンバス
🎯模擬面接ラボへ入る→
🚀

キャリア発展

🚀
面接ローンチパッド

旅を始めよう

🌟
行動面接マスター

ソフトスキルをマスター

💻
技術面接

コーディング面接を突破

🤖
AI・ML面接

ML面接をマスター

🏆
オファーとその先

最高のオファーを獲得

始める
AIUnlimited

MITライセンス

沪ICP备18025655号-11

学ぶ

  • AI基礎
  • AI実践
  • Claude アカデミー
  • ラボ
  • キャリア発展

コミュニティ

  • 概要
  • よくある質問

サポート

  • footer.terms
  • footer.privacy
  • footer.contact
AI & エンジニアリング アカデミックス›✏️ AI Sketch(スケッチ)›レッスン›ヒープと優先度キュー
⛰️
AI Sketch(スケッチ) • 中級⏱️ 18 分で読める

ヒープと優先度キュー

ヒープとは何ですか?

ヒープは、すべての親がヒープ プロパティ、つまり子よりも常に小さい (min-heap) か、常に大きい (max-heap) のいずれかを満たしている完全なバイナリ ツリーです。 「完了」とは、おそらく最後のレベルを除いて、すべてのレベルがいっぱいであることを意味し、左から右に埋められます。

       1            Min-heap
      / \
     3   5
    / \
   7   4

これは完全なので、フラット配列に保存します。ポインターは必要ありません。インデックス i の場合: 左の子 = 2i + 1、右の子 = 2i + 2、親 = (i - 1) // 2。

最小ヒープと最大ヒープ

|プロパティ |最小ヒープ |最大ヒープ | |----------|----------|----------| |ルート |最小要素 |最大の要素 | |親≤子供? | ✅ はい | ❌ いいえ (≧) | |抽出すると |最小 |最大 |

Python の heapq は、デフォルトでは 最小ヒープ です。最大ヒープの場合、挿入時に値を否定し、抽出時に再度否定します。

挿入と抽出 - ステップバイステップ

挿入 - 最後まで押してからバブルアップ (小さいうちに親と入れ替えます):

import heapq
h = [1, 3, 5, 7]
heapq.heappush(h, 2)  # h becomes [1, 2, 5, 7, 3]

最小の抽出 - ルートを最後の要素と交換し、最後にポップし、下に移動 (より小さい子と交換):

smallest = heapq.heappop(h)  # returns 1

木の高さは log n であるため、両方の操作は O(log n) で実行されます。

最小ヒープでの挿入バブルアップと抽出シフトダウンを示す図
泡を上に挿入します。 extract-min はふるいにかけられます。

Heapify - O(n) でヒープを構築する

heapq.heapify(arr) を呼び出すと、リストは O(n log n) ではなく O(n) で インプレース ヒープに変換されます。これはボトムアップで機能し、各非リーフ ノードをふるい分けします。これは、CS における最も驚くべき複雑さの結果の 1 つです。

🤯
ヒープの構築は O(n log n) ではなく、O(n) です。ほとんどのノードは最下位近くにあり、下に選別する必要はほとんどありません。計算は線形時間で計算されます。

優先キューの抽象化

優先キューを使用すると、常に最も優先度の高い項目に最初にアクセスできます。挿入と抽出の両方が O(log n) であるため、ヒープは頼りになる実装です。 「これまでで最高のアイテムをください」というときにいつでも使用してください。

レッスン 6 / 100%完了
←木とグラフの視覚化

ディスカッション

ログイン ディスカッションに参加

パターン: トップ K の問題

import heapq
def top_k(nums, k):
    return heapq.nlargest(k, nums)
🧠クイックチェック

You need the 5 largest scores from 1 million entries.ヒープのタイプとサイズは何ですか?

Lower half (max-heap): [1, 2, 3]  ← max = 3
Upper half (min-heap): [4, 5, 6]  ← min = 4
Median = (3 + 4) / 2 = 3.5
🧠クイックチェック

スケジュールの問題

ヒープは、会議室 (最も早い終了時刻を追跡)、クールダウンのあるタスクのスケジューリング、または CPU ジョブ キューなどのスケジューリングで威力を発揮します。重要な洞察は、ヒープが「次に何が終了するか」を効率的に追跡するということです。

🤔
Think about it:最小値と最大値の両方を効率的に必要とする場合、単一のヒープでは対応できません。どのようなデータ構造の組み合わせを使用しますか?

ヒープ、ソートされた配列、BST を使用する場合

|必要 |最良の選択 |なぜ | |------|---------------|-----| |最小/最大抽出の繰り返し |ヒープ | O(log n) 挿入 + 抽出 | |静的データ、ワンタイムソート |ソートされた配列 | O(n log n) 回、O(1) アクセス | |範囲クエリ + 注文統計 |バランスBST |すべてに対して O(log n) | |ストリームからの Top-K |サイズ K のヒープ | O(n log k) 合計 |

🧠クイックチェック

最小ヒープ内で O(1) となるのはどの操作ですか?

複雑さに関するチートシート

|操作 |時間 | |-----------|------| |挿入 | O(log n) | |最小/最大を抽出 | O(log n) | |ピークの最小値/最大値 |お(1) | |ヒープファイ | O(n) | | n 個の項目から上位 K 個 | O(n log k) |

🤔
Think about it:ヒープが配列に格納されているにもかかわらず、ヒープ上で二分検索を実行できないのはなぜですか?ヒープ プロパティが実際にどのような並べ替え順序を保証しているかを考えてください。

📚 続きを読む

  • NeetCode - ヒープ / 優先キュー - ヒープ問題をグループ化した視覚的な問題ロードマップ
  • 技術面接ハンドブック - ヒープ - 簡潔なパターンとヒント]
  • Python heapq docs - 例付きの公式モジュール リファレンス