私が達成しようとしているのは、配列を使って多項式の未知のサイズを格納することです。 私はインターネット上で見たことは、各セルにcoeffecientが含まれており、次数がセル番号であるという配列を使用していますが、それは効果的ではありません。なぜなら、6x^14 + x + 5のような多項式があるからです。これは、1から13までのすべてのセルに0を持たせることを意味します。すでにベクトルとリンクされたリストを持ついくつかのソリューションを見ていますが、この問題に効果的に取り組む他の方法はありません(std :: vectorsまたはstd ::リスト)?(効果的に)多項式を動的に格納する
答えて
ゼロの要素が存在しないキーによって表されるマップでスパース多項式を表すことができます。このようなクラスの例を次に示します。
#include <map>
//example of sparse integer polynomial
class SparsePolynomial{
std::map<int,int> coeff;
int& operator[](const int& degree);
int get(int degree);
void update(int degree, int val);
};
要素の係数を取得または更新しようとするたびに、マップの存在が評価されます。要素の係数が更新されるたびに、値がゼロかどうかがチェックされます。したがって、マップのサイズは常に最小限に抑えることができます。
これら2つの方法をoperator[]
に置き換えることができます。しかし、この場合、更新操作中にゼロをチェックすることができないため、アクセスと更新のために2つの別々のメソッドを使用するのと同じくらい効率的ではありません。
int SparsePolynomial::get(int degree){
if (coeff.find(degree) == coeff.end()){
return 0;
}else{
return coeff[degree];
}
}
void SparsePolynomial::update(int degree, int val){
if (val == 0){
std::map<int,int>::iterator it = coeff.find(degree);
if (it!=coeff.end()){
coeff.erase(it);
}
}else{
coeff[degree]=val;
}
}
この方法では、より効率的な記憶域が得られますが、アクセスと更新にはベクターよりも時間がかかります。しかし、疎な多項式の場合、その差は小さくてもよい。サイズN
のstd::map
が与えられた場合、要素の平均検索複雑度はO(log N)
となります。度がd
、非ゼロ係数の数がN
のスパース多項式があるとします。 N
がd
よりもはるかに小さい場合、アクセスと更新の時間は十分に小さく通知されません。
非常に参考に、上記の人々は私がまだ知らなかったマッピングについても言及していますが、具体的な例をあげました。もっと重要なメモリスペースやランタイムは何ですか?彼らはどちらも同じだと知っていますが、あなたがもう一方の上を歩かなければならない場合、記憶はより価値があると言いますか? –
私はメモリスペースがもっと重要であると言うのは、2つの理由からです:(1)フォンノイマンのボトルネック。 (2)この場合、「N」が非常に小さい場合、ランタイムトレードオフは無視できる。 –
別の方法で実行する必要がある魅力的な理由がない限り(これはCスタイルの配列を使用する必要があるプログラミング割り当てです)、標準ライブラリのstd::vector
を使用してください。図書館には、あなたの人生を楽にする理由があります。オーバーヘッドはおそらくあなたのプログラムの文脈では重要ではありません。
[-1, 1, 0, 0, 0, 4]
などのインデックスを持つstd::vector
に多項式(4 * x^5 + x - 1など)を格納するのは非効率的です。これは当てはまりますが、1000を超える次数の多項式を格納しない限り、この無駄はほとんどありません。高度は低いが係数は少ない「疎」多項式の場合、各ペアの最初の値には電力が格納され、2番目の値には係数が格納されたペアのベクトルを使用することを検討できます。
うん、私は実際には疎な多項式について話していました。私はペアのベクトルを使うことについてもっと調べるでしょう。 –
- 1. 多次元動的配列の格納
- 2. poly1D()関数からリストに多項式を格納する
- 3. データベースに多目的チェックボックスを格納
- 4. より多くのブール値を格納する最も効果的な方法
- 5. 多項式関数を動的値に適用する方法
- 6. 明示的に構造体に項目を格納する
- 7. 動的ピボットの結果を一時テーブルに格納
- 8. 辞書のキーにz3シンボリック式を格納する効率的な方法
- 9. 多項式時間旅行セールスマンツリーを使用する[動的プログラミング]
- 10. MariaDB - 自動的に列を合計し結果を格納する関数
- 11. 効率的なhtml要素をSQLに格納する
- 12. 多くのデータフレームを格納するRメモリ効率的な方法?
- 13. イメージをファイルシステムに動的に格納する方法は?
- 14. チェックボックスリスト項目を動的に無効/有効にする
- 15. Androidで文字列を格納する最も効果的な方法
- 16. Java:効率的にboolean [32]を格納しますか?
- 17. 配列の中に動的に格納するPython
- 18. XMLからデータベースへデータを動的に格納するサービス
- 19. 動的構造体に行を格納する
- 20. MIPS:動的メモリ(ヒープ)に文字列を格納する方法
- 21. クエリ出力を動的に格納するTSQL
- 22. JSON配列を動的リスト<?>に格納する方法
- 23. 動的配列をTListに格納する方法は?
- 24. Cで動的配列に値を格納する方法
- 25. 動的生成ビューをlaravel 5.3に格納する方法は?
- 26. URLは自動的にcodeigniterのURLに格納されます
- 27. 入力にAngularJS式の結果を格納する
- 28. グラフのサブセットを格納する効率的なデータ構造
- 29. logstash - 動的リストにフィールドの内容を格納します。
- 30. 効率的に格納し、Luaのマルチレベル・キュー
「ベクトルを使用しない」とはどういう意味ですか?おそらくいくつかの[関連する読書](https://stackoverflow.com/questions/46991224/are-there-any-valid-use-cases-to-use-new-and-delete-raw-pointers-or-c- style-arr)を使って混乱を解消します。 – user0042
[地図](http://en.cppreference.com/w/cpp/container/map)はどうですか? –
@Someそれは私が好きなような皮肉です:-) – user0042