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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1080閲覧

探索の実行時間の計測

grape_ll

総合スコア83

C

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/02 14:00

配列と二分探索木によって,記号表の実装をしました.
これを改変して,項目の挿入個所や、探索箇所の実行時間を計測するプログラムを作りたいと考えています.
以下に二つのコードを乗せるのですが,前者は変更せずに,後者のみを改良して実装したいです,
後者のSTsearchを改変して,以下のようにしたのですが.実行してもなにも変化がありませんでした.
include<stdio.h>やinclude<time.h>は後者のファイルに書いてあります.
なぜ計測できないのか.どこにいれれば計測できるようになるのかを教えていただきたいです.
よろしくお願いします.

C

1Item STsearch(Key v) 2{ start=clock(); 3 return searchR(head, v); 4 end=clock(); 5 printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); 6 7}

##以下,ファイル

C

1#include <stdio.h> 2#include <stdlib.h> 3#include "Item.h" 4#include "ST.h" 5 6int main(int argc, char *argv[]) 7{ int N, M, maxN = atoi(argv[1]), sw = atoi(argv[2]); 8 Key v; Item item; 9 STinit(maxN); srand(1); 10 for (M = 0, N = 0; N < maxN; N++) 11 { 12 if (sw == 1) v = ITEMrand(); 13 else if (sw == 2) v = N+1; 14 else if (ITEMscan(&v) == EOF) break; 15 item = STsearch(v); if (item.key != NULLitem.key) continue; 16 key(item) = v; 17 STinsert(item); M++; 18 } 19 STsort(ITEMshow); 20 printf("\n"); 21 printf("%d keys ", N); 22 printf("%d distinct keys\n", STcount()); 23 return 0; 24}

C

1#include <stdlib.h> 2#include "Item.h" 3typedef struct STnode* link; 4struct STnode { Item item; link l, r; int N; }; 5static link head, z; 6link NEW(Item item, link l, link r, int N) 7{ link x = malloc(sizeof *x); 8 x->item = item; x->l = l; x->r = r; x->N = N; 9 return x; 10} 11void STinit() 12{ head = (z = NEW(NULLitem, 0, 0, 0)); } 13int STcount(void) { return head->N; } 14Item searchR(link h, Key v) 15{ Key t = key(h->item); 16 if (h == z) return NULLitem; 17 if eq(v, t) return h->item; 18 if less(v, t) return searchR(h->l, v); 19 else return searchR(h->r, v); 20} 21Item STsearch(Key v) 22{ return searchR(head, v); } 23link insertR(link h, Item item) 24{ Key v = key(item), t = key(h->item); 25 if (h == z) return NEW(item, z, z, 1); 26 if less(v, t) 27 h->l = insertR(h->l, item); 28 else h->r = insertR(h->r, item); 29 (h->N)++; return h; 30} 31 32void STinsert(Item item) 33{ head = insertR(head, item); } 34void sortR(link h, void (*visit)(Item)) 35{ 36 if (h == z) return; 37 sortR(h->l, visit); 38 visit(h->item); 39 sortR(h->r, visit); 40} 41void STsort(void (*visit)(Item)) 42{ sortR(head, visit); } 43

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

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

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

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

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

kuma_kuma_

2020/10/02 16:17 編集

> 二分探索木によって,記号表 ごめん二分木と記号表が結びつかない。どんな配列データから記号表を作ったの? あと二分木の場合、再帰呼び出し?(何て呼べばよいのだろう?)になるから 全体的な速さを測るなら判るけど単体で測っても判別できるほどの秒数でる? CPUクロックで限界に測れるミリ秒以下にならない?
grape_ll

2020/10/02 23:46

自分の知識のなさから適切な表現が出来ていないのかもしれません. 確かにそれぞれで測定すると0.000secのようになってしまいそうです.ご指摘ありがとうございます. 全体の計測を目標にしたいと思います.
guest

回答1

0

ベストアンサー

C

1Item STsearch(Key v) 2{ start=clock(); 3 return searchR(head, v); ←ココでreturnしたら後続する2行が意味ないんだが 4 end=clock(); 5 printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); 6}

投稿2020/10/02 16:47

episteme

総合スコア16614

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

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

grape_ll

2020/10/02 23:55

確かにそうですね.見落としていました. また,それぞれについての時間計測では下限を下回ってしまうというご指摘を受けたのですが,どこにこれらを挟むのが最適なのでしょうか. initialでスタートしてsortの最初でend,標準出力という形でただしい動作となりますでしょうか.
episteme

2020/10/03 00:28

僕の環境では CLOCKS_PER_SEC = 1000 でした。 つまり 1ms に満たない時間は計測不能となります。 start=clock(); searchR(head, v); を数万回繰り返す end=clock(); とかやるっきゃないと思います(ちゃんと測りたいなら)
grape_ll

2020/10/03 01:00

そうなのですね,ご回答ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問