プログラムの実行時間

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心差

プログラムの実行時間

#1

投稿記事 by 初心差 » 13年前

f(n)=f(n-1)+f(n-2), f(1)=1, f(2)=2という関数があり、f(n)を求める以下の2つのプログラムの実行時間を比較しなさい。という問題ですが、プログラムを見ただけで実行時間はどうすれば分るのでしょうか?
以下、その2つのプログラムです。

プログラムA
#include <stdio.h>

main(){
int a,b,c,i,N;

scanf("%d",&N);
a=0;
b=1;
for(i=1;i<=N;i++){
c=a+b;
a=b;
b=c;
}
printf("%d",c);
}


プログラムB
#include<stdio.h>

int f(int n){
if(n>=3)
return(f(n-2)+f(n-1));
if(n=2)
return(2);
if(n=1)
return(1);
}
main(){
int N;
scanf("%d",&N);
printf("%d",f(N));
}

よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: プログラムの実行時間

#2

投稿記事 by h2so5 » 13年前

そもそもプログラムが間違っているんですが、本当にこの通りの問題なんでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: プログラムの実行時間

#3

投稿記事 by みけCAT » 13年前

プログラムを見ただけで実行時間を求めるのは相当きついと思います。
Linuxならtimeコマンドで実行時間が測れます。
Windowsなら、例えばこのツールが使えます。
http://www.vector.co.jp/soft/win95/hard ... 64269.html

また、コードはcodeタグで囲んでいただけるとありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

初心差

Re: プログラムの実行時間

#4

投稿記事 by 初心差 » 13年前

すみません。プログラムを囲むのを見落としていました。
できればペーパーテストですので、PCなしで解きたいです。

正確にはNの値が5 10 20 40 41 42 の場合に何秒かかったか、5種類の実行結果があたえられており、そのうちから1つずつ選ぶというもです。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: プログラムの実行時間

#5

投稿記事 by みけCAT » 13年前

プログラムから計算量オーダーを判断すると、計算時間が見積もれます。
プログラムAのオーダーはO(N)です。(実行時間がだいたいNに比例します)
これはそのままです。
プログラムBのオーダーはO(2N)です。(実行時間がだいたい2Nに比例します)
これは図を書いてみるとわかりやすいです。
saiki.png
プログラムB
saiki.png (9.48 KiB) 閲覧数: 3666 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 15年前

Re: プログラムの実行時間

#6

投稿記事 by たいちう » 13年前

いい問題だと思うけど、h2so5さんの指摘通りプログラムが間違ってます。
上級者は脳内だけでも、ある程度プログラムの動きをシミュレートできるので、
間違いに気付けますが、机上では初心者には少々難しいでしょう。


実行時間について、「N==42の時に何秒かかる」とかを求めるのは一般的には不可能です。
PCの性能等に依存するのは理解できますよね?


で、本題ですが、アルゴリズムを注意深く観察 or 脳内や紙上で追っていき、
足し算が実行される回数を数えることはできそうですか?
小さいNから、2つのプログラムの足し算の数を比較してみれば、
法則性を見つけることができるはずです。

初心差

Re: プログラムの実行時間

#7

投稿記事 by 初心差 » 13年前

>>みけCATさん
詳しい説明ありがとうございます。
実行時間がNに対してどのくらいの割合で比例するかわかれば解けそうです。
ありがとうございます。
>>たいちうさん
足し算の回数を数えればよいんですね。みけCATさんの画像を参考にすればできそうです。
ありがとうございました。

再確認したところ、プログラムの間違いというのはBの
 if(n=2)
return(2)
if(n=1)
return(1)
がn==でなく、n=となっているところでしょうか?
すみません。打ち間違えました。

たいちう
記事: 418
登録日時: 15年前

Re: プログラムの実行時間

#8

投稿記事 by たいちう » 13年前

> 足し算の回数を数えればよいんですね。

この問題に限っては、そうです。
足し算の回数だけで、実際にかかる時間の傾向を「ある程度の範囲で」推測できます。

初心差

Re: プログラムの実行時間

#9

投稿記事 by 初心差 » 13年前

了解しました。
皆さんありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る