簡體   English   中英

Java算法的時間復雜度

[英]Time complexity of algorithms in java

嗨,我正在使用以下通用氣泡排序算法,我想顯示時間復雜度。 我知道此算法的最佳/最壞情況是固定的,但我想知道,它是否可以特定於我的陣列?

例如,這種情況的最壞情況是O(n^2) ,這可以特定於我的數組嗎?

例如,最壞的情況是對120個元素中的100個進行排序(這就是我對數組特定的意思)。

public static <E extends Comparable<? super E>> void bubbleSort(E[] comparable) {
    boolean changed = false;
    do {
        changed = false;
        for (int a = 0; a < comparable.length - 1; a++) {
            if (comparable[a].compareTo(comparable[a + 1]) > 0) {
                E tmp = comparable[a];
                comparable[a] = comparable[a + 1];
                comparable[a + 1] = tmp;
                changed = true;
            }
        }
    } while (changed);
}

復雜度是函數 (或算法)的漸近性質,而不是實際執行路徑的漸近性質。 復雜度表示輸入大小與計算時間(或空間要求)之間的關系。 因此,此概念在應用於單個具體計算時沒有任何意義。

換句話說,您可以詢問取決於n的計算f(n)的復雜性,而不是關於計算f(5)的復雜性。 后者只是一個數字。 前者是一種功能。

可以做的是計算實際的操作數。 每次執行要包括的操作(例如“比較”)時,只需增加一些全局計數器,然后再檢查其值即可。 (算法復雜度應告訴您該計數器可能取值的界限。)

算法的“最壞情況”性能是指使算法表現最差的一組輸入數據。 因此,引用特定輸入數組的“最壞情況”沒有任何意義,因為那只是一種情況。

在一般情況下,算法的最壞情況復雜度為O(n^2) (即,漸近地超過n^2 )。 它也是Theta(n^2) (即不多n^2 )。 我省略了乘法常數。

假設您對陣列有所了解。 為了使事情具體化,假設您知道您的數組最多需要5個冒泡類型交換才能進行排序。 以此知識,可以正確地說算法的運行時間為O(n^2) 但是,它不再是Theta(n^2)

可以說在特定情況下算法的運行時間為O(n) 也是正確的。 換句話說,對數組的了解使我們能夠對算法的運行時間提供更嚴格的限制

氣泡排序的最佳情況是當列表已經排序或幾乎排序為O(n) ,所以是的,它可能取決於您的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM