2016年7月30日土曜日

完備辞書

完備辞書そのものの説明は, ネット検索か,
高速文字列解析の世界<Amazon>で確認してください.

ビット列$B[0,n]\ B[i]\in\{0,1\}$
について, 以下の操作を実現する.
$access(B,i)\ B[i]$を返す
$rank_{b}(B,i)\ B[0,i)$中の$b\in\{0,1\}$の数を返す
$select_{b}(B,i)\ B$中の$i+1$番目に出現した$b\in\{0,1\}$の位置を返す

2016年7月29日金曜日

Trie

トライ木と呼ばれるデータ構造を作成します.
retrievalからtrieなので, treeと同じ発音だそうですが, 日本語ではトライだそうです.
各ノードがそれぞれラベルを持ち, 部分木は共通の接頭辞を持ちます.
"add", "and", "ans"からなるトライ木は以下のようになります.

前処理のための中間データとして作成したため, 効率は考慮していません.

population count

32bitのpopulation count
1のビットを数え上げる
コンパイラ組み込み関数を使わない場合,
inline u32 population_count(u32 v)
{
    v = (v & 0x55555555U) + ((v>>1) & 0x55555555U);
    v = (v & 0x33333333U) + ((v>>2) & 0x33333333U);
    v = (v & 0x0F0F0F0FU) + ((v>>4) & 0x0F0F0F0FU);
    v = (v & 0x00FF00FFU) + ((v>>8) & 0x00FF00FFU);
    return (v & 0x0000FFFFU) + ((v>>16) & 0x0000FFFFU);
}
gccの組み込み関数,
int __builtin_popcount(unsigned int x)
VCの組み込み関数,
unsigned int __popcnt(unsigned int value)

2016年7月8日金曜日

C#クロージャのUnity3Dにおけるコストについて

前回に引き続きクロージャです.

クロージャを実現するために, コンパイラは裏側でクラスを作成します.
もしスマートフォン向けのアプリケーションを開発しているのならば,
これだけでも高いコストを支払っています.

かなり強引な例ですが, 以下のようなコードの場合を考えます.
Destroyボタンを押してから, Unloadボタンを押してもテクスチャは解放されません.
Clearボタンを押してから, Unloadボタンを押すことで解放されます.
クラスはどこかから参照されているかぎり, ガーベージコレクタによって削除されません.
明らかにLoaderの実装に欠点がありますが,
texture変数は, コード上ではスコープから外れて参照が切れているように見えてしまっている、
ことも問題です.

C#クロージャのコストについて

プログラマ向けのテーマではないです. プログラムも行うデザイナ向けです.
もちろん, ちょっとしたツールを作るときはあなたの自由にプログラミングを楽しむべきです.

Visual Studio 2013 .Net Framework 4.5でコンパイルしました.
実験にはILSPYを使用しました.

URIは失念しましたが, このような実験を行った先人はいます.
疑問を持ったら, せっかく便利なツールがあるのですから, まず自分でやってみるべきです.