• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データ構造について構造体を使ったテクニックについての質問(ほぼ初心者))

データ構造に構造体を使ったテクニックについての質問(初心者向け)

このQ&Aのポイント
  • 大学の研究で困っている人が質問です。C/C++で数値計算をする際、データ構造に構造体を使うテクニックについて教えてください。
  • 質問者は、枝とノードのリストを持つデータ構造で、その中のノードから新しい枝を作ることができます。新しい枝がない場合は、float型の情報を持ちます。
  • 質問者は、約1億個のノードを持つ予定で、メモリを効率的に使うプログラミング方法を模索しています。現在は、structとunionを使用してデータ構造を表現しています。他の方法があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

想定されているデータ型は(ご存じとは思いますが)「木(tree)」と呼ばれるもので、 アルゴリズム関係の本にはだいたい出てきます。 木を使う場合、 「二つのノードへのポインタを持つ」 「ノードに数値を記憶する」のが一般的な方法です。 質問のやり方では、共用体を使って数値とポインタをまとめようとしていますが、 この方法の問題は、 「入っているデータが、数値なのか、ポインタなのかわからない」 ところです。 正しい処理をするためには「これが数値かポインタか」を表す フラグ変数を持たねばならず、そうするとメモリ節約の意味が無くなってしまいます。 普通に木を構成した方がいいかもしれません。 なお、 union pnt { float *value; struct leaf *sub; } のところでは、float *value;ではなくてfloat value;が正しいと思います。 一億個となると…どうかなあ。 一億って言ったら100メガですよね。 1ノードに16バイトかかるとしても1.6GB。 普通のPCの限界の2Gまでメモリを積んで、できるかできないかというところですね。 きついなあ…。 普通、こういうデータ構造では、ひとつひとつのノードごとに malloc()を使ってメモリ確保をするのですが、 それだとmalloc()の管理用領域の分だけ無駄になるかもしれません。 配列を使って、ノード領域をまとめて確保し、 ポインタのかわりにlong型の「ノード番号」で管理する。 ポインタ参照のかわりに「ノード番号」→「実際のポインタへの変換」→「参照」の仕組を作っておく。 …という方法が考えられます。 こうしても、多少の節約になるくらいですが。 なお、「発展形はその二乗三乗」というのは、 現実に計算するのはたぶん不可能だと思います。 メモリ的にも無理だし、 仮に、1クロックで1ノードの処理が終わるとして(実際は10クロックぐらいはかかると思います)、 1億個の処理が完了するまでに0.05秒。 1億個×1億個だと、60日ぶっ通しで計算してできることになります。 ネガティブなこと書きましたが、できるところまでがんばってください。

関連するQ&A