![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
大学の研究で困っています。
数値計算をC(C++)でやろうとしています。
枝が一本あって、その枝はノードのリストで作られています。その一つ一つのノードからまた新しい枝が作られています。新しい枝がない場合、float(精度を考えるとdoubleにしたい)型の情報を一つ持ちます。
全部で1億個くらいのノードをもつ予定です。(発展系はその二乗三乗と増えていきます。)そこでメモリを効率的に使うプログラミングを考えているのです。
struct leaf{
int init;
struct node top;
}
struct node{
struct node *next;
union pnt {
float *value;
struct leaf *sub;
} p;
}
この文法で動くのかまた他の方法があるかを聞きたくて書き込みしました。よろしくお願いします。(VC++、Win、2GHz)
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- IT・エンジニアリング IT業界ほぼ未経験で28歳からインフラエンジニアになれますでしょうか 7 2023/05/04 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
ノード数とは?
-
C言語の単方向リストについて
-
同じタグ名の項目取得
-
XML文書の指定した属性値を持つ...
-
2分探索木の高さを求めるプロ...
-
PHPを使ったDOMの操作で兄弟ノ...
-
アローダイアグラムの描画について
-
TreeViewコントロールについて
-
C#のツリービューでツリーノー...
-
コンテキストメニュークリック...
-
SNMP リンクダウンとノードダ...
-
【C#】TreeViewでクリックした...
-
TreeViewで複数ノードの選択は...
-
昔Winnyってありましたけど、あ...
-
xpath でn番目のテキストノード...
-
C言語 TreeViewのノードをプロ...
-
あるノードリストに、特定の名...
-
VBSでxmlの値を書き換えたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
昔Winnyってありましたけど、あ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
あるノードリストに、特定の名...
-
同じタグ名の項目取得
-
コンテキストメニュークリック...
-
ノードとは
-
XML文書の指定した属性値を持つ...
-
ツリービューのノードをダブル...
-
2分探索木の高さを求めるプロ...
-
C# TreeView 効率良いノード追...
-
VB6.0でDOMを使用して...
-
スケールフリーネットワークをC...
-
C#でtreeviewの指定ノードを選...
-
複数のマックPCによる数値計算...
-
TreeViewに重複する値をセット
-
ツリービューの使い方が・・・
-
各ノードの行数取得
-
TreeViewの再表示のちらつきを...
おすすめ情報