タグ

algorithmに関するtgkのブックマーク (14)

  • ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも

    明日から RubyKaigi なので、ちょっとした小ネタを一つ。 例えば、0 から 9999 までをハッシュに順に入れます。 h = {} 10000.times do |n| h[n] = true end このとき、h[9998] や h[9999] は、h[0] や h[1] より高速です。 どのくらい高速かというと、 1_000_000_000.times { h } # 40.8 sec (ループ自体の速度) 1_000_000_000.times { h[9999] } # 57.2 sec 1_000_000_000.times { h[0] } # 89.1 sech[0] は 89.1 - 40.8 = 48.3 nsec 、h[9999] は 57.2 - 40.8 = 16.4 nsec ということになります。なんと 3 倍も速い。*1 なぜこんなことが起きるのか ハ

    ハッシュは頻繁に参照する値を最後に入れると高速 - まめめも
    tgk
    tgk 2015/12/11
    closed hashingなるもの
  • ¥Ð¥¤¥È¥Ë¥Ã¥¯¥½¡¼¥È - ¹â®²½¥×¥í¥°¥é¥ß¥ó¥°

    ¹â®²½¥×¥í¥°¥é¥ß¥ó¥° ¥È¥Ã¥×¥Ú¡¼¥¸¥Ú¡¼¥¸°ìÍ÷¥á¥ó¥Ð¡¼·Ç¼¨ÈÄÊÔ½¸ ¥Ð¥¤¥È¥Ë¥Ã¥¯¥½¡¼¥È ºÇ½ª¹¹¿·¡§ highcalc 2010ǯ07·î25Æü(Æü) 14:43:05ÍúÎò Tweet °Ê²¼¤Î¼ê½ç¤ÇÍ×ÁǸò´¹¤ò¹Ô¤¦¤³¤È¤Ç¡¢¥½¡¼¥È¤¬´°Î»¤¹¤ë¡£ ¡Ö¾º½ç¡Ü¹ß½ç¤Î¥Ð¥¤¥È¥Ë¥Ã¥¯Îó¡×¤Ë¤¹¤ë¡£ 2^n�¥�¥�¥2^0´Ö¤ò¾º½ç¡Ê¹ß½ç¡Ë¤ÇÈæ³Ó¤¹¤ë¡£ ¥á¥ê¥Ã¥È ¤½¤ì¤¾¤ì¤Î¸ò´¹¤ÏÆÈΩ¤Ë¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤Î¤ÇÊÂÎ󲽤¬ÍÆ°× ¸ò´¹²ó¿ô¤¬Í×ÁÇ¿ô¤Ç·è¤Þ¤ë¤Î¤Ç½ªÎ»È½Ä꤬ÉÔÍ× ¥Ç¥á¥ê¥Ã¥È Í×ÁÇ¿ô¤¬2^

    ¥Ð¥¤¥È¥Ë¥Ã¥¯¥½¡¼¥È - ¹â®²½¥×¥í¥°¥é¥ß¥ó¥°
  • コンシステントハッシュ法 - Wikipedia

    コンピュータ科学の分野で、コンシステントハッシュ法(Consistent hashing)とは、ハッシュテーブルのサイズが変更された時、をキーの数、をスロット数とすると、平均個のキーのマッピングの変更のみでハッシュテーブルの機能を提供することのできる、特殊なハッシュ法である。それに対して、その他の多くのハッシュ法では、キーとスロット間のマッピングがモジュラ演算によって定義されているため、ハッシュテーブルのスロット数が変化するとほぼすべてのキーが再マッピングされてしまう。分散システムの一形態である分散キャッシュなどで利用されている。 コンシステントハッシュは、ランデブーハッシュ(英語版)(HRWハッシュとも呼ばれる)と同じ目的を達成するハッシュ法であるが、2つの手法は異なるアルゴリズムを使用しており、同時に独立して開発された。 アルゴリズム[編集] スロットのハッシュ値をソートしてリストに管

    tgk
    tgk 2013/01/14
    「伝統的なハッシュテーブルでは、スロット数の変化はほぼすべてのキーが再マッピングされるのに対して、コンシステントハッシュの場合、K をキーの数、n をスロット数とすると、平均 K / n 個のキーの再マップですむ」
  • あなたの知らないハッシュテーブルの世界

    Please select the category that most closely reflects your concern about the presentation, so that we can review it and determine whether it violates our Terms of Use or isn't appropriate for all viewers.

  • ZDD入門-お姉さんを救う方法

    japanese_classwork_for_elementaly_school_about_fish_and_jobs.pdfAquacraft Co., Ltd.

    ZDD入門-お姉さんを救う方法
    tgk
    tgk 2012/11/23
    Zero-suppressed BDD
  • 病みつきになる「動的計画法」、その深淵に迫る

    数回にわたって動的計画法・メモ化再帰について解説してきましたが、今回は実践編として、ナップサック問題への挑戦を足がかりに、その長所と短所の紹介、理解度チェックシートなどを用意しました。特に、動的計画法について深く掘り下げ、皆さんを動的計画法マスターの道にご案内します。 もしあなたが知ってしまったなら――病みつきになる動的計画法の集中講義 前回の『アルゴリズマーの登竜門、「動的計画法・メモ化再帰」はこんなに簡単だった』で動的計画法とメモ化再帰を説明しましたが、前回の説明ではまだ勘所をつかめていない方がほとんどでしょう。そこで、これらを完全にマスターするため、今回はもう1つ具体例を挙げながら練習したいと思います。 どういった問題を採用するかは悩みましたが、非常に有名な「ナップサック問題」を取り上げて説明します。 ナップサック問題とは以下のような問題です。 幾つかの品物があり、この品物にはそれぞ

    病みつきになる「動的計画法」、その深淵に迫る
  • クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた - てっく煮ブログ

    集合知プログラミング を読んでいたら、K-means 法(K平均法)の説明が出てきました。K-means 法はクラスタリングを行うための定番のアルゴリズムらしいです。存在は知っていたんだけどいまいちピンときていなかったので、動作を理解するためにサンプルを作ってみました。クリックすると1ステップずつ動かすことができます。クラスタの数や点の数を変更して、RESET を押すと好きなパラメータで試すことができます。こうやって1ステップずつ確認しながら動かしてみると、意外に単純な仕組みなのが実感できました。K-means 法とはK平均法 - Wikipedia に詳しく書いてあるけど、もうすこしザックリと書くとこんなイメージになります。各点にランダムにクラスタを割り当てるクラスタの重心を計算する。点のクラスタを、一番近い重心のクラスタに変更する変化がなければ終了。変化がある限りは 2. に戻る。これ

  • Algorithm I, note 4

    tgk
    tgk 2009/01/07
    BFS, DFS
  • トライ (データ構造) - Wikipedia

    "A", "to", "tea", "ted", "ten", "i", "in", "inn" というキー群によるトライ木 トライ木(英: trie)やプレフィックス木(英: prefix tree)とは、順序付き木の一種。あるノードの配下の全ノードは、自身に対応する文字列に共通するプレフィックス(接頭部)があり、ルート(根)には空の文字列が対応している。値は一般に全ノードに対応して存在するわけではなく、末端ノードや一部の中間ノードだけがキーに対応した値を格納している。2分探索木と異なり、各ノードに個々のキーが格納されるのではなく、木構造上のノードの位置とキーが対応している。 キーが文字列である連想配列の実装構造としても使われる。右図の例では、ノードを表す丸の中にキーが書かれ、連想される値がその下に書かれている。値が書かれていないノードはキー文字列の途中までにしか対応していない。各英単語

    トライ (データ構造) - Wikipedia
    tgk
    tgk 2008/12/09
    Trie
  • DO++: 左傾赤黒木

    漢字で書くと仰々しいが、赤黒木 (wikipedia) red-black tree (english wikipedia)という平衡二分木で最も多くつかわれているデータ構造の、改善版が出てたそうだ。 left-leaning red-black tree (pdf) 日語に訳すと左傾赤黒木かな。簡単な漢字を並べている感じがしてしまう 赤黒木の詳細については、wikipediaなどをよんでもらうとして、これは更新時間が定数で更新箇所が局所的(これはマルチスレッドとかでロックする箇所をかなり細かい単位で、できるという強い利点もある)のだが、実装が結構面倒くさい。例えばC++ stl のmapとかの赤黒木の実装のstl_tree.h(google code search)は大変なことになっている(特にRb_tree_rebalance_for_eraseとか) 赤黒木というのは動的データ構造

    DO++: 左傾赤黒木
  • 横着プログラミング 第9回: sary: Suffix Array のライブラリとツール

    最終更新日: 2002-12-18 (公開日: 2002-12-18) Unix Magazine 誌に 2002年1月号から 2003年2月号にかけて連載し ていた記事の元の原稿です。 私にフローチャートだけを見せて、テーブルは見せないとしたら、 私はずっと煙に巻かれたままになるだろう。逆にテーブルが見せて もらえるなら、フローチャートはたいてい必要なくなる。 -- Frederick P. Brooks Jr. *1 プログラミングにおいてはデータ構造が重要であり、正しいデータ 構造を選択すればアルゴリズムは自明なものとなる、という主張が ある。Rob Pike*2 の "Notes on Programming in C" *3 によると、現実的なプログラムに必要なデータ構造は次の 4つであ るという。 配列 (array) 連結リスト (linked list) ハッシュテーブル

  • Depth first search と Breadth first search

    ここでは、探索における代表的な2つの方法、Depth first search (DFS) とBreadth first search (BFS) とは何か、どのような利害得失があるのか、について述べます。 Depth first search (深さ優先探索) まず子を一つ調べ、次にその子のさらに子を調べ、次にその子の子の子の……というように出来る限り進んで行って、行き止まったら戻って他の子を探索する、というのが DFS です。子に対して DFS を子に再帰的に適用していく、と捉えることも出来ます。 Breadth first search (幅優先探索) 自分の子を全て探索してから、子の子を全て探索し、子の子の子の……というように、同じ深さのものを全て探索してから次の階層へ進むのが BFS です。 記憶領域の効率 DFS の場合 これ以降、木の高さを n で、ノードからどのくらいの子が

    tgk
    tgk 2007/08/27
    DFS/BFS
  • きまぐれ日記: 動的配列への追加コストはなぜ O(1)?

    動的配列への追加コストは O(1) ってのは覚えていればそれだけの話ですが,どうしてかと言われると意外と難しいものです. というのも, このO(1)ってのは動的配列の実装方法に強く依存しているからです.実装を知っていないと答えられません. 一般論として,1つ要素を追加するとき,配列に空きがなかったら新しく配列を作り直して全要素をコピーする必要があります.コピーのコストは O(n) だから,追加コストも O(n) になるという議論が混乱の元になっています. こういうときは,要素追加を n 回繰り返したときの計算量を n で割った平均をとるという解析方法が使われるそうです.一般に, ある operation C の計算量を C を n 回行ったときの計算量 O(n) を n で割った値 O(n)/n で評価する手法をならし解析 (amortized analysis)と言うそうです. さて,s

  • オープンアドレス法の欠点

    ハッシュテーブルの話題ですよね。 オープンアドレス法ではハッシュ値が同じデータが衝突すると、後から登録するデータは別のハッシュ値を計算してその位置に登録します。 それで先に登録したデータを消したとすると、そのハッシュ値のエントリは空きになっているので、同じハッシュ値で後から登録したデータを検索しようとすると登録されていないことになってしまい検索できません。 これを避けるために実データを削除せずに削除マークだけつけるわけです。 なお、当にデータを削除する場合はハッシュテーブルを再構築します。

    オープンアドレス法の欠点
    tgk
    tgk 2006/10/17
    オープンアドレス法ではデータに削除マークを付けるだけ。本当に消したら困る
  • 1