2

私は漸近記法が初めてで、これがアルゴリズムです。時間の複雑さに対する最悪のケースのタイト ボンドとは何ですか?またその理由は何ですか?

F(A,B) {  //A and B are positive
  while A>0 
    print(A mod B)
    A=A div B
}
4

2 に答える 2

0

あまり良い質問ではありません。まず、B が 1 の場合、アルゴリズムは決して完了しません。おそらく、B は 2 以上でなければなりません。したがって、O(log A) のステップがあります。しかし、ここで問題になるのは、分割自体が「操作」であるかどうかです。A と B が無制限の場合、本質的に対数的でなければなりません。しかし通常、コードはすべての除算を 32 ビットまたは 64 ビットで実装するプロセッサ上で実行され、範囲外の数値を除算することはできません。したがって、一般的に部門は「操作」であると言います。

割り算が対数で、B が小さいと言うと、O(log A)^2 になります。

于 2016-10-03T09:15:40.243 に答える
0

これの時間の複雑さ:

F(A,B) {  //A and B are positive
  while A>0 
    A=A/B
}

は、ループが実行される回数に等しく、それを呼び出しましょう。lまた、B が A を分割して "A > 0" を false にする回数に等しくなります。

この質問から、次のことがわかります。

Knuth の著書「The Art of Computer Programming」(Volume 2) の 4.3.1 のアルゴリズム D は、O(m) ステップで長い除算を実行します。ここmで、 は A の桁数であるため、上限があります。

したがって、時間計算量は次のようになります: *O(l * m)*

今これ:

print(A mod B)

IO が一定であると仮定すると (これはもちろん現実世界では正しくありません)、モジュロ自体の複雑さが必要になります。

O(対数A対数B)

と実行されますl

その結果、次のようになります。

O(l * (m + log A log B))

于 2016-10-03T09:04:33.277 に答える