0

次のような 2 列と 10 億行からなるデータがあるとします。

0,0
1,0
2,3
3,2
etc

列 1 からの入力が与えられた場合、列 2 の内容を常に与える関数を作成して、データに表示されるのと同じ方法で列 1 から列 2 に値をマッピングするようにしたいと考えています。

列 1 は 0 から 1E9 (10 億) までの連続です

列 2 は {0,1,2,3} のみです

データを配列に格納したいだけではありません。このマップを計算できるコードが必要です。

何か案は?

前もって感謝します

4

2 に答える 2

2

キーが密集している場合、weights[key] = weight の 1 次元配列で問題ありません。

それ以外の場合、キーがまばらな場合、辞書などのルックアップ構造が機能します。

ランダムな部分についても助けが必要かどうかはわかりませんが、累積合計と rand(sum(weights)) は、重みが大きい数値に偏ってランダムに選択されます。

明確にするために編集された重みは配列です

于 2013-04-23T20:22:13.877 に答える
1

@munch1324が正しいと仮定すると、問題は次のとおりです。

1000 個のデータ ポイントのコレクションを指定して、データ セットに一致する関数を動的に生成します。

はい、可能だと思います。ただし、関数をデータ コレクションのよりコンパクトな表現にすることが目標である場合は、運が悪いと思います。

次の 2 つの可能性があります。

区分的に定義された関数

int function foo(int x)
{
  if (x==0) return 0;
  if (x==1) return 0;
  if (x==2) return 3;
  if (x==3) return 4;
  ...
}

多項式補間

N 個のデータ ポイントは、N-1 次の多項式に正確に一致するように適合できます。

1000 個のデータ ポイントのコレクションが与えられた場合、お好みの方法を使用して、999 度の多項式の 1000 個の係数を解きます。

結果の関数は次のようになります。

int[] c; // Array of 1000 polynomial coefficients that you solved for when given the data collection
...
int function foo(int x)
{
  return c[999]*x^999 + c[998]*x^998 + ... + c[1]*x + c[0];
}

格納する係数が 1000 個あり、x 値をそのような高べき乗にする数値的な問題が発生するため、これには明らかな問題があります。

もう少し高度なものを探している場合、ラグランジュ多項式は、すべてのデータ ポイントに適合する最小次数の多項式を提供します。

于 2013-04-24T15:59:50.803 に答える