<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>devkuma – Data Structure</title>
    <link>https://www.devkuma.com/jp/tags/data-structure/</link>
    <image>
      <url>https://www.devkuma.com/jp/tags/data-structure/logo/180x180.jpg</url>
      <title>Data Structure</title>
      <link>https://www.devkuma.com/jp/tags/data-structure/</link>
    </image>
    <description>Recent content in Data Structure on devkuma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>jp</language>
    <managingEditor>kc@example.com (kc kim)</managingEditor>
    <webMaster>kc@example.com (kc kim)</webMaster>
    <copyright>The devkuma</copyright>
    
	  <atom:link href="https://www.devkuma.com/jp/tags/data-structure/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>スタック(Stack)データ構造の説明</title>
      <link>https://www.devkuma.com/jp/docs/data-structure/stack/</link>
      <pubDate>Sun, 10 Apr 2022 01:49:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/data-structure/stack/</guid>
      <description>
        
        
        &lt;h2 id=&#34;スタックstackの概念&#34;&gt;スタック(Stack)の概念&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;スタック(stack)は積み上げた山を意味する。&lt;/li&gt;
&lt;li&gt;一方の端からだけデータを入れたり取り出したりできる、後入れ先出し(LIFO: Last In First Out)形式のデータ構造である。
&lt;ul&gt;
&lt;li&gt;最も最近入ったデータが最初に出る。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;スタックの構造&#34;&gt;スタックの構造&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;スタック上端: top&lt;/li&gt;
&lt;li&gt;スタック下端: 不要&lt;/li&gt;
&lt;li&gt;要素、項目&lt;/li&gt;
&lt;li&gt;挿入/削除演算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/stack-1.png&#34; alt=&#34;Stack&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;スタックstackの演算&#34;&gt;スタック(Stack)の演算&lt;/h2&gt;
&lt;p&gt;スタック(Stack)はLIFO(Last In First Out)に従う。つまり、最も最近スタックに追加した項目が、最初に削除される項目である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;push(x): 与えられた要素xをスタックの一番上に追加する。&lt;/li&gt;
&lt;li&gt;pop(): スタックが空でなければ、一番上の要素を削除して返す。&lt;/li&gt;
&lt;li&gt;isEmpty(): スタックが空なら真(true)、そうでなければ偽(false)を返す。&lt;/li&gt;
&lt;li&gt;peek(): スタックが空でなければ、一番上の要素を削除せずに返す。&lt;/li&gt;
&lt;li&gt;isFull(): スタックが満杯なら真(true)、そうでなければ偽(false)を返す。&lt;/li&gt;
&lt;li&gt;size(): スタック内のすべての要素数を返す。&lt;/li&gt;
&lt;li&gt;display(): スタック内のすべての要素を出力する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;スタックstackの用途&#34;&gt;スタック(Stack)の用途&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;関数呼び出し&lt;/li&gt;
&lt;li&gt;再帰アルゴリズムを使う場合、スタックが有用である。
&lt;ul&gt;
&lt;li&gt;再帰アルゴリズム
&lt;ul&gt;
&lt;li&gt;再帰的に関数を呼び出す必要がある場合、一時データをスタックに入れる。&lt;/li&gt;
&lt;li&gt;再帰関数から戻ってバックトラック(backtrack)するときは、スタックに入れておいた一時データを取り出す必要がある。&lt;/li&gt;
&lt;li&gt;スタックは、この一連の動作を直感的に可能にする。&lt;/li&gt;
&lt;li&gt;また、スタックは再帰アルゴリズムを反復形式(iterative)で実装できるようにする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Webブラウザの履歴(戻る)&lt;/li&gt;
&lt;li&gt;元に戻す(undo)&lt;/li&gt;
&lt;li&gt;逆順文字列の作成&lt;/li&gt;
&lt;li&gt;式の括弧検査(演算子優先順位表現のための括弧検査)
&lt;ul&gt;
&lt;li&gt;例: 正しい括弧文字列(VPS, Valid Parenthesis String)の判定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;計算機(後置記法計算)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/stack-2.png&#34; alt=&#34;スタック(Stack)の使用例&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gmlwjd9405.github.io/2018/08/03/data-structure-stack.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;資料構造 | スタック(Stack)とは&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Data Structure</category>
      
      <category>Stack</category>
      
    </item>
    
    <item>
      <title>ブルームフィルター(Bloom Filter)データ構造を簡単に説明</title>
      <link>https://www.devkuma.com/jp/docs/data-structure/bloom-filter/</link>
      <pubDate>Fri, 23 Jun 2023 14:14:30 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/data-structure/bloom-filter/</guid>
      <description>
        
        
        &lt;h2 id=&#34;ブルームフィルターbloom-filterとは&#34;&gt;ブルームフィルター(Bloom Filter)とは?&lt;/h2&gt;
&lt;p&gt;ブルームフィルター(Bloom Filter)は効率の良い&lt;strong&gt;確率的データ構造&lt;/strong&gt;である。要素が集合の要素かどうかをテストするために使われる。
ブルームフィルターはバイナリツリーやハッシュマップのように頻繁に使われるデータ構造ではないが、ときどき使われる。&lt;/p&gt;
&lt;p&gt;基本的な概念は非常に簡単で、次のような状況でとても有用である。&lt;/p&gt;
&lt;p&gt;あるSet(つまり集合)とElementがあるとき、特定のElementがそのSetに存在するかどうかを、ブルームフィルターを使えば素早く知ることができる。特定のElementが特定のSetに存在するかと聞かれたとき、ブルームフィルターは2つの答えを返せる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;特定のElementは特定のSet内に存在しない。&lt;/li&gt;
&lt;li&gt;特定のElementは特定のSet内に存在する可能性がある。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この2つの答えは、Elementがフィルターに存在しないときは確実に知らせることができるが、存在するときは確実ではないことを意味する。&lt;/p&gt;
&lt;p&gt;正確ではないにもかかわらず使う理由は、Bloom Filterが空間効率の良いデータ構造だからである。使用するメモリ領域を最初から固定してもよい。
Bloom Filterの要素単位はビットである。32bitマシンでinteger型なら、最大32個の要素を入れられる。&lt;/p&gt;
&lt;h2 id=&#34;ブルームフィルターの構成&#34;&gt;ブルームフィルターの構成&lt;/h2&gt;
&lt;p&gt;それでは、ブルームフィルターの動作について説明する。ブルームフィルターは1つのビット配列とn個のHash関数で構成される。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/bloom-filter-0.png&#34; alt=&#34;bloom-filter&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;n個のHash関数&lt;/strong&gt;&lt;br&gt;
Bloom Filterは複数のHash関数を使う。
Hash関数は、ある値を渡したとき、その値を配列のインデックスのうち1つの数字に変換する役割を持つ。
Hash関数の数は複数に設定でき、各関数はHashの方法がそれぞれ異なる。&lt;/p&gt;
&lt;p&gt;この関数の機能は以下のとおりである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setに新しいElementを追加する。&lt;/li&gt;
&lt;li&gt;Setに入力したElementが存在するか確認する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;複数の値を持つ配列&lt;/strong&gt;&lt;br&gt;
ブルームフィルターは複数の値を持つ配列で構成され、ある値をHash関数に通して得たインデックスの値を変更する。
例では、配列サイズ20のBloom Filterを例にする。&lt;/p&gt;
&lt;h3 id=&#34;ブルームフィルターに新しいelementを追加&#34;&gt;ブルームフィルターに新しいElementを追加&lt;/h3&gt;
&lt;p&gt;ブルームフィルターに&amp;quot;Element 1&amp;quot;を追加するため、3つの関数それぞれでインデックスを取得し、そのインデックスの値を0から1に変更する。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/bloom-filter-1.png&#34; alt=&#34;bloom-filter&#34;&gt;&lt;/p&gt;
&lt;p&gt;2番目の&amp;quot;Element 2&amp;quot;も同様に、3つの関数それぞれでインデックスを取得し、そのインデックスの値を0から1に変更する。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/bloom-filter-2.png&#34; alt=&#34;bloom-filter&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;ブルームフィルターで新しいelementを確認&#34;&gt;ブルームフィルターで新しいElementを確認&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;Element 3&amp;quot;が存在するか確認するため、3つの関数を通してみる。
&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/bloom-filter-3.png&#34; alt=&#34;bloom-filter&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hash関数A、B、Cでそれぞれ0、1、0を指し、1つでも0を含む場合、入力された&amp;quot;Element 3&amp;quot;は存在しない。&lt;/p&gt;
&lt;p&gt;今度は&amp;quot;Element 4&amp;quot;が存在するか確認するため、3つの関数を通してみる。
&lt;img src=&#34;https://www.devkuma.com/docs/data-structure/bloom-filter-4.png&#34; alt=&#34;bloom-filter&#34;&gt;&lt;/p&gt;
&lt;p&gt;関数A、B、Cはすべて1の値を指しているが、実際には&amp;quot;Element 1,2&amp;quot;だけが存在し、&amp;ldquo;Element 4&amp;quot;は存在しなかった。&lt;/p&gt;
&lt;p&gt;このように、存在しない&amp;quot;Element&amp;quot;については確実に存在しないと知らせられるが、存在するように見える&amp;quot;Element&amp;quot;については確率的に知らせられるだけで、正確ではない。&lt;/p&gt;
&lt;h2 id=&#34;ブルームフィルターを使う例&#34;&gt;ブルームフィルターを使う例&lt;/h2&gt;
&lt;p&gt;では、このように確実ではないのになぜ使うのか。その理由は、ブルームフィルターが非常にメモリ効率的(Efficient)で速いからである。&lt;/p&gt;
&lt;p&gt;次に、ブルームフィルターを使う2つのケースを見てみる。&lt;/p&gt;
&lt;h3 id=&#34;cdn&#34;&gt;CDN&lt;/h3&gt;
&lt;p&gt;CDNは、多くのユーザーが要求するデータをユーザーに近いCDNに保存し、ダウンロードしやすくするためのものである。&lt;/p&gt;
&lt;p&gt;CDNではリクエストに対するCachingを行うことになるが、最初のリクエストがあったときにすぐキャッシュされると考えてみよう。
そうすると、何度もリクエストされず、1回だけリクエストされる場合でもすべてキャッシュすることになる。これは効率が悪い。&lt;/p&gt;
&lt;p&gt;CDN事業を行うAkamaiという会社によると、約4分の3は1回しかリクエストされないデータだという。
そこで考えられた方法が、最初のリクエストが来たときはブルームフィルターにだけ記録しておき、リソースをCDNにキャッシュせずユーザーへ届けるというものだった。
そのリソースが再びリクエストされたとき、ブルームフィルターを確認して以前にリクエストされたものかどうかを確認できる。
これにより、そのリソースが複数回リクエストされることが分かり、その時点からキャッシュするようにしたという。&lt;/p&gt;
&lt;h3 id=&#34;key-value-store&#34;&gt;Key Value Store&lt;/h3&gt;
&lt;p&gt;Key Value StoreでKeyをfetchするとき、Rowが存在するかどうかを確認することになる。
このとき、Keyがない場合はすべてのRowを確認しなければならないため、最悪の場合は最も遅くなる。なぜなら、存在するKeyはインデックスのような場所を確認したとき、場合によっては確認してすぐにそのKeyを見つけられることもあり、インデックスを何度か見て見つけられることもある。
しかし、そのKeyがなければ、最悪の場合、存在するすべてのインデックスやデータセットを照会して初めて、存在しないことを確信できる。&lt;/p&gt;
&lt;p&gt;この最悪の場合、存在しないKeyをリクエストされたときに備えてブルームフィルターを使うことができる。Bloom Filterを使えば、多少のエラーはあり得るが、Keyが存在しないか、存在する可能性があるかを素早く確認できる。&lt;/p&gt;
&lt;p&gt;以下のようなデータストアがBloom Filterを使用しているという。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Bigtable&lt;/li&gt;
&lt;li&gt;HBase&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Cassandra&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Data Structure</category>
      
    </item>
    
    <item>
      <title>データ構造(Data Structure)</title>
      <link>https://www.devkuma.com/jp/docs/data-structure/</link>
      <pubDate>Sun, 10 Apr 2022 01:49:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/data-structure/</guid>
      <description>
        
        
        
      </description>
      
      <category>Data Structure</category>
      
    </item>
    
  </channel>
</rss>
