<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Linh Phạm&#39;s tech blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.licolsan.com/"/>
  <updated>2020-05-23T13:44:30.209Z</updated>
  <id>https://www.licolsan.com/</id>
  
  <author>
    <name>Linh Phạm</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>LRU Cache</title>
    <link href="https://www.licolsan.com/vi/algorithm/lru-cache/"/>
    <id>https://www.licolsan.com/vi/algorithm/lru-cache/</id>
    <published>2020-05-21T17:30:00.000Z</published>
    <updated>2020-05-23T13:44:30.209Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Gioi-thieu"><a href="#Gioi-thieu" class="headerlink" title="Giới thiệu"></a>Giới thiệu</h1><p>Vào một ngày đẹp trời, bạn nảy ra ý tưởng là sẽ làm bánh để tặng người yêu, à không, 1 người bạn thân 😂. Vì vậy bạn quyết định đi đến nhà hàng, gặp <strong>ông đầu bếp</strong> mà bạn quen, hỏi ông ta về công thức làm món bánh mà bạn ưa thích. Lúc này, ông đầu bếp sẽ đi lấy cuốn sách công thức làm bánh được đặt ở trên <strong>kệ sách</strong>. Sau đó ông ta đặt cuốn sách lên <strong>bàn</strong> và tìm đúng công thức mà bạn cần, rồi chụp hình lại và đưa cho bạn. Cuối cùng thì cuốn sách sẽ được đặt lại vào kệ sách, ở đúng cái chỗ mà nó được lấy ra.</p><p>Ngày qua ngày, ông đầu bếp bắt đầu nhận ra càng có nhiều người cần đến công thức làm bánh của mình. Vì vậy ông ta quyết định đặt luôn cuốn sách trên bàn mà không cần phải đặt lại vào kệ nữa. Như vậy thì sẽ tiết kiệm thời gian của ông hơn. Nhưng ngoài công thức làm bánh ra, ông còn có sách về công thức làm sữa chua, cocktail, … và còn nhiều công thức khác nữa 😅. Cái bàn của ông thì nó không được to, chỉ đủ để 3 cuốn sách mà thôi. Vì vậy, ông chỉ có thể bày ra 3 cuốn sách có công thức mà thường được yêu cầu nhất mà thôi.</p><p>Vâng câu chuyện trên chỉ là 1 câu chuyện mà tôi bịa ra 😄. Nhưng mà nó có liên quan gì đến chủ đề của bài viết nhỉ? Thực ra là có đấy. Trong câu chuyện trên, tôi đã đề cập đến cái <strong>kệ sách</strong>, cái <strong>bàn</strong>, và <strong>ông đầu bếp</strong>. Trong kiến trúc của máy tính cũng như vậy: ông đầu bếp chính là <strong>cpu</strong> của máy tính, cái bàn chính là <strong>memory</strong>, còn cái kệ sách chính là <strong>disk</strong>. Data trên memory sẽ được truy xuất nhanh hơn đối với những data truy xuất từ disk. Nhưng mà bởi vì memory có kích thước nhỏ hơn rất nhiều so với disk, nên memory chỉ có thể cache lại những data thường được truy xuất mà thôi. Và để làm được điều này, Chúng ta sẽ cần 1 thuật toán có tên gọi là LRU <strong>(Least Recently Used)</strong> Cache.</p><h3 id="LRU-cache-duoc-mo-ta-voi-kich-ban-nhu-sau"><a href="#LRU-cache-duoc-mo-ta-voi-kich-ban-nhu-sau" class="headerlink" title="LRU cache được mô tả với kịch bản như sau"></a><strong>LRU cache được mô tả với kịch bản như sau</strong></h3><ul><li>Trong disk lưu giữ 4 công thức làm bánh: <strong>chocolate</strong>, <strong>vanilla</strong>, <strong>strawberry</strong>, <strong>pound</strong>.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__the_icons_list.svg?bust=50" alt="lru-cache/Untitled.png"></p><ul><li>Đâu tiên, 1 user request công thức làm bánh <strong>chocolate</strong>. server đọc data từ disk, lưu vào cache, sau đó trả kết quả về cho user.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__chocolate_cake_recipe_request_response.svg?bust=50" alt="lru-cache/Untitled_01.png"></p><ul><li>Tiếp theo, 1 user khác request công thức làm bánh <strong>vanilla</strong>.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__vanilla_cake_recipe_request_response.svg?bust=50" alt="lru-cache/Untitled%202.png"></p><ul><li>Lúc này, công thức <strong>chocolate</strong> được đẩy lùi xuống phía sau trong cache. Công thức <strong>vanilla</strong> trở thành data được truy xuất mới nhất.</li><li>Sau đó, công thức làm bánh <strong>strawberry</strong> được request.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__strawberry_shortcake_cake_recipe_request_response.svg?bust=50" alt="lru-cache/Untitled%203.png"></p><ul><li>Và thêm 1 lần cho <strong>chocolate</strong>.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__chocolate_cake_recipe_second_request_response.svg?bust=50" alt="lru-cache/Untitled%204.png"></p><ul><li>Và vì <strong>chocolate</strong> đã có trên cache rồi, nên server không cần phải đọc disk nữa. Lúc này chocolate sẽ được đưa lên vị trí đầu tiên, trở thành data được truy xuất mới nhất.</li><li>Tiếp đến, 1 user khác request công thức làm bánh <strong>pound</strong>.</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__pound_cake_recipe_request_response.svg?bust=50" alt="lru-cache/Untitled%205.png"></p><ul><li>Hiện tại thì cache đã đầy, nên cần phải loại bỏ 1 data (được truy xuất ít nhất) là <del>vanilla</del>, và lúc này <strong>pound</strong> được đưa vào vị trí đầu tiên (được truy xuất mới nhất).</li></ul><blockquote><p>Có rất nhiều thuật toán khác để giải quyết cho bài toán full cache. Trong bài viết này, chúng ta tập trung vào LRU bởi vì nó trường được sử dụng trong  coding interview.</p></blockquote><h3 id="LRU-cache-su-dung-2-cau-truc-du-lieu-la"><a href="#LRU-cache-su-dung-2-cau-truc-du-lieu-la" class="headerlink" title="LRU cache sử dụng 2 cấu trúc dữ liệu là"></a><strong>LRU cache sử dụng 2 cấu trúc dữ liệu là</strong></h3><ul><li><strong>Double linked list:</strong> ghi nhận về mức độ truy xuất thường xuyên của các data</li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__most_and_least_recently_used_items.svg?bust=50" alt="lru-cache/Untitled%206.png"></p><ul><li><p><strong>Hash map:</strong> ghi nhận việc data đã được lưu vào cache hay chưa</p><blockquote><p>Nếu không dùng map, chúng ta vẫn có thể kiểm tra cache đã có data hay chưa, thông qua việc duyệt các phần tử bên trong <strong>double linked list</strong> với độ phức tạp là O(n). Tuy nhiên nếu dùng <strong>map</strong>, độ phức tạp sẽ chỉ còn là O(1)</p></blockquote></li></ul><p><img src="https://www.interviewcake.com/images/svgs/lru_cache__doubly_linked_list.svg?bust=50" alt="lru-cache/Untitled%207.png"></p><h3 id="Code-1-chut-cho-vui-nao-😋"><a href="#Code-1-chut-cho-vui-nao-😋" class="headerlink" title="Code 1 chút cho vui nào 😋"></a><strong>Code 1 chút cho vui nào</strong> 😋</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> lib;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> T data;</span><br><span class="line">  <span class="keyword">private</span> Node&lt;T&gt; next;</span><br><span class="line">  <span class="keyword">private</span> Node&lt;T&gt; previous;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(T data)</span> </span>&#123; <span class="keyword">this</span>.data = data; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> T <span class="title">getData</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> data; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> Node&lt;T&gt; <span class="title">getNext</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> next; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setNext</span><span class="params">(Node&lt;T&gt; next)</span> </span>&#123; <span class="keyword">this</span>.next = next; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">hasNext</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> next != <span class="keyword">null</span>; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> Node&lt;T&gt; <span class="title">getPrevious</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> previous; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setPrevious</span><span class="params">(Node previous)</span> </span>&#123; <span class="keyword">this</span>.previous = previous; &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">hasPrevious</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> previous != <span class="keyword">null</span>; &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> lib;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DoubleLinkedList</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> Node&lt;T&gt; first;</span><br><span class="line">  <span class="keyword">private</span> Node&lt;T&gt; last;</span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">int</span> size;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="title">DoubleLinkedList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.size = <span class="number">0</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">addFirst</span><span class="params">(Node&lt;T&gt; newNode)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (size == <span class="number">0</span>) &#123;</span><br><span class="line">      first = last = newNode;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      newNode.setNext(first);</span><br><span class="line">      first.setPrevious(newNode);</span><br><span class="line">      first = newNode;</span><br><span class="line">    &#125;</span><br><span class="line">    size++;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">removeFirst</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Node&lt;T&gt; nextNode = last.getNext();</span><br><span class="line">    last.setNext(<span class="keyword">null</span>);</span><br><span class="line">    last = nextNode;</span><br><span class="line">    last.setPrevious(<span class="keyword">null</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> Node&lt;T&gt; <span class="title">getFirst</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> first;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> Node&lt;T&gt; <span class="title">getLast</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> last;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">removeLast</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Node&lt;T&gt; previousNode = last.getPrevious();</span><br><span class="line">    last.setPrevious(<span class="keyword">null</span>);</span><br><span class="line">    last = previousNode;</span><br><span class="line">    last.setNext(<span class="keyword">null</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">remove</span><span class="params">(Node&lt;T&gt; node)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (node == first) &#123;</span><br><span class="line">      removeFirst();</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (node == last) &#123;</span><br><span class="line">      removeLast();</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      Node&lt;T&gt; previousNode = node.getPrevious();</span><br><span class="line">      Node&lt;T&gt; nextNode = node.getNext();</span><br><span class="line"></span><br><span class="line">      node.setPrevious(<span class="keyword">null</span>);</span><br><span class="line">      node.setNext(<span class="keyword">null</span>);</span><br><span class="line"></span><br><span class="line">      previousNode.setNext(nextNode);</span><br><span class="line">      nextNode.setPrevious(previousNode);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> lru;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> lib.DoubleLinkedList;</span><br><span class="line"><span class="keyword">import</span> lib.Node;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LRUCache</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">int</span> capacity;</span><br><span class="line">  <span class="keyword">private</span> Map&lt;String, Node&lt;String&gt;&gt; map;</span><br><span class="line">  <span class="keyword">private</span> DoubleLinkedList&lt;String&gt; queue;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="title">LRUCache</span><span class="params">(<span class="keyword">int</span> capacity)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.capacity = capacity;</span><br><span class="line">    <span class="keyword">this</span>.queue = <span class="keyword">new</span> DoubleLinkedList&lt;&gt;();</span><br><span class="line">    <span class="keyword">this</span>.map = <span class="keyword">new</span> HashMap&lt;&gt;();</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">put</span><span class="params">(String value)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (map.containsKey(value)) &#123;</span><br><span class="line">      renew(value);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      addNew(value);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">addNew</span><span class="params">(String value)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (map.size() &gt;= capacity) &#123;</span><br><span class="line">      map.remove(queue.getLast().getData());</span><br><span class="line">      queue.removeLast();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Node&lt;String&gt; newNode = <span class="keyword">new</span> Node&lt;&gt;(value);</span><br><span class="line"></span><br><span class="line">    queue.addFirst(newNode);</span><br><span class="line">    map.put(value, newNode);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">renew</span><span class="params">(String value)</span> </span>&#123;</span><br><span class="line">    Node&lt;String&gt; node = map.get(value);</span><br><span class="line">    queue.remove(node);</span><br><span class="line">    queue.addFirst(node);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">displayQueue</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Node&lt;String&gt; node = queue.getLast();</span><br><span class="line">    <span class="keyword">if</span> (node != <span class="keyword">null</span>) &#123;</span><br><span class="line">      System.out.print(node.getData());</span><br><span class="line">      <span class="keyword">while</span> (node.hasPrevious()) &#123;</span><br><span class="line">        node = node.getPrevious();</span><br><span class="line">        System.out.print(<span class="string">" -&gt; "</span> + node.getData());</span><br><span class="line">      &#125;</span><br><span class="line">      System.out.println();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> lru.LRUCache;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>&#123;</span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">    LRUCache cache = <span class="keyword">new</span> LRUCache(<span class="number">3</span>);</span><br><span class="line"></span><br><span class="line">    addToCache(cache, <span class="string">"chocolate"</span>);</span><br><span class="line">    addToCache(cache, <span class="string">"vanilla"</span>);</span><br><span class="line">    addToCache(cache, <span class="string">"strawberry"</span>);</span><br><span class="line">    addToCache(cache, <span class="string">"chocolate"</span>);</span><br><span class="line">    addToCache(cache, <span class="string">"pound"</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">addToCache</span><span class="params">(LRUCache cache, String value)</span> </span>&#123;</span><br><span class="line">    cache.put(value);</span><br><span class="line">    cache.displayQueue();</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Kết quả chạy code</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">chocolate</span><br><span class="line">chocolate -&gt; vanilla</span><br><span class="line">chocolate -&gt; vanilla -&gt; strawberry</span><br><span class="line">vanilla -&gt; strawberry -&gt; chocolate</span><br><span class="line">strawberry -&gt; chocolate -&gt; pound</span><br></pre></td></tr></table></figure><p>Cám ơn các bạn đã đọc bài viết. Nếu có câu hỏi, hoặc các bạn biết những thuật toán hay được sử dụng trong coding interview, đừng ngần ngại chia sẻ nhé. 😁</p><p>Tham khảo: <a href="https://www.interviewcake.com/concept/java/lru-cache" target="_blank" rel="noopener">https://www.interviewcake.com/concept/java/lru-cache</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Gioi-thieu&quot;&gt;&lt;a href=&quot;#Gioi-thieu&quot; class=&quot;headerlink&quot; title=&quot;Giới thiệu&quot;&gt;&lt;/a&gt;Giới thiệu&lt;/h1&gt;&lt;p&gt;Vào một ngày đẹp trời, bạn nảy ra ý tư
      
    
    </summary>
    
    
      <category term="algorithm" scheme="https://www.licolsan.com/categories/algorithm/"/>
    
    
      <category term="algorithm" scheme="https://www.licolsan.com/tags/algorithm/"/>
    
  </entry>
  
</feed>
