質問: C++言語において、確率P(x,y)を実装しています。 P(x)については実装してみました。といっても`map`を利用して`key`が何回出現したかを`second`のカウンターを利用して全体で割ったものですが、 ``` std::map P; for(int i=0;i<10;i++) P.insert(std::make_pair(i,0)); P.find(rand())->second++; ``` のような形で、P(x)と見立てたものです。 しかし、P(a,b)のような2つの変数となるとどのような実装方法が適切かわかりません。 P(a,b)を実装したい理由は、P(a,b,c)のように変数が3つの場合に、cは任意とした場合、cについて全て走査する必要があり効率的で無いからです。 どのようなデータ構造を利用すればよいでしょうか。
回答: 確率分布を求めるのであればキーの定義域を有限個の階級に分割して、全組み合わせ分の一次元配列を確保する実装の方が良いのではないかと思います。分布が偏在することが分かっているのなら、ジャグド配列にして必要な個所だけ投票空間を確保したり、階級の大きさを不均等にすることも出来ます。 空間に比べて要素数が極端に少ないのであればmapのキーに構造体などを使えばキーの次元を変更できます。この場合構造体に比較演算子を実装する必要があります。