質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

0回答

223閲覧

コードの計算量のオーダーがわからないので教えて欲しいです。part2

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/10 13:51

次のコードの、
////////////////
////////////////
//////start/////
///////////////
///////////////
///////////////
から
////////////////
////////////////
//////end///////
///////////////
///////////////
///////////////
までの所の計算量のオーダーを教えて欲しいです。

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#include<time.h> 5#include<sys/time.h> 6 7double gettimeofday_sec(){ 8 struct timeval tv; 9 gettimeofday(&tv, NULL); 10 return tv.tv_sec+ (double)tv.tv_usec*1e-6; 11} 12 13struct node { 14 double value;// このノードが保持している値 15 int a; 16 int b; 17 struct node *left_ptr; // 左枝 18 struct node *right_ptr; // 右枝 19}; 20// ツリーの頂点 root 21static struct node *root = NULL; 22 23int x[100000]; //送り火の位置のx座標 24int y[100000]; //送り火の位置のy座標 25int size_n = 0; // 送り火の数(n) 26int count = 0; //データ入力のための変数 27double start; //時間計測のための変数 28double end; 29double time_exe = 0; 30 31void make_path_tree(struct node *,int ,int*,int*,double*); 32void make_tree(struct node **, int ); 33void search_tree(struct node *,int,double []); 34 35int main(){ 36 37 // 38 //データの入力 39 // 40 int input[100000]; 41 int ret; 42 int in_a,in_b; 43 44 FILE *file_input; 45 file_input = fopen("input.txt","r"); 46 if(file_input == NULL) { 47 printf("the file can`t be opened\n"); 48 return -1; 49 } 50 51 int m = 0; 52 while(( ret = fscanf( file_input , "%d %d" , &in_a , &in_b )) != EOF ) { 53 input[m] = in_a; 54 m++; 55 input[m] = in_b; 56 m++; 57 } 58 fclose(file_input); 59 // end input 60 61 size_n = input[0]; 62 int k = input[1];// (2k+1)x(2k+1)の格子のサイズ 63 64 //送り火の位置の入力 65 for(int v = 2; v < m; v++){ 66 if(v % 2 == 0){ 67 x[v / 2] = input[v]; 68 }else{ 69 y[ (v-1)/2 ] = input[v]; 70 } 71 } 72 // 73 //データの入力終了 74 // 75 76 int a_n = 0; //(x[n],y[n])が見える最短路の最後の立ち位置 77 int b_n = 0; 78 double length = 0; //一つの路の組み合わせでの最短路の長さ 79 double min_length = 2*(size_n-1)*k + k; //最短路の長さ(初期値は取りうる一番長い路の長さ) 80 81 for(int v = 0; v < size_n;v++){ 82 make_tree(&root,v); 83 } 84 85 //////////////// 86 //////////////// 87 //////start///// 88 /////////////// 89 /////////////// 90 /////////////// 91 92 start = gettimeofday_sec(); 93 94 make_path_tree(root,1,&a_n,&b_n,&length); 95 96 double length_result[(int)pow(2,size_n-1)]; 97 search_tree(root,1,length_result); 98 99 for(int v = 0; v < pow(2,size_n-1);v++){ 100 if(min_length > length_result[v] ){ 101 min_length = length_result[v]; 102 } 103 } 104 105 end = gettimeofday_sec(); 106 time_exe += (end-start)*1000; 107 108 //////////////// 109 //////////////// 110 //////end/////// 111 /////////////// 112 /////////////// 113 /////////////// 114 115 printf("実行時間は %lf(ms)\n",time_exe); 116 printf("課題2 最短路の長さは %lf で、最短時間は %lf 分\n",min_length,min_length*5); 117 118 FILE *file_output; 119 file_output = fopen("data_kadai1-2.csv","a"); 120 if(file_output == NULL) { 121 printf("the file can`t be opened\n"); 122 return -1; 123 } 124 fprintf(file_output,"%d,%lf\n",size_n,time_exe); 125 fclose(file_output); 126 return 0; 127} 128 129 130void make_tree(struct node **node, int value) 131{ 132 int result; // 数値の大小比較結果 133 134 // ノードが存在しない場合 135 if ((*node) == NULL) { 136 137 // 新しい領域を割り当てノードを作成する 138 (*node) = malloc(sizeof(struct node)); 139 if ((*node) == NULL){ 140 fprintf(stderr, "NULL"); 141 exit (8); 142 } 143 144 // メンバを初期化 145 (*node)->left_ptr = NULL; 146 (*node)->right_ptr = NULL; 147 (*node)->value = value; 148 (*node)->a = 0; 149 (*node)->b = 0; 150 151 // make_tree関数を終了 152 return; 153 } 154 155 // テキストから取り出した数値をノードの数値と比較 156 // 現在のノードより大きかったら正。小さかったら負。等しかったら0 157 if ((*node)->value < value) { 158 result = 1; 159 } else if ((*node)->value > value) { 160 result = -1; 161 } else if ((*node)->value == value) { 162 result = 0; 163 } 164 165 // 現在の数値が既にあれば、新たなノードは作成せずmake_tree関数を終了 166 if (result == 0) 167 return; 168 169 // 大きかったら両枝に移動 170 if (0 < result) { 171 make_tree(&(*node)->right_ptr, value); 172 make_tree(&(*node)->left_ptr, value); 173 } 174} 175 176 177void make_path_tree(struct node *now,int n ,int *a,int *b,double *l){ 178 if(now == NULL){ 179 return; 180 } 181 182 183 int pre_a = *a; 184 int pre_b = *b; 185 double pre_l = *l; 186 187 *l += abs(x[n] - *a); 188 *a = x[n]; 189 make_path_tree(now->right_ptr,n+1,a,b,l); 190 191 192 now->a = pre_a; 193 now->b = pre_b; 194 now->value = pre_l; 195 *a = pre_a; 196 *b = pre_b; 197 *l = pre_l; 198 199 *l += abs(y[n] - *b); 200 *b = y[n]; 201 make_path_tree(now->left_ptr,n+1,a,b,l); 202 203} 204 205void search_tree(struct node *now,int n,double max[]){ 206 if(now == NULL){ 207 return; 208 } 209 search_tree(now->right_ptr,n+1,max); 210 if(n == size_n){ 211 if(abs(x[n] - now->a) <= abs(y[n]- now->b)){ 212 max[count] = now->value + abs(x[n] - now->a); 213 count++; 214 }else{ 215 max[count] = now->value + abs(y[n] - now->b); 216 count++; 217 } 218 } 219 search_tree(now->left_ptr,n+1,max); 220} 221 222

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

X_III

2022/03/21 14:30

データの個数nが増加したときに、計算量、または計算時間がどれくらい増加するのかを考えるのが計算量オーダーです。 この例ではforループをpow(2,size_n-1)回だけまわすので、 O(pow(2,size_n-1)) でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問