Rにキー(文字)<->ハッシュ(整数)の関連付けのセットがあります。これらの関連付けを単一の構造に格納して、キーとハッシュのペアをキーごと、およびハッシュごとに参照できるようにします。
だから何かのような
"hello" <-> 1234
変数でdb
。
そして、それにアクセスします(ish;この正確なアクセス構文である必要はありません):
db["hello"] -> 1234
db[1234] -> "hello"
データフレームを使用して、行名にキーの名前を付けてみました。しかし、ハッシュ整数で行を参照することはできません。行名としてハッシュ整数を使用すると、キー名などで参照できなくなります。
私の現在の解決策は、2つのデータベースを2つのデータフレームとして保持することです。1つは行名としてハッシュを持ち、もう1つは行名としてキーを持ちます。これは機能しますが、2つの同一のデータフレーム(行名を除く)を保持するのは少し厄介で繰り返しのようです。
両方向で超高速にしたいと思います:)。これは、文字方向の場合はO(log(n))、整数方向の場合はO(1)を意味すると思いますが、私はデータ構造/アルゴリズムの専門家ではありません。整数方向のO(log(n))はおそらく問題ありませんが、どちらの方向のO(n)(dbソリューション全体をトラバースする必要がある)は物事を重くしすぎると思います。
dbも全単射です。つまり、各キーは正確に1つの値にマップされ、各値は正確に1つのキーにマップされます。
編集:これまでの投稿に感謝します:
いくつかのテストを実行すると、一致手法はキー付きのdata.tableよりも明らかに遅くなります。マーティンが指摘したように、これはキー付きテーブルを作成するための一致に必要な時間のみによるものです。つまり、matchとkeyed data.tableの両方が、値を見つけるためにバイナリ検索を実行します。しかし、それにもかかわらず、単一の値を返す場合、一致は私のニーズには遅すぎます。そこで、data.tableソリューションをコーディングして投稿します。
> system.time(match(1,x))
user system elapsed
0.742 0.054 0.792
> system.time(match(1,x))
user system elapsed
0.748 0.064 0.806
> system.time(match(1e7,x))
user system elapsed
0.747 0.067 0.808
> system.time(x.table[1])
user system elapsed
0 0 0
> system.time(x.table[1e7])
user system elapsed
0.001 0.001 0.000
> system.time(x.table[1e7])
user system elapsed
0.005 0.000 0.005
> system.time(x.table[1])
user system elapsed
0.001 0.000 0.000
> system.time(x.table[1])
user system elapsed
0.020 0.001 0.038
EDIT2:
私はfmatchソリューションと名前付きベクトルを使用しました。一致アプローチの単純さが気に入りましたが、データベースで繰り返しルックアップを実行しているため、一致する各呼び出しでハッシュテーブルを再作成することによるパフォーマンスへの影響は大きすぎました。
fmatchは、matchと同じインターフェイスを持ち、同じ名前付きベクトルデータ型などで機能します。作成されたハッシュテーブルをキャッシュ/記憶するだけなので、名前付きベクトルに対する後続の呼び出しでハッシュルックアップを実行するだけで済みます。これらはすべて呼び出し元から抽象化されているため、fmatchは単に一致のドロップインです。
双方向ルックアップの単純なラッパーコード:
getChunkHashes = function(chunks, db) {
return(db[fmatch(chunks, names(db))])
}
getChunks = function(chunkHashes, db) {
return(names(db[fmatch(chunkHashes, db)]))
}