大学の研究で困っています。
数値計算を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ランキング
-
XML文書の指定した属性値を持つ...
-
昔Winnyってありましたけど、あ...
-
VB6.0でDOMを使用して...
-
同じタグ名の項目取得
-
c言語 ノードの連結
-
TreeViewのNodeについて
-
TreeViewで複数ノードの選択は...
-
ノード数とは?
-
SNMP リンクダウンとノードダ...
-
PHPでのXMLの編集・削除の方法
-
vbsのDOMDocumentで要素のText...
-
東芝のDynabookなのですがアン...
-
XML、XSLTの適応エラー(IEから...
-
XMLで要素が記述された順番に意...
-
XMLからデータを取得
-
XMLを出力する時のエラー原因
-
VBAのXML処理でメモリが足りない?
-
ノードの並び替え
-
XMLDocumentでスキーマを無視し...
-
終了タグが認識されない?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
同じタグ名の項目取得
-
昔Winnyってありましたけど、あ...
-
コンテキストメニュークリック...
-
ルート要素ノードが2個ある場合?
-
マスターノード
-
複数のマックPCによる数値計算...
-
あるノードリストに、特定の名...
-
TreeView の初期表示について
-
TreeViewの再表示のちらつきを...
-
ツリービューのノードをダブル...
-
C# TreeView 効率良いノード追...
-
ノード数とは?
-
XML文書の指定した属性値を持つ...
-
C#のツリービューでツリーノー...
-
VB6.0でDOMを使用して...
-
TreeViewで複数ノードの選択は...
-
ノードとは
-
VisualBasic.net(2008) ツリー...
おすすめ情報