タグ

algorithmとC++に関するtyruのブックマーク (2)

  • 高速かつ省メモリで文字列を扱うデータ構造「wavelet tree」

    はじめに 大規模なデータを扱うアプリケーションでは、速度とともに作業領域量も大きな問題となります。作業領域がメインメモリに収まらない場合、スワッピングが発生し、大幅な速度低下につながります。そのため近年、データ構造は高速なだけでなく、作業領域量が小さいことも求められています。今回紹介するのは2003年に提案されたデータ構造、wavelet tree(以下「WT」と表記)です。WTは圧縮索引やSuccinct Data Structureなど、データをコンパクトに表現する際に重要なデータ構造です。WTは文字列T[0...n-1]が与えられた時、次の2つの操作を定数時間でサポートします。 rank(p, c)――T[0...p]中のcの出現回数を返す select(i, c)――(i+1)番目のcの位置を返す WTの作業領域量は、文字列をそのまま保存した時の約2倍程度です。 対象読者 C++

    高速かつ省メモリで文字列を扱うデータ構造「wavelet tree」
    tyru
    tyru 2013/02/02
    Bjarne Stroustrupが文字列クラスの実装には様々な実装があるって論文書いてた記憶 / Vimではどうだったかな。シンプルに行ごとのリストでバッファを実現してただろうか。
  • in-place merge sort - 鍋あり谷あり

    http://blog.livedoor.jp/dankogai/archives/50957658.html に 現代では一時メモリーを使わないin-place merge sortが開発されている と書いてある。そういえば、STLの stable_sort の計算量が O( N (log N)**2 )だったよなぁと思い、どうやったらそうなるのか調べてみたら http://thomas.baudel.name/Visualisation/VisuTri/inplacestablesort.html に実装があるのを発見した(いやその前にSTLのソースを見たんだが、とても読みにくかったので断念した)。 で。ソースから計算内容を理解し、ああなるほどそうするのかと思ってみた。 というわけで、どんな計算なのかを私なりに説明してみる: 左半分と右半分を整列する。 左半分と右半分をマージする。 こ

    in-place merge sort - 鍋あり谷あり
  • 1