{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/python-heap/",
    "result": {"data":{"markdownRemark":{"html":"<h1 id=\"implementing-a-heap-in-python\" style=\"position:relative;\"><a href=\"#implementing-a-heap-in-python\" aria-label=\"implementing a heap in python permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing a Heap in Python</h1>\n<p>In this post, we're going to implement a heap data structure from scratch in Python.</p>\n<p>Along the way, we'll learn why heaps are useful, how they are represented internally, and how Python's <code class=\"language-text\">heapq</code> module works under the hood.</p>\n<p>We'll also leverage the Python Data Model to make our implementation behave like a native Python collection.</p>\n<h2 id=\"prerequisites\" style=\"position:relative;\"><a href=\"#prerequisites\" aria-label=\"prerequisites permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>PREREQUISITES</h2>\n<ul>\n<li>Familiarity with Python</li>\n<li>Basic understanding of lists</li>\n<li>Some Programming Knowledge</li>\n</ul>\n<h2 id=\"goals\" style=\"position:relative;\"><a href=\"#goals\" aria-label=\"goals permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Goals</h2>\n<ul>\n<li>Implement a Min Heap from scratch</li>\n<li>Understand heap operations</li>\n<li>Learn why heaps are efficient</li>\n<li>Explore priority queues</li>\n<li>Use the Python Data Model</li>\n</ul>\n<hr>\n<h1 id=\"what-is-a-heap\" style=\"position:relative;\"><a href=\"#what-is-a-heap\" aria-label=\"what is a heap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is a Heap?</h1>\n<p>A heap is a specialized tree-based data structure that satisfies the <strong>Heap Property</strong>.</p>\n<p>In a <strong>Min Heap</strong>, every parent node is smaller than or equal to its children.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">        2\n      /   \\\n     4     5\n    / \\   /\n   8  10 7</code></pre></div>\n<p>Notice that:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">2 &lt;= 4, 5\n4 &lt;= 8, 10\n5 &lt;= 7</code></pre></div>\n<p>The smallest element is always at the root.</p>\n<p>This allows heaps to efficiently support operations like:</p>\n<ul>\n<li>Finding the minimum element</li>\n<li>Inserting new elements</li>\n<li>Removing the minimum element</li>\n<li>Priority queues</li>\n<li>Task scheduling</li>\n<li>Graph algorithms</li>\n</ul>\n<hr>\n<h1 id=\"a-heap-is-actually-just-a-list\" style=\"position:relative;\"><a href=\"#a-heap-is-actually-just-a-list\" aria-label=\"a heap is actually just a list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Heap is Actually Just a List</h1>\n<p>While heaps are typically drawn as trees, most implementations store them inside an array.</p>\n<p>For example:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">        2\n      /   \\\n     4     5\n    / \\   /\n   8  10 7</code></pre></div>\n<p>Can be stored as:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>This works because the position of every node determines the position of its children.</p>\n<p>For a node at index <code class=\"language-text\">i</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">left_child  <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> i <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\nright_child <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> i <span class=\"token operator\">+</span> <span class=\"token number\">2</span>\nparent      <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token number\">2</span></code></pre></div>\n<p>Let's visualize that.</p>\n<div class=\"mermaid\">graph TD\n    A[\"0 : 2\"]\n    B[\"1 : 4\"]\n    C[\"2 : 5\"]\n    D[\"3 : 8\"]\n    E[\"4 : 10\"]\n    F[\"5 : 7\"]\n\n    A --> B\n    A --> C\n    B --> D\n    B --> E\n    C --> F</div>\n<p>Pretty neat.</p>\n<p>No node objects required.</p>\n<hr>\n<h1 id=\"the-heap-class\" style=\"position:relative;\"><a href=\"#the-heap-class\" aria-label=\"the heap class permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Heap Class</h1>\n<p>Let's create a simple heap.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Heap</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>data <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Creating a heap:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> h <span class=\"token operator\">=</span> Heap<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>data\n<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Nothing exciting yet.</p>\n<p>Let's start inserting values.</p>\n<hr>\n<h1 id=\"inserting-values\" style=\"position:relative;\"><a href=\"#inserting-values\" aria-label=\"inserting values permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Inserting Values</h1>\n<p>Suppose we insert:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token number\">10</span></code></pre></div>\n<p>The heap becomes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Easy enough.</p>\n<p>Now let's insert:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token number\">5</span></code></pre></div>\n<p>Our array becomes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>But there's a problem.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">10\n/\n5</code></pre></div>\n<p>The heap property has been violated.</p>\n<p>The parent is larger than the child.</p>\n<p>We need to fix it.</p>\n<hr>\n<h1 id=\"bubble-up\" style=\"position:relative;\"><a href=\"#bubble-up\" aria-label=\"bubble up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bubble Up</h1>\n<p>When a new element is inserted, we place it at the end of the array and repeatedly swap it with its parent until the heap property is restored.</p>\n<p>This process is called <strong>Bubble Up</strong> (sometimes called Sift Up).</p>\n<div class=\"mermaid\">graph TD\n    A[\"10\"]\n    B[\"5\"]\n\n    A --> B</div>\n<p>Swap:</p>\n<div class=\"mermaid\">graph TD\n    A[\"5\"]\n    B[\"10\"]\n\n    A --> B</div>\n<p>The result:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Let's implement it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">_bubble_up</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">while</span> index <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n\n        parent <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>index <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token number\">2</span>\n\n        <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>parent<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n\n            self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>parent<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>\n                self        self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span>\n            <span class=\"token punctuation\">)</span>\n\n            index <span class=\"token operator\">=</span> parent\n\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">break</span></code></pre></div>\n<p>Now insertion becomes:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">push</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span>\n    self<span class=\"token punctuation\">.</span>_bubble_up<span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Let's test it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>data\n\n<span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Much better.</p>\n<hr>\n<h1 id=\"building-a-heap\" style=\"position:relative;\"><a href=\"#building-a-heap\" aria-label=\"building a heap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Building a Heap</h1>\n<p>Let's insert several values.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">15</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">20</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">7</span><span class=\"token punctuation\">)</span>\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token number\">12</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The resulting heap looks like:</p>\n<div class=\"mermaid\">graph TD\n    A[\"3\"]\n    B[\"7\"]\n    C[\"5\"]\n    D[\"20\"]\n    E[\"15\"]\n    F[\"12\"]\n\n    A --> B\n    A --> C\n    B --> D\n    B --> E\n    C --> F</div>\n<p>Notice that the smallest value naturally rises to the top.</p>\n<hr>\n<h1 id=\"finding-the-minimum\" style=\"position:relative;\"><a href=\"#finding-the-minimum\" aria-label=\"finding the minimum permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Finding the Minimum</h1>\n<p>This is the easiest heap operation.</p>\n<p>The minimum element is always:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Let's expose that.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">peek</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>peek<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">3</span></code></pre></div>\n<p>Constant time.</p>\n<p>No searching required.</p>\n<hr>\n<h1 id=\"removing-the-minimum\" style=\"position:relative;\"><a href=\"#removing-the-minimum\" aria-label=\"removing the minimum permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Removing the Minimum</h1>\n<p>Here's where things get interesting.</p>\n<p>Suppose we remove:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">3</code></pre></div>\n<p>from this heap:</p>\n<div class=\"mermaid\">graph TD\n    A[\"3\"]\n    B[\"7\"]\n    C[\"5\"]\n    D[\"20\"]\n    E[\"15\"]\n    F[\"12\"]\n\n    A --> B\n    A --> C\n    B --> D\n    B --> E\n    C --> F</div>\n<p>The last element takes the root position:</p>\n<div class=\"mermaid\">graph TD\n    A[\"12\"]\n    B[\"7\"]\n    C[\"5\"]\n    D[\"20\"]\n    E[\"15\"]\n\n    A --> B\n    A --> C\n    B --> D\n    B --> E</div>\n<p>Now the heap property is broken.</p>\n<p>We need another balancing operation.</p>\n<hr>\n<h1 id=\"bubble-down\" style=\"position:relative;\"><a href=\"#bubble-down\" aria-label=\"bubble down permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bubble Down</h1>\n<p>This time we repeatedly swap the root with its smaller child.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">12\n/ \\\n7  5</code></pre></div>\n<p>The smaller child is:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">5</code></pre></div>\n<p>Swap them.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">5\n/ \\\n7 12</code></pre></div>\n<p>Heap property restored.</p>\n<p>Let's implement that.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">_bubble_down</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> index<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    size <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">while</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">:</span>\n\n        smallest <span class=\"token operator\">=</span> index\n\n        left <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> index <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n        right <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> index <span class=\"token operator\">+</span> <span class=\"token number\">2</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n            left <span class=\"token operator\">&lt;</span> size <span class=\"token keyword\">and</span>\n            self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>left<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>smallest<span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            smallest <span class=\"token operator\">=</span> left\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n            right <span class=\"token operator\">&lt;</span> size <span class=\"token keyword\">and</span>\n            self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>right<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>smallest<span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            smallest <span class=\"token operator\">=</span> right\n\n        <span class=\"token keyword\">if</span> smallest <span class=\"token operator\">==</span> index<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">break</span>\n\n        self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>smallest<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>\n            self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>smallest<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span>index<span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">)</span>\n\n        index <span class=\"token operator\">=</span> smallest</code></pre></div>\n<hr>\n<h1 id=\"implementing-pop\" style=\"position:relative;\"><a href=\"#implementing-pop\" aria-label=\"implementing pop permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing Pop</h1>\n<p>Now we can remove the smallest value.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">pop</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">raise</span> IndexError<span class=\"token punctuation\">(</span><span class=\"token string\">\"Heap is empty\"</span><span class=\"token punctuation\">)</span>\n\n    minimum <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n\n    last <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> last\n        self<span class=\"token punctuation\">.</span>_bubble_down<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> minimum</code></pre></div>\n<p>Let's try it.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">3</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">5</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> h<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token number\">7</span></code></pre></div>\n<p>Interesting.</p>\n<p>The values are coming out in sorted order.</p>\n<hr>\n<h1 id=\"why-does-heap-sort-work\" style=\"position:relative;\"><a href=\"#why-does-heap-sort-work\" aria-label=\"why does heap sort work permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Does Heap Sort Work?</h1>\n<p>Let's repeatedly remove elements.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> values <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token keyword\">while</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>     values<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> values\n\n<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>We accidentally discovered Heap Sort.</p>\n<p>The heap is continuously maintaining the smallest element at the root.</p>\n<p>Every removal gives us the next smallest value.</p>\n<hr>\n<h1 id=\"implementing-__len__\" style=\"position:relative;\"><a href=\"#implementing-__len__\" aria-label=\"implementing __len__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__len__</code></h1>\n<p>Just like our Linked List implementation, we can integrate with Python's built-in functions.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__len__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span>\n<span class=\"token number\">6</span></code></pre></div>\n<p>Very Pythonic.</p>\n<hr>\n<h1 id=\"implementing-__contains__\" style=\"position:relative;\"><a href=\"#implementing-__contains__\" aria-label=\"implementing __contains__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__contains__</code></h1>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__contains__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> value <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>data</code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token number\">15</span> <span class=\"token keyword\">in</span> h\n<span class=\"token boolean\">True</span>\n\n<span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token number\">99</span> <span class=\"token keyword\">in</span> h\n<span class=\"token boolean\">False</span></code></pre></div>\n<hr>\n<h1 id=\"implementing-__iter__\" style=\"position:relative;\"><a href=\"#implementing-__iter__\" aria-label=\"implementing __iter__ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Implementing <code class=\"language-text\">__iter__</code></h1>\n<p>Let's allow iteration.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">__iter__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">yield</span> <span class=\"token keyword\">from</span> self<span class=\"token punctuation\">.</span>data</code></pre></div>\n<p>Now:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> <span class=\"token keyword\">for</span> value <span class=\"token keyword\">in</span> h<span class=\"token punctuation\">:</span>\n<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>     <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span></code></pre></div>\n<p>works exactly as expected.</p>\n<hr>\n<h1 id=\"priority-queues\" style=\"position:relative;\"><a href=\"#priority-queues\" aria-label=\"priority queues permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Priority Queues</h1>\n<p>One of the most common uses of a heap is a priority queue.</p>\n<p>Suppose we have tasks:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Production Outage\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Customer Escalation\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Update Documentation\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Smaller numbers indicate higher priority.</p>\n<p>We push them into the heap.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">heap<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Production Outage\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nheap<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Customer Escalation\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nheap<span class=\"token punctuation\">.</span>push<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Update Documentation\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Removing elements gives:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> heap<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Production Outage\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The most important task always comes first.</p>\n<p>This pattern appears everywhere:</p>\n<ul>\n<li>Operating systems</li>\n<li>Job schedulers</li>\n<li>Network routers</li>\n<li>Search algorithms</li>\n<li>Game engines</li>\n</ul>\n<hr>\n<h1 id=\"how-pythons-heapq-works\" style=\"position:relative;\"><a href=\"#how-pythons-heapq-works\" aria-label=\"how pythons heapq works permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Python's <code class=\"language-text\">heapq</code> Works</h1>\n<p>Python's built-in implementation uses exactly the same ideas.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> heapq\n\nnumbers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\nheapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\nheapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span>\nheapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">,</span> <span class=\"token number\">20</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The smallest element remains at the front.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> heapq<span class=\"token punctuation\">.</span>heappop<span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">)</span>\n\n<span class=\"token number\">5</span></code></pre></div>\n<p>No magic involved.</p>\n<p>Just clever use of arrays and a couple of balancing operations.</p>\n<hr>\n<h1 id=\"time-complexity\" style=\"position:relative;\"><a href=\"#time-complexity\" aria-label=\"time complexity permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Time Complexity</h1>\n<table>\n<thead>\n<tr>\n<th>Operation</th>\n<th>Complexity</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Peek</td>\n<td>O(1)</td>\n</tr>\n<tr>\n<td>Insert</td>\n<td>O(log n)</td>\n</tr>\n<tr>\n<td>Remove Min</td>\n<td>O(log n)</td>\n</tr>\n<tr>\n<td>Search</td>\n<td>O(n)</td>\n</tr>\n<tr>\n<td>Build Heap</td>\n<td>O(n)</td>\n</tr>\n</tbody>\n</table>\n<p>The logarithmic insert and removal operations make heaps ideal for priority queues.</p>\n<hr>\n<h1 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h1>\n<p>At this point we've implemented:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">push<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\npop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\npeek<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n__len__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n__contains__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n__iter__<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>All while storing the heap inside a simple Python list.</p>\n<p>The real lesson isn't just building a heap.</p>\n<p>It's understanding how a relatively simple structure can support efficient operations that power real-world systems like task schedulers, graph algorithms, and operating systems.</p>\n<p>Once you understand:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Bubble Up\nBubble Down\nParent Index\nChild Index</code></pre></div>\n<p>the entire heap data structure becomes surprisingly straightforward.</p>\n<p>That's it folks!</p>","excerpt":"Implementing a Heap in Python In this post, we're going to implement a heap data structure from scratch in Python. Along the way, we'll…","fields":{"slug":"/python-heap/"},"frontmatter":{"title":"Heap in Python","date":"November 23, 2025","tags":["Python"],"categories":["Highlight","Python"],"description":"Implement a heap in Python","comments_off":false,"thumbnail":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADTElEQVQ4y62U32tbZRjH80fojXZbfpyTnPP+OEnTJEu7xDQN6ZqWtGnSNs7ClMwfeDMojrmCMKWbU1ejsyqj6uKFRYUhTLyqUGcZXggDQZzghaAXFvSiigxU3D6SkzSkth0qXjy87/O8vN/n99ejlKIjUiKldO+GEHhtG59td2xb553E0600P2ilMIXggXiMy/kcT6cOufZ/ArYDsAkWkpJ02OG7UhGqU9yqVjgxkMRnC5z/AmhIScHR/FLI81OpyJ/jY5xPxPCKfwG4lY7WLVBLSurRCBu5DGv9CdJSYimF036/U/qe7oJbQYGSCqkVAcvitTPPMXK4gM80CTsaMyixbOk63gvUjdC2Wo8DQxG0o5CiKYK33n6HyXIF0zAJWZrhrGYgqTBMuWekHikkkajm+OtZzl8bZW55CB2x2dezj0tvNhgbLXDX3fey+FQvf3wVY+OzPmYrTgt0l0g9IUOQr/Zx4foY9WtFXvw8z9mLT3BxqcHVT9ZZWbnMhcVn+e3LNLe/icHGQT6+FGG/VxJ2dklZWJLEoGbuvRSnVzPMvT/AxOwwM5UjlMtlZqarlCZKfLEShRsKbjgsPak54Jc4zh41tEKCzHicU8sPki0nCPhN/AE/hhEgaATw+UwGkxafNkosnx5ECQutdGeMutNuNcW26XMiLL3wCvFwL3Zz5hwHqTV+KTG0oscb4JmFl7l/9hHu8fpcu1+IbVvWAtQaO2iQqdSYf/c62ZnHXF0oTa9SLKRT1LMZek2Dev0ljtZqFGyLN3JDPJ48SFD8rSkiZBLPjXPsys/UVuHhj27SPzLNAcPnfqJagZkKV/I5Xl1u8PzJeb4eybtreXN6kloiTqBrizzC9BGfPs7RVXj0w00eWoP+Iyfw+nq4mh3k96kSm6Ui309OcPbcIo2T8/w6dpgfpya5VSqykIixXwjCnRpKgYz0kT6zxugHt0mfW8eJJjGEzbGww7epJD+k+zkVcfBaFsq2WYlH2cwcYj0Z5772quptu2yHkNpBp0dRTtjVm3ZTSlJKkVWKYPuT3W7AsFJElXTZaVtTWhfdIteQQTPipr7FjSHZojTdzZttZ0LtJAvP9jnSHW+yi9J012h0mGmXGdzBh/+H/AU0ybul6zgNGwAAAABJRU5ErkJggg==","width":150,"height":150,"src":"/static/2f09907c40dc42fcfb059056336ea5ad/92ab1/heap.png","srcSet":"/static/2f09907c40dc42fcfb059056336ea5ad/92ab1/heap.png 1x,\n/static/2f09907c40dc42fcfb059056336ea5ad/668a7/heap.png 1.5x,\n/static/2f09907c40dc42fcfb059056336ea5ad/56e34/heap.png 2x"}}}}}},"pageContext":{"slug":"/python-heap/","previous":{"id":"087dbd34-3805-535e-8065-c7821b1a37da","frontmatter":{"title":"Python Idioms","tags":["Python"],"categories":["Highlight","Python"],"template":"post"},"fields":{"slug":"/python-idioms/"}},"next":{"id":"b2df600b-944a-5bb9-86ed-3118b169f6ba","frontmatter":{"title":"Graphs in Python","tags":["Python"],"categories":["Highlight","Python"],"template":"post"},"fields":{"slug":"/python-graphs/"}}}},
    "staticQueryHashes": []}