1

I am trying to test what I know about BigO not very confident not totally illiterate either but please guide.

This is not a home work , I am not a student any where but interested in understanding this and various other related concepts.

//What is bigO of this Application ?
public class SimpleBigOTest {

    // What is BigO of this method -> I am certain it is O(n) but just checking
    private void useItirativeApprachToPrintNto0(int n) {
        for (int i = 0; i < n; i++) {
            System.out.println("useItirativeApprachToPrintNto0: " + i);
        }
    }

    // What is BigO of this method -> I am reasonabily certain it is O(n)
    private void useRecurrsiveApprachToPrintNto0(int n) {
        if (n != 0) {
            System.out.println("useRecurrsiveApprachToPrintNto0: " + n);
            useRecurrsiveApprachToPrintNto0(n - 1);
        }

    }

    // What is BigO of this method -> I think now it is O(n^2)
    private void mutltipleLinearItirationsDependentOnValueOfN(int n) {
        int localCounter = n + n;
        for (int i = 0; i < localCounter; i++) {
            System.out.println("mutltipleLinearItirationsDependentOnValueOfN: "
                    + i);
        }
        for (int i = 0; i < n; i++) {
            System.out.println("mutltipleLinearItirationsDependentOnValueOfN: "
                    + i);
        }
    }

    // What is BigO of this method -> I think this is again O(n)
    private void mutltipleLinearItirationsNotDependentOnValueOfN(int n, int j) {
        int localCounter = j;
        for (int i = 0; i < localCounter; i++) {
            System.out
                    .println("mutltipleLinearItirationsNotDependentOnValueOfN: "
                            + i);
        }
        for (int i = 0; i < n; i++) {
            System.out
                    .println("mutltipleLinearItirationsNotDependentOnValueOfN: "
                            + i);
        }
    }

    // What is bigO of this main -> I would say O(n^2) because
    // mutltipleLinearItirationsDependentOnValueOfN has biggest BigO of O(n^2)
    // if I am correct
    public static void main(String[] args) {
        SimpleBigOTest test = new SimpleBigOTest();
        int n = 1000;
        int j = 1234;
        test.useItirativeApprachToPrintNto0(n);

        test.useRecurrsiveApprachToPrintNto0(n);

        test.mutltipleLinearItirationsDependentOnValueOfN(n);

        test.mutltipleLinearItirationsNotDependentOnValueOfN(n, j);

    }

}

As a side question why do all the books on Algorithms speak so highly of Recursion where as in my practical experience I have always used iteration. Using Recursion we can run out memory quickly and nightmare to debug.

4

2 に答える 2

12

最初の 2 つに対するあなたの答えは正しいです。

3 番目の関数に対するあなたの答えは正しくありません。これもO(N)です。その理由は、最初のループが 2N 回繰り返され、2 番目のループが N 回繰り返されるためです。big-O は定数因子を無視するため、これは合計 3N 回の反復であり、3N = O(N) です。

4 番目の関数に対するあなたの答えも正しくありません。これは O(N + J) です。関数の実行時間を複数のパラメーターに依存させることは可能であり、ここではそれが当てはまります。N または J を大幅に増やすと、ランタイムはそのパラメーターに他のパラメーターよりも依存するようになります。ダイクストラのアルゴリズム、KMP 文字列マッチング アルゴリズムなどの多くの重要なアルゴリズムには、複数のパラメーターに依存するランタイムがあります。一部のアルゴリズムには、生成する値に依存するランタイムがあります (これらは、出力依存アルゴリズムと呼ばれることもあります)。アルゴリズムを分析または設計するときは、このことを念頭に置いておくとよいでしょう。

最後に、4 つの関数すべてを引数の固定値で呼び出しているため、main の複雑さは O(1) です。プログラムは常にまったく同じ量の作業を行うため(一定の定数)。n と j がコマンドライン引数で変化することを許可すると、実行時間は O(n + j) になりますが、固定されているため、複雑さは O(1) になります。

最後に、再帰をすぐに却下しないことをお勧めします。再帰は、アルゴリズムを設計するための非常に有用な手法であり、多くの再帰アルゴリズム (クイックソート、マージソートなど) はスタック領域をほとんど使用せず、非常に実用的です。再帰的に考えると、問題の構造を別の方法で考えることができるため、反復アルゴリズムの設計に役立つことがよくあります。さらに、多くの主要なデータ構造 (リンクされたリスト、ツリー、トライなど) は再帰的に定義されており、それらの再帰構造を理解することは、それらを操作するアルゴリズムを作成するのに役立ちます。私を信じてください、それは持っていると良いスキルです!:-)

お役に立てれば!

于 2012-06-02T03:16:18.830 に答える
2

複雑さのスコアに関しては、@templatetypedef はすでに正しいものを 1 回提供しています。再帰とループに関する質問です。現実世界の多くの問題には再帰的な動作があり、このプロパティを使用して最適に設計できます。たとえば、ハノイの塔では、再帰は非常に単純なソリューションを提供しますが、反復的なアプローチを使用すると、非常に複雑になる可能性があります:(

最後に、再帰には追加のパラメーター オーバーヘッドがいくつかあります。非常に最適化された動作が必要な場合は、それらの中から決定する必要があります。

最後に、プログラマーの時間は CPU 時間よりも高価であることを思い出してください。コードをマイクロ最適化する前に、それが本当に問題になるかどうかを測定することをお勧めします。

于 2012-06-02T05:54:56.123 に答える