基本的なことを聞いてすみません><。
積の法則の証明は理解できたのですが
手持ちの本では
1. big ← D[1];
2. for(i = 2; i <= n; i = i + 1){
3. if(D > big){
4. big ← D;
5. }
6. }
7. print(big);
あと、O(c・f(n)) = O(f(n))となる理由がいまいち分かりません><。
積の法則(規則?)
Re:積の法則(規則?)
いくつか意図のわからない部分があるのですが、
・全体の計算量についての問題なのでしょうか?
・f(n)とは、n回繰り返される時の全体の計算量なのでしょうか?
・big←Dとは、普通のイコールの代入文とどう違うのでしょうか?
質問を拝見するに、和の法則とか積の法則じゃなくて極限の問題であるような気がするのですが・・。
1+nにおいて、
とかそういう事ではないのでしょうか?
計算量の近似値を求める問題のように思えるのですが。
積の法則というのは排反事象の事ではないのでしょうか?
・全体の計算量についての問題なのでしょうか?
・f(n)とは、n回繰り返される時の全体の計算量なのでしょうか?
・big←Dとは、普通のイコールの代入文とどう違うのでしょうか?
質問を拝見するに、和の法則とか積の法則じゃなくて極限の問題であるような気がするのですが・・。
1+nにおいて、
limit (n→∞)(1+n) = ∞
とかそういう事ではないのでしょうか?
計算量の近似値を求める問題のように思えるのですが。
積の法則というのは排反事象の事ではないのでしょうか?
Re:積の法則(規則?)
アルゴリズムの本には積の規則って書いてあるんですが^^;
・全体の計算量についての問題なのでしょうか?
全体の計算量についての質問です。
・f(n)とは、n回繰り返される時の全体の計算量なのでしょうか?
T(n)のオーダーはf(n)であるということです。
・big←Dとは、普通のイコールの代入文とどう違うのでしょうか?
えっと。。。代入文と違いはないと思います。
証明の結論を載せるのを忘れてました。
・・積の規則・・
T1(n)とT2(n)をそれぞれO(f1(n))、O(f2(n))である計算量とする。この時、T1(n)・T2(n)はO(f1(n)・f2(n))である。
・全体の計算量についての問題なのでしょうか?
全体の計算量についての質問です。
・f(n)とは、n回繰り返される時の全体の計算量なのでしょうか?
T(n)のオーダーはf(n)であるということです。
・big←Dとは、普通のイコールの代入文とどう違うのでしょうか?
えっと。。。代入文と違いはないと思います。
証明の結論を載せるのを忘れてました。
・・積の規則・・
T1(n)とT2(n)をそれぞれO(f1(n))、O(f2(n))である計算量とする。この時、T1(n)・T2(n)はO(f1(n)・f2(n))である。
Re:積の法則(規則?)
ランダウの記号 フリー百科事典『ウィキペディア(Wikipedia)』
にオーダーの定義が書いてありました。
それを私なりに要約すると(間違っているかもしれませんが、)
f(n)のオーダーは
limit_(n→∞) (f(n)/g(n)) = <定数>
となるもっとも単純な関数をg(n)とする。
このときのg(n)を
f(n)のオーダーとする。
h(n) = O(f(n))と表記する。
これを基にして考えると
limit_(n→∞) (f(n)/g(n)) =<定数>
limit_(n→∞) (c・f(n)/g'(n)) =<定数>
g(n) = g'(n)となるので
>O(c・f(n)) = O(f(n))
となります
極限の計算ができればわかるのですが、
にオーダーの定義が書いてありました。
それを私なりに要約すると(間違っているかもしれませんが、)
f(n)のオーダーは
limit_(n→∞) (f(n)/g(n)) = <定数>
となるもっとも単純な関数をg(n)とする。
このときのg(n)を
f(n)のオーダーとする。
h(n) = O(f(n))と表記する。
これを基にして考えると
limit_(n→∞) (f(n)/g(n)) =<定数>
limit_(n→∞) (c・f(n)/g'(n)) =<定数>
g(n) = g'(n)となるので
>O(c・f(n)) = O(f(n))
となります
極限の計算ができればわかるのですが、
Re:積の法則(規則?)
う~ん、問題の意味がまだよくわかりません・・。
プログラム自体は最大値を求めるプログラムなんですか?
で、十分大きな配列「D[n]」の中にランダムな数がそれぞれ入っていると?
if(D > big){
この条件文にマッチするのはしだいに減っていくはずですから、
nが大きいほどここは無視できるようになると思いますよ。
積とかなんとかじゃんくて単なる近似値の問題のような気がしますが・・。
プログラム自体は最大値を求めるプログラムなんですか?
で、十分大きな配列「D[n]」の中にランダムな数がそれぞれ入っていると?
if(D > big){
この条件文にマッチするのはしだいに減っていくはずですから、
nが大きいほどここは無視できるようになると思いますよ。
積とかなんとかじゃんくて単なる近似値の問題のような気がしますが・・。
Re:積の法則(規則?)
xを試行回数、numを条件文が行われた回数として、
以下のように試行回数と条件文の実行される確率を求めました。
以下のように試行回数と条件文の実行される確率を求めました。
#include <stdio.h> #include <stdlib.h> void main(){ int ran[100000],i,j,x=10,big,num; for(i=0;i<100000;i++) ran=rand(); for(j=0;j<5;j++){ num=0; big=ran[0]; for(i=0;i<x;i++){ if(big<ran){ big=ran; num++; } } printf("試行回数:%6d回 代入確率:%.5f%\n",x,(double)num/x); x*=10; } } 実行結果 試行回数: 10回 代入確率:0.30000% 試行回数: 100回 代入確率:0.06000% 試行回数: 1000回 代入確率:0.00600% 試行回数: 10000回 代入確率:0.00070% 試行回数:100000回 代入確率:0.00008%
Re:積の法則(規則?)
>forループにとってその定数倍
forループが入れ子になっている場合などは計算サイズが増えるとforループの中の計算も
影響してくるけど今回の場合はサイズの増加に関係しない処理という意味ではないでしょうか?
>O(c・f(n))=O(f(n))
結局これを示せば(理解すれば)よいということですよね?
よくわかりませんが
(1) O(c・f(n))⊆O(f(n))
(2) O(c・f(n))⊇O(f(n)) の2つを示せばいいのではないでしょうか?
forループが入れ子になっている場合などは計算サイズが増えるとforループの中の計算も
影響してくるけど今回の場合はサイズの増加に関係しない処理という意味ではないでしょうか?
>O(c・f(n))=O(f(n))
結局これを示せば(理解すれば)よいということですよね?
よくわかりませんが
(1) O(c・f(n))⊆O(f(n))
(2) O(c・f(n))⊇O(f(n)) の2つを示せばいいのではないでしょうか?