13

私はおそらくこれについて間違っていると考えていますが、ここに行きます。

コンピューターは、1111111111111111111 から 99999999999999999999 までの無数の乱数を直線的に吐き出します。

  • コンピューターが線の一端に数字を追加することがあります。
  • コンピューターが回線の反対側に番号を追加することがあります。
  • 各番号には、前に来る、または来る番号があります。
  • 各番号には、後に来る、または来る番号があります。
  • すべての数字が一意であるとは限りません。ほとんどではありませんが、多くの数字が繰り返されます。
  • コンピューターは数字の吐き出しを止めません。

これらの数字をすべて記録するとき、いつでも知識に基づいて推測できるようにする必要があります。

  • ある数字を見たのがこれで 2 回目である場合、前回その数字の前にあった数字を知っている必要があります。

  • それが 2 回以上現れた場合、その前にある数字の確率/頻度を知っている必要があります。

  • 数字を見たのがこれが 2 回目である場合は、前回、その次に並んだ数字も知っている必要があります。

  • それが 2 回以上表示されている場合は、その後に続く数字の確率/頻度を知っている必要があります。


これらすべての数値を格納するために、MySQL データベースのテーブルをどのように構築すればよいのでしょうか? 使用するエンジンとその理由 クエリを作成するにはどうすればよいですか? 私はすぐに知る必要がありますが、容量も重要です。

私の思いがけない計画:

2 テーブル:

1. Unique ID/#
2. #/ID/#

私の考え:

ほとんどの場合、一意の ID は数字よりも短いため、一致が速くなります。数字が繰り返される = ID 行が少ない = 最初の一致が速くなります。

Select * in table2 where id=(select id in table1 where #=?)

また:

3 テーブル:

1. Unique ID/#
2. #/ID
3. ID/#

私の考え:

左/前のみが必要な場合、または後/右のみが必要な場合は、2番目のクエリのサイズを縮小します。

SELECT # IN table2(or 3) WHERE id=(SELECT id IN table1 WHERE #=?)

また

1 テーブル:

1. #/#/#

考え:

少ないクエリ = 少ない時間。

SELECT * IN table WHERE col2=#.

私は道に迷いました.... :( 各数値には 4 つの属性があります。前に来るものは + 頻度、後に来るものは + 頻度です。

そういう風に考えたほうがいいのでしょうか?テーブルに頻度を保存してインクリメントすると、繰り返しがなくなり、クエリが高速化されますか? 私は当初、すべての発生を保存すると、プログラムで頻度を計算する方が速いと考えていました........

このような単純なデータですが、データベースがどのように機能してどちらがより効率的かを知る方法についての知識がありません。


最近のコメントに照らして、実際の問題について少し情報を追加したいと思います。長さが不定の文字列があります。この文字列に、さまざまな文字または文字のチャンクのマルコフ連鎖頻度表を格納しようとしています。

文字列内の任意のポイントが与えられた場合、次の状態の確率と前の状態の確率を知る必要があります。

テキストのコーパスと過去のユーザー入力に基づいて、ユーザー入力を期待しています。私が見た他のアプリケーションとの主な違いは、特定の時間にチェーンをさらに下って、より多くの状態に移動し、複数の可能性を提供するために周波数データが​​必要であることです。

それが絵をより明確にすることを願っています。問題の核心には入りたくありませんでした。過去に、特定の答えを得るには具体的ではない質問を作成したからです。


これは多分少し良いようです。このソリューションに関する私の主な質問は次のとおりです。「キー」(状態の最初の数文字) を提供すると、システムの速度が向上しますか? つまり、state_key をクエリしてから、完全な状態のクエリの結果のみをクエリしますか?

Table 1:
name: state
col1:state_id - unique, auto incrementing
col2:state_key - the first X characters of the state
col3:state - fixed length string or state

Table 2:
name: occurence
col1:state_id_left - non unique key from table 1
col2:state_id_right - non unique key from table 1
col3:frequency - int, incremented every time the two states occur next to each other.

QUERY TO FIND PREVIOUS STATES:
SELECT * IN occurence WHERE state_id_right=(SELECT state_id IN state WHERE state_key=? AND state=?)

QUERY TO FIND NEXT STATES:
SELECT * IN occurence WHERE state_id_left=(SELECT state_id IN state WHERE state_key=? AND state=?)
4

2 に答える 2

2

私はマルコフ連鎖に精通していませんが、ここで質問に答えようとしています。注: 簡単にするために、数字の各文字列を「状態」と呼びましょう。

まずはこんなテーブルをイメージ

Table states:
order : integer autonumeric (add an index here)
state_id : integer (add an index here)
state : varchar (?)

順序: 連続番号 (1、2、3、...、n) を使用するだけで、前または次の状態を簡単に検索できます。

state_id: 州に関連付けられた一意の番号。例として、数値 1 を使用して状態 '1111111111...1' (シーケンスの長さに関係なく) を表すことができます。重要なことは、状態の再発では、以前に使用されたのと同じ state_id を使用する必要があるということです。文字列に基づいて state_id を定式化できる場合があります (おそらく数値を減算します)。もちろん、state_id は、可能な状態の数が MySQL の int フィールドに収まる場合にのみ意味があります。

状態: '11111111...1' から '99999999...9' までの数字の文字列です ... これは文字列としてのみ格納できると思いますが、整数/数値列に収まる場合は、 state_id は必要ないかもしれないので試してみてください

state_id のポイントは、数字の検索はテキストの検索よりも速いということですが、パフォーマンスに関しては常にトレードオフがあります...プロファイルを作成してボトルネックを特定し、より良い設計上の決定を下します。

では、状態 S_i の以前の出現をどのように探すのでしょうか?

"SELECT order, state_id, state FROM states WHERE state_id = " そして、get_state_id(S_i) を添付します。ここで、get_state_id は式を使用して州の一意の ID を生成するのが理想的です。

ここで、order - 1 または order + 1 を使用して、追加のクエリを発行して近隣の州にアクセスできます。

次に、さまざまな発生頻度を追跡する必要があります。次のような別のテーブルでそれを行うことができます。

Table state_frequencies:
state_id integer (indexed)
occurrences integer

そして、数字を取得したときにのみレコードを追加してください。

最後に、隣接する州の頻度を追跡するテーブルを作成できます。

Table prev_state_frequencies (next_state_frequencies is the same):
state_id: integer (indexed)
prev_state_id: integer (indexed)
occurrences: integer

状態の発生回数 (state_frequencies 内) とその前の状態の発生回数 (prev_state_frequencies 内) を比較することで、確率を推測できます (これがあなたがやろうとしていることだと思います)。

あなたの問題が正しいかどうかはわかりませんが、これが理にかなっているなら、私は持っていると思います.

それが役立つことを願っています、ああ

于 2012-12-23T05:27:30.297 に答える
1

マルコフ連鎖は有限であるように思われるので、最初に連鎖の制限を定義することから始めます (つまり、x 個のスペースを埋める 26 文字)。その後、可能な組み合わせの総数を計算できます。私が正しく覚えていれば、文字の特定の配置の確率を決定するための数学は次のとおりです。


x = ((C)(C))(P)
ここで、
C = 可能な文字数、
P = 潜在的な結果の合計。

これは大量のデータを保存する必要があり、データをフィルタリングする手順を作成することは、終わりのない作業のように思えるかもしれません。

-> テーブルで自動インクリメント ID を使用している場合は、テーブルにクエリを実行し、preg_match を使用して新しい結果を以前の結果と比較してテストし、新しい結果との合計一致数をテーブルに挿入することもできます。前の結果をクエリして、その前に何があったかを確認する これにより、結果内のパターンの一般的なアイデアと、統計的関連性と新しいアルゴリズム生成の一般的な基盤が得られるはずです

于 2012-12-23T04:44:59.790 に答える