タグ

データ構造に関するmatsu7874のブックマーク (10)

  • 代数的構造を乗せるデータ構造の設計について - noshi91のメモ

    概要 SegmentTree などのように、代数的構造 (特にモノイド) を乗せるデータ構造は多い。 この部分の設計は様々だが、「静的メンバを実装した型を受け取る」設計を他の設計と比較する。 設計のバリエーション A: std::function で関数オブジェクトを持つ template <class T> class segment_tree { std::function<T(T, T)> op; T id; }; B: 関数オブジェクトをそのまま持つ template <class T, class F> class segment_tree { F op; T id; }; C: 演算子がオーバーロードされた型を受け取る struct add { int val; add operator+(add r) { return add(val + r.val); } add() :

    代数的構造を乗せるデータ構造の設計について - noshi91のメモ
  • 確率的データ構造・ブルームフィルタについてのまとめ - kakts-log

    概要 特定のデータが、ある集合やリストに含まれるかどうかを判定するために線形探索や二分探索などいくつかのサーチアルゴリズムが使われますが、 稿ではメモリの使用効率、探索の際の計算量が優れているブルームフィルタを用いたアルゴリズムについてまとめます。 ブルームフィルタとは ブルームフィルタとは確率的データ構造の一種で、あるデータが集合に属するかどうかを判定する際に使われます。 特徴としては、メモリの空間消費が少なくすみ、非常に効率的にデータの存在判定ができます。 デメリットとしては、false-positive(偽陽性)によるデータの誤判定の可能性があり、集合に存在しないデータを存在すると誤判定してしまう場合があります。このような誤判定が許されないような状況においては、ブルームフィルタは使えません。 逆に、false-negative(偽陰性)による誤判定はないため、データは実際にあるのに

    確率的データ構造・ブルームフィルタについてのまとめ - kakts-log
  • 高速なハッシュテーブルを設計する | POSTD

    (訳注:2016/9/28、頂きましたフィードバックを元に記事を修正いたしました。) はじめに 稿では、高速で汎用的なハッシュテーブルを作るために行う、設計についての多くの意思決定事項を紹介します。最終的に、私の emilib::HashSet とC++11の std::unordered_set の間のベンチマークが出来上がりました。もし、ハッシュテーブルに興味があって、自分で設計したいなら(どのプログラミング言語かに関わらず)、稿がヒントになるかもしれません。 ハッシュテーブル は、素晴らしい発明です。 ならし計算量O(1) ( O(√N)時間 )で、挿入、削除、検索を行うことができます。ならし計算量とは、ハッシュテーブルの計算に平均でO(1)の計算量がかかることを意味しますが、時々、これよりも多くの時間がかかる場合があります。具体的には、ハッシュテーブルに空きがない場合で、挿入の

    高速なハッシュテーブルを設計する | POSTD
  • 確率的データ構造の比較:カッコウフィルタ対ブルームフィルタ | POSTD

    確率的データ構造は少ないメモリでデータをコンパクトに保存し、保存されたデータに関するクエリに対し、おおよその答えを提供してくれます。クエリに対し空間効率の良い方法で答えるように設計されており、それはつまり、正確さを犠牲にするということにもなります。しかし、これらは一般的に、問われているデータ構造の仕様にもよりますが、誤差率の保証と境界を提供してくれます。メモリ使用量が少ないため、確率的データ構造はストリーミングや低出力の設定に特に有用なのです。ですから、動画の視聴回数を数えたり、過去に投稿された一意となるツイートのリストを維持したりするなど、ビッグデータの環境下では非常に有用です。例えば、 HyperLogLog++ 構造 は、2.56KBのメモリで最大790億の一意のアイテムを数えることができるのですが、誤差率はわずか1.65パーセントです。 Fast Forward Labsのチームは

    確率的データ構造の比較:カッコウフィルタ対ブルームフィルタ | POSTD
  • 「高速文字列解析の世界」を読む前に知っておくと良いこと - EchizenBlog-Zwei

    「高速文字列解析の世界」という大変すばらしいが発売された。わりと敷居が高いではあるので読む前に知っておくとよさそうなことを書いておく。 「高速文字列解析」とは 書でいう高速文字列解析というのは主に2つのことを指している。ひとつはデータを圧縮して小さくしてディスクよりメモリ、メモリよりキャッシュというようにより高速な記憶装置で扱いましょう、という話。もうひとつはデータ構造を工夫することで複雑な操作もそこそこ高速に扱えますよ、という話。つまり「圧縮」の話と「効率的なデータ構造」の話があると考えておくと良い。 キーワードは3つ オビにも書いてあるけれど、書が主に扱うのは「BWT」「簡潔データ構造」「ウェーブレット木」の3つ。具体的には「BWT」が「圧縮」に関わっていて「ウェーブレット木」が「効率的なデータ構造」に関わっている。「簡潔データ構造」は基的な道具として書の色々なところで出て

    「高速文字列解析の世界」を読む前に知っておくと良いこと - EchizenBlog-Zwei
  • http://www-erato.ist.hokudai.ac.jp/docs/seminar/yamamuro.pdf

  • WaveletMatrix で快適な整数列ライフを送ろう - noshi91のメモ

    この記事は内容に様々な問題があったので、削除されました。 Wavelet Matrix については下記のページを参照してください。 Wavelet Matrix - data-structures

    WaveletMatrix で快適な整数列ライフを送ろう - noshi91のメモ
  • Splay Tree で三分探索木を組む - noshi91のメモ

    はじめに 最近競技プログラマーの間で Splay Tree のブームが来ているらしいので、それに乗っかり記事を書くことにしました。 Splay Tree は直近にアクセスした値への再アクセスが高速であったり、自己組織化する動的木にも使用されていたりと大変興味深い平衡二分探索木です。 記事では三分探索木を Splay Tree を用いて実装します。 以下、与えられるキーの文字の種類を σ、文字列長を M、要素数を N とし、各文字は定数時間で大小比較が可能とします。 三分探索木とは Trie において、次の文字を二分探索木で管理したものです。 これにより各ノードは二分探索木の左子/右子と Trie としての次の文字を指す子を持つことになり、三分探索木と呼ばれる所以となっています。 クエリの時間計算量はどうなるでしょうか? 各二分木を平衡二分木のように平衡させれば、O(Mlog(min(σ,

    Splay Tree で三分探索木を組む - noshi91のメモ
  • 最近のtrieの話(xbwなど) - Preferred Networks Research & Development

    ブログの更新がとまっていましたが、また少しずつ更新してきたいと思います。 今回はtrie(トライ)の最近の話をしたいと思います。 trieはキー集合を扱うためのデータ構造の一種です。例えば、単語集合からなる辞書であったり、クロールしたURL情報を扱ったり、最近だと、KVS(Key Value Store)のようにキーを介してデータを保存、読み込みをしたりと様々な場面で利用されます。 同じようにキー集合を格納するデータ構造としてハッシュを利用する方法があります。キーからハッシュ値を計算し、その場所に文字列へのポインタを格納しておくデータ構造です。ハッシュを利用した場合とtrieを利用した場合の一番の大きな違いは、trieの場合だと、ある文字列から始まるキーを全て列挙する、いわゆる接頭辞探索ができることです。例えば”te”で始まる文字列を網羅的に調べることができます。木をたどって、”te”の下

    最近のtrieの話(xbwなど) - Preferred Networks Research & Development
  • 興味深いデータ構造:BK木 | POSTD

    BK木とは、 距離空間 内のデータをインデックス化する目的に特化した、木構造を指します。距離空間は基的に、要素の組 $ (a,b) $ 全てについて距離関数 $ d(a,b) $ を持つオブジェクトの集合です。この距離関数は正しく動作することを保証するために、一連の公理を満たしていなければなりません。これが必要になる理由は、後述の「検索」のセクションできちんと説明します。 BK木のデータ構造は、一連のキーを検索し、与えられた検索キーの値に最も近いキーを見つける問題の解決策として、 1973年にBurkhardとKellerが提案したもの です。この問題を解決する素朴な方法は、要素の組に含まれる各要素と検索キーの値を単純に比較することです。一定の時間内に比較が完了した場合、この検索の解は $ O(n) $ となります。一方、BK木を採用すると、この時実行する比較の回数を減らせる可能性が高く

    興味深いデータ構造:BK木 | POSTD
    matsu7874
    matsu7874 2017/08/12
    ノードとノードの距離を持っておく木
  • 1