[英]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.