タグ

algorithmに関するhiroyukimのブックマーク (58)

  • IEEE浮動小数点数における平方根演算の精度に関する覚書 - よーる

    IEEE浮動小数点数における演算では、丸め誤差が不可避です。特に、複数回の演算を繰り返すと丸め誤差が積もっていき、正確な値と大きく離れた答えを得てしまうことがあります。しかし、次の演算については、(数学的に)正確な値を求めた後、一回だけの丸めが発生することが、IEEE標準で規定されています。 四則演算 積和演算 Fused multiply add (FMA) 平方根演算(正の平方根を求める*1) 浮動小数点数演算のできるCPUであれば、普通、四則演算や積和演算を行う命令を持っています。 しかし、平方根を正確に計算する命令を持たない命令セットも存在します。 そのような場合、平方根関数はライブラリ実装となるわけですが、どのように実装すれば要求を満たせるのでしょうか? C++のstd::sqrtは正確に計算しているのか? 結論 しています。 標準の丸めモード、つまり最近接丸め(ぴったり半分なら

    IEEE浮動小数点数における平方根演算の精度に関する覚書 - よーる
  • HashDoS脆弱性との戦い! Rubyコミッター・卜部昌平が明かすプログラム堅牢化のノウハウ - エンジニアHub|若手Webエンジニアのキャリアを考える!

    HashDoS脆弱性との戦い! Rubyコミッター・卜部昌平が明かすプログラム堅牢化のノウハウ 過去、HashDosの影響を受けたRuby。言語開発者はいかにしてこうした問題に対応してきたのでしょうか。コミッターである卜部氏の貴重な記録を公開します。 2011年の末頃、HashDoSという脆弱性が公表され、Rubyもこの影響を受けた。稿の筆者である卜部昌平(うらべ・しょうへい/@shyouhei/以下、卜部)は、報告当初からRuby側のチームメンバーとしてプログラム体の修正を担当した。以下はその記録である。言語開発者たちが普段どのようなことを考え、どういった技術を用いて開発やバグフィックスを行っているのか。その概要を知ってもらえれば幸いだ。 オブジェクト指向スクリプト言語 Ruby HashDoSの概要 なぜ約6年後の今、修正内容を公開するに至ったか? 前史:すでに内包されていたリスク

    HashDoS脆弱性との戦い! Rubyコミッター・卜部昌平が明かすプログラム堅牢化のノウハウ - エンジニアHub|若手Webエンジニアのキャリアを考える!
  • SymSpell対BK木:100倍速い文字列のあいまい検索とスペルチェック | POSTD

    注釈:500,000単語収録の辞書内における1,000単語の検索時間 X:最大編集距離 Y:検索時間/ms 従来、スペル修正や文字列のあいまい検索には、 BK木 が適していると言われてきました。しかし、これは当でしょうか。 また、 スペル修正に関する私のブログ に寄せられたコメントには、BK木が、あいまい検索のためのデータ構造として優れていると言及されていました。 そのような経緯から、今回、BK木と他の選択肢のベンチマークを取って比較してみようと思い立ったわけです。 近似文字列検索アルゴリズム 近似文字列検索では、文字列リスト内の文字列を検索し、特定の 文字列メトリック に従って、それに近い文字列を返します。 文字列メトリックは多数あり、例えば レーベンシュタイン距離 、 Damerau-Levenshtein距離 、 ハミング距離 、 ジャロ・ウィンクラー距離 、 Strike a m

    SymSpell対BK木:100倍速い文字列のあいまい検索とスペルチェック | POSTD
  • B TreeとB+ Treeの違い - Carpe Diem

    概要 インデックスに対してMongoDBはB Treeを採用し、MySQLのInnoDBはB+ Treeを採用しています。 どうして採用しているアルゴリズムが違うのだろう?と思って調べてみました。 主な違い B+ TreeはほとんどB Treeと同じですが、以下の点が異なります。 リーフノードとリーフノードを結ぶポインタがある データはリーフノードのみに保持する 具体例 言葉だけだと分かりにくいので、Visualizeするツールを使って具体例を表示します。 [1, 2, 3, 4, 5, 6, 8, 10, 15, 18]という数列に対し、Order: 3で作ってみます。 Orderは1ノードから出る枝の数のことです。 B Tree B-Tree Visualization B+ Tree B+ Tree Visualization 先程のB Treeと違って、データはリーフノードに持つの

    B TreeとB+ Treeの違い - Carpe Diem
  • Writing a damn fast hash table with tiny memory footprints - Carpe diem (Felix's blog)

    Hash table is probably the most commonly used data structure in software industry. Most implementations focus on its speed instead of memory usage, yet small memory footprint has significant impact on large in-memory tables and database hash indexes. In this post, I”ll provide a step by step guide for writing a modern hash table that optimize for both speed and memory efficiency. I’ll also give so

    Writing a damn fast hash table with tiny memory footprints - Carpe diem (Felix's blog)
  • MySQLのfilesortは何ソートで行われているのか - $shibayu36->blog;

    最近、CourseraのArgorithms, Part1という講義を受けている。そこでソートの講義を受けて、そういえばMySQLのORDER BYでfilesortになったときってどのソートが使われているのだろうと気になってきたので調べてみた。 調べてみると非常に難解で、結局いまいち分からなかったが、今の段階の調べた内容をひとまず書いておく。MySQLのコードを読んだのも初めてで、しかもちゃんと読み解くことができなかったので、情報が間違っている可能性も非常に高い。間違ってたら指摘してもらえるとうれしいです。 調査結果 最初に調査結果を書いておく。たぶんこれは非常に単純化したもので、詳しく見るともっといろいろチューニングされてそう。 sort_buffer_size以内のメモリ量でソートが可能な場合、メモリ内でのみソートされる ソートにsort_buffer_size以上のメモリが必要な場

    MySQLのfilesortは何ソートで行われているのか - $shibayu36->blog;
  • xxHash - Extremely fast non-cryptographic hash algorithm

    xxHash is an extremely fast non-cryptographic hash algorithm, working at RAM speed limit. It is proposed in four flavors (XXH32, XXH64, XXH3_64bits and XXH3_128bits). The latest variant, XXH3, offers improved performance across the board, especially on small data.

  • 文字列アルゴリズムの学びかた - Hatena Developer Blog

    こんにちは!はてなアプリケーションエンジニアの id:takuya-a です。 みなさんは、このような疑問をもったことはありませんか? grep はどのように文字列を検索しているのか? MeCab はどうやって辞書を高速にルックアップしているのか? パーサやコンパイラを作りたいけど、何から始めればいいのか? 稿では、「文字列アルゴリズムとはどんなものなのか?」「なぜ重要なのか?」「何を知っておくべきか?」「どうやって勉強すればいいのか?」といった疑問にお答えしていこうと思います。 文字列アルゴリズムの意外な応用や、モチベーションを保ちやすい勉強のしかた、文字列アルゴリズムを勉強するために行った社内での取り組み、実装するときのコツといったトピックについても触れています。 このエントリは、はてなエンジニアアドベントカレンダー2016の22日目の記事です。昨日は id:syou6162 さんに

    文字列アルゴリズムの学びかた - Hatena Developer Blog
  • データ検証などで利用するMerkle Treeのメモ

    データの検証などで利用される Merkle tree/マークル木/hash tree/ハッシュ木についてメモ。 Merkle Tree の概要 wikipedia の概要をそのままコピペ。 暗号理論および計算機科学において、ハッシュ木(Hash tree, ハッシュツリー)またはマークル木(Merkle tree)とは、より大きなデータ(例えばファイル)の要約結果を格納する木構造の一種であり、データの検証を行う際に使用される。このデータ構造はハッシュリストとハッシュチェインの組み合わせでできており、ハッシュ法の延長上にある手法といえる。 Merkle tree の利用例 merkle tree が2つ与えられた時に、ルートノードから子ノードに向かってハッシュ値をたどっていけば、どこが壊れているのか特定が簡単で、壊れている部分木だけを更新すればよい。 Amazon dynamo/cassan

    データ検証などで利用するMerkle Treeのメモ
  • ディフィー・ヘルマン鍵共有の仕組み - 小人さんの妄想

    2人の間で秘密の暗号通信を行うには、まず最初に2人だけが知っている共通のキーワード〜鍵を取り交わす必要がある。 しかし、2人が遠く離れていて、盗聴の危険性のあるインターネットでしか通信できないとしたら、 どうやって最初の鍵を取り交わすことができるか? この難問を解決するアルゴリズムとして「ディフィー・ヘルマン鍵共有」が知られています。 >> wikipedia:ディフィー・ヘルマン鍵共有 あからさまに盗聴されている通信路だけを使って、2人だけの秘密を共有する・・・ そんな一見不可能に思える離れ業を、どのようにして実現するのでしょうか? ディフィー・ヘルマン鍵共有(以下、DH法と略)の基となる考え方は、以下の図から出発します。 いま、アリスとボブの2人が、2人だけの秘密の数字を共有したかったとしましょう。 まず、アリスが数字Aを、ボブが数字Bを決めて、お互いに交換します。 そして、お互いに

    ディフィー・ヘルマン鍵共有の仕組み - 小人さんの妄想
  • 文字列検索(BM法)

    Boyer-Mooreのアルゴリズム BM法の原理 KMP法は『理論的には優れているが,実戦には弱い』 というアルゴリズム でした。 これに対して,BM法は『理論的にも優れていて,実戦にも強い』 と いう頼もしいアルゴリズムです。 実用的には,BM法は最も速い文字列探索ア ルゴリズムだということができます。パターンとテキストを重ね合わせて,末尾から先頭に向かって順番に文字を 比較していき,パターンとテキストの不一致が見つかったら,不一致の原因に なった文字に応じてパターンをずらす分量を決める,というのがBM法の考 え方です。 たとえば,左の図のようにテキストabdefghにパターンabcを重ね合わ せて比較することを考えましょう。 まずパターンの最後の文字をテキストと比 較します(左図(1))。 パターンの最後の文字はcで,対応するテキストは dになっています。

  • RubyとPythonにおけるガベージコレクションの視覚化 | POSTD

    稿は、ブダペストで開かれたイベント「 RuPy 」で、Pat Shaughnessyが披露したプレゼンの内容をまとめたものです。 プレゼンの映像はここ から視聴できます。 稿は当初、 同氏の個人ブログ に投稿されましたが、同氏の了承を得て、Codeshipに再掲載します。 このイベントは「RubyPython」に関するカンファレンスなので、RubyPythonでは、ガベージコレクション(以下「GC」)の動作がどう違うのかを比較すると面白いだろうと私は思いました。 ただしその題に入る前に、そもそもなぜ、GCを取り上げるのかについてお話しします。正直言って、すごく魅力的な、わくわくするテーマではないですよね? 皆さんの中でGCと聞いて、心がときめいた方はいらっしゃいますか? [実はこのカンファレンス出席者の中で、ここで手を挙げた人は数名いました!] Rubyコミュニティで最近、Rub

    RubyとPythonにおけるガベージコレクションの視覚化 | POSTD
  • ハクビシンにもわかる全文検索 - Qiita

    高速な全文検索アルゴリズムであるFM-indexについて解説する。理解しがたい点や間違っている点があれば是非コメントで指摘してほしい。 概要 FM-indexはリニアな文字列に対して検索をするアルゴリズムで、主に簡潔データ構造とBWT(およびLF mapping)という二つのアイデアから成り立っている。BWTはBurrows-Wheeler変換のことで、文字列を特殊な並び順に変換するという可逆関数である。BWTされた文字列を簡潔データ構造固有の操作をすることで、クエリ文字列の長さに比例した短い時間で文字列を探し出すのがFM-indexだ。 簡潔データ構造 簡潔データ構造に関してはFM-indexで必要となる二つの関数だけ説明して、詳細は次の機会に譲るとする。さて、二つの関数はともに文字列のある位置より前の部分に含まれている文字の数を数え上げるというものでrank()とrankLessTha

    ハクビシンにもわかる全文検索 - Qiita
  • 計算量とBig-O記法 - 素人がプログラミングを勉強していたブログ

    プログラマであればアルゴリズムに関する話で、O(n)だとかO(log n)だとか、O(n2)だとか、そういった記号を目にすることはよくあると思う。 なんとなく、log n < n < n2の順に計算量が増加していくとかそういうことも知っていると思うが、計算量の増加とは何か説明しろと言われると、なかなか難しいと思う。この記事では高校数学レベルでわかるように考えていきたい。 まず、計算にかかる時間を、nを入力のサイズとしてf(n)を計算にかかる最大時間を返す関数とすると、計算量一般を、O(f(n))という、入力に対する計算時間の増加率として定義することができる(より厳密には、f:R+ -> R+ where R+=[0,∞)で、a>bであればf(a) >= f(b)であるとき)。 g(n) = n ^ 2 はn = 1に対して1を返す一方、より増加率の低い h(n) = n + 100 は、n

    計算量とBig-O記法 - 素人がプログラミングを勉強していたブログ
  • Fisher–Yatesアルゴリズムがすごかったです。: PandaNoir

    調べ物をしていたら、Fisher–Yatesというアルゴリズムを見つけました。有名なのかな?とにかく考え方がとてもシンプルでよかったので紹介します。 Fisher–Yatesって何? Fisher–Yatesとは、要するにシャッフルする方法のひとつです。最速です。 どういうアルゴリズム? Fisher–Yatesは、ランダムに配列から抽出して並べていくというものです。そのままですね。では、実装されたコードを紹介します。実物を解説した方が早そうなので。コードは配列を少ない仕事量でシャッフルするFisher-Yates法参照です。 var n = a.length; for(var i = n - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = a[i]; a[i] = a[j]; a[j] = t

  • Markov chain - Wikipedia

    4.3.1 Stationary distribution relation to eigenvectors and simplices

    Markov chain - Wikipedia
  • punycodeのアルゴリズム的な話。 – メモ帳的blog

    punycodeは日語ドメインで使われているエンコード方法です。 このエンコードはドメインという文字数が限られた環境で使われるためBase64などと比べ圧縮率の高いエンコードとなっています。 そのため周りくどい変換をしています。 自分もよく分かっていないのでこの投稿を書きながら勉強するために書いていきたいと思います。 参考資料: Punycode: アプリケーションにおいてドメイン名国際化(IDNA)を行うためのUnicodeのBootstringエンコーディング punycodeの基: 1.基文字と拡張文字を分離 2.分離した拡張文字を文字コード順にソート 3.ソートした文字コードの差分に処理順をかけて挿入位置の数字を足す 基はデコードの処理で説明するとわかりやすいです。 参考資料でも使われている「3年B組金八先生」を簡易的にデコードしていきたいと思います。 まずpunycode

  • 第1回 なぜ、Hadoopはどのように動くのか、を学ぶのか | gihyo.jp

    はじめに ビッグデータ解析のためのシステム基盤として、Hadoopをはじめとするオープンソースのデータ処理ソフトウェア(データ処理系)が広く利用されつつありますが、当該データ処理系をすでに利用している、もしくは利用の検討をしている読者の方々の中には、たとえば以下のような問題を抱えている方が少なからずいらっしゃるのではないでしょうか。 データ処理系の使い方はなんとなくわかるが、その内部をあまり理解できていない。または、内部の動作原理がよくわからないので、格的に使う気にならない。 同様の目的を達成する複数のデータ処理系において、どれを使って良いかがよくわからない。または、適切に使い分けられていない気がする。たとえば、どのような場合にHadoopを用いて、どのような場合に同類のデータ処理系であるImpalaやSparkを用いれば良いかが“⁠明確に⁠”わからない。 このような問題を解決するには、

    第1回 なぜ、Hadoopはどのように動くのか、を学ぶのか | gihyo.jp
  • アルゴリズム+データ構造勉強会(2)

    programming camp 2008, introduction of programming, algorithm

    アルゴリズム+データ構造勉強会(2)
  • アルゴリズム+データ構造勉強会(1)

    Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices

    アルゴリズム+データ構造勉強会(1)