私は基本的にテキストファイル、から「多重グラフのデータを生成するプログラムを書いていますが、例えば、テキストファイルに書記素とその出現頻度との間のマッピング:書記素世代 - メモリの複雑さ対時間
aaaa : 0
aaab : 0
aaac : 0
...
thel : 10
them : 250
...
zzzz : 0
基本的な考え方は、マルチグラフデータに基づいて文字列を「スコア化」して、テキストファイルの言語とどれほど近いかをテストできることです。スコアリング機能は非常に高速でなければなりません。したがって、私は、n次元配列を使用してデータに直接アクセスすることを望んでいました。例えば:
data[n('t')][n('h')][n('e')][n('m')]
N(チャー)のように文字正規化する関数である
- > 0、B - > 1、C - > 2などとにかく、ここで問題がある:26^nは非常に速く大きくなります!
- 104 B
- 3キロバイト
- 69キロバイト
- 2メガバイト
- 45メガバイト
- :私は要素ごとに4つのバイトを使用する場合、次のメモリは、nの異なる値に必要とされます1GB
- 30GB
- 778GB
したがって、n> 3のときにスタックのメモリが不足し、n> 6のときにほとんどのヒープがメモリ不足になるようです。理想的には、私はあらゆる合理的な長さのマルチグラフファイルを生成できるようにしたいと考えています。どのように私はこれを達成することができる任意のアイデア?
私は、配列の要素ごとに1バイト未満を使用する可能性について考えました。私は本当に 'a-z'とおそらくいくつかの特殊文字(スペース、句読点)を索引付けする必要があるので、おそらく5ビット(0〜31)で取り除くことができます。これは可能ですか?もし私ができるなら、私は潜在的に38%のメモリを節約するだろう。これが時間の複雑さにどのように影響すると思いますか?
1つのオプションは、配列ではなくハッシュ関数を使用することです。これは、常に0の頻度を持つ「qxzf」ではなく、実際に存在するキーにのみメモリを使用していることを意味します。メモリ要件は大幅に削減されますが、時間の複雑さ重大な影響を受ける。どう思いますか?
おそらく、私は何らかの種類のツリーデータ構造を使用できますか?グレープフエムはそのような表現に役立ちますが、やはり時間の複雑さは確かに打撃を与えます。私はそれが1ではなくデータにアクセスするための 'n'ステップをとると思います。
最後に、スコアリング機能のマルチスレッド化を検討しています。私はむしろ各スレッドのデータのコピーを割り当てないだろう。要素をロックするためにピーターソンのアルゴリズムと組み合わせて1つまたは2つを使用することは可能でしょうか?
ありがとうございます。
辞書を使用してベンチマークを実行しましたか?それは遅くなるかもしれませんが、大規模なnの場合、スペースを節約すれば、可能なすべての文字列のスペースを事前に割り当てるよりも良いでしょう。 –
BrandonAGr
明日のベンチマークを試してみましょう。私はそれが数倍遅くなるだろうと思うだろう。各スコアリングで文字列の比較を行う必要があります。 – Chris
私はブランドンです。最初に実世界の出発点を取得し、必要に応じて複合性を追加するのは簡単です。さて、私は、ハッシングが実行可能であるためには、一定時間の検索に十分近づいていると思います。 –