7

ファイルから不明な数の行を読み取り、それらを構造体に保存する必要があります (要素の総数をカウントする前処理を避けたいと思います)。読み取りフェーズの後、これらの行の各要素に対していくつかの計算を行う必要があります。

私は2つの方法を考え出しました:

  1. realloc行を読むたびに使用します。この方法では、割り当てフェーズは遅くなりますが、計算フェーズはインデックス アクセスのおかげで簡単になります。

  2. 行を読み取るたびにリンクされたリストを使用します。この方法では、割り当てフェーズは速くなりますが、計算フェーズは遅くなります。

複雑さの観点からは、どちらが優れていますか?

4

3 に答える 3

8

リンクされたリストをどのくらいの頻度でトラバースしますか? 一度だけの場合は、リンクされたリストにアクセスしてください。その他のいくつかのこと: 小さな割り当てがたくさんあるだろうか? 10行としましょういくつかの小さなバッファを作成し、それらを一緒にリンクすることができます. しかし、それはすべてプロファイリングの問題です。

最初に最も単純なことを行い、それが自分のニーズに合っているかどうかを確認してから、最適化について考えます。

2番目に最適なソリューションがニーズに完全に適合している場合でも、最適なソリューションについて考えるのに時間がかかりすぎることがあります。

于 2011-05-11T14:28:42.777 に答える
5

情報をどのように使用するかについての詳細がなければ、複雑さについてコメントするのは少し難しいです. ただし、いくつかの考えがあります。

  • realloc を使用する場合は、(毎回 1 つではなく) より多くのアイテムを追加するために、再割り当てする方がよいでしょう。通常、適切なアルゴリズムは、毎回サイズを 2 倍にすることです。
  • リンクされたリストを使用すると、簡単な後処理ステップでアクセスを高速化できます。ポインターの配列をアイテムに割り当て、リスト内の各アイテムに配列要素を設定してから、リストをトラバースします。
  • ファイル内のアイテムのサイズが固定されている場合は、ファイルの最後までシークしてサイズを決定し、アイテムのサイズで割るだけでサイズを事前に計算でき、結果が得られます。固定サイズではない場合でも、これを見積もりとして使用して、必要なサイズに「近づけ」、必要な再割り当ての数を減らすことができます。
于 2011-05-11T14:32:48.133 に答える
2

他のユーザーがすでに述べているように:

時期尚早の最適化は諸悪の根源

ドナルド・クヌース

を使用した別の提案がありますrealloc。C++ STL ではstd::vector、オブジェクトが挿入されるたびにコンテナーが大きくなり、十分なスペースがありません。成長のサイズは、現在の事前割り当てサイズに依存しますが、実装固有です。たとえば、事前に割り当てられたオブジェクトの実際の数を保存できます。サイズが不足している場合は、reallocate現在割り当てられている 2 倍の容量で呼び出します。これで少しは理解できたと思います!

もちろん、実際に消費して必要とするよりも多くのスペースを割り当てる可能性が高いという注意事項があります。

于 2011-05-11T14:36:36.837 に答える