簡體   English   中英

時間復雜度(Java,Quicksort)

[英]Time complexity(Java, Quicksort)

關於計算時間復雜度,我有一個非常普遍的問題(Big O表示法)。 當人們說QuickSort的最差時間復雜度是O(n ^ 2)(每次選擇數組的第一個元素作為數據透視,並且數組被反向排序)時,他們認為哪個操作得到O(n ^ 2)? 人們會計算if / else語句的比較嗎? 或者他們只統計它所做的掉期總數? 一般來說,您如何知道計算Big O表示法的“步驟”。

我知道這是一個非常基本的問題,但我幾乎閱讀了谷歌上的所有文章,但仍然沒有弄明白

最糟糕的快速排序案例
最糟糕的情況是快速排序是對數組進行反向排序,正常排序和所有元素相等。


了解大哦
話雖如此,讓我們先了解一下Big-Oh是什么意思。

當我們只有漸近上界時,我們使用O符號。 對於給定函數g(n),我們用O(g(n))表示函數集合,O(g(n))= {f(n):存在正c和n o
所有n> = n o } 0 <= f(n)<= cg(n)

在此輸入圖像描述


我們如何計算Big-Oh?
Big-Oh基本上意味着程序的復雜性隨輸入大小而增加。

這是代碼:

import java.util.*;
class QuickSort
{
    static int partition(int A[],int p,int r)
    {
        int x = A[r];
        int i=p-1;
        for(int j=p;j<=r-1;j++)
        {
            if(A[j]<=x)
            {
                i++;
                int t = A[i];
                A[i] = A[j];
                A[j] = t;
            }
        }

        int temp = A[i+1];
        A[i+1] = A[r];
        A[r] = temp;
        return i+1;
    }
    static void quickSort(int A[],int p,int r)
    {
        if(p<r)
        {
            int q = partition(A,p,r);
            quickSort(A,p,q-1);
            quickSort(A,q+1,r);
        }
    }
    public static void main(String[] args) {
        int A[] = {5,9,2,7,6,3,8,4,1,0};
        quickSort(A,0,9);
        Arrays.stream(A).forEach(System.out::println);
    }
}

考慮以下陳述:

第1塊:

int x = A[r];
int i=p-1;

第2塊:

if(A[j]<=x)
{
     i++;
     int t = A[i];
     A[i] = A[j];
     A[j] = t;
}

第3塊:

int temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;

第4塊:

if(p<r)
{
    int q = partition(A,p,r);
    quickSort(A,p,q-1);
    quickSort(A,q+1,r);
}

假設每個語句占用一個恆定的時間c 讓我們計算每個塊的計算次數。

第一塊執行2C倍。 第二塊,執行圖5c次。 的口渴塊執行圖4c次。

我們將其寫為O(1),這意味着即使輸入的大小變化,語句執行的次數也相同。 所有2c,5c和4c都是O(1)。

但是,當我們在第二個塊上添加循環時

for(int j=p;j<=r-1;j++)
{
    if(A[j]<=x)
    {
        i++;
        int t = A[i];
        A[i] = A[j];
        A[j] = t;
    }
 }

它運行n次(假設rp等於n,輸入的大小),即nO(1)次,即O(n)。 但這並不是每次都運行n次。 因此,我們有平均情況O(log n),即至少遍歷log(n)個元素。

我們現在確定該分區運行O(n)或O(log n)。 最后一個塊,即quickSort方法,最終在O(n)中運行。 我們可以把它看作一個運行n次的封閉循環。 因此,整個復雜性是O(n 2 )或O(nlog n)。

它主要取決於可以增長的大小(n),因此對於快速排序數組,它是數組的大小。 您需要多少次訪問數組的每個元素? 如果您只需要訪問每個元素,那么它就是O(n)等等。

隨着n增長而增長的臨時變量/局部變量將被計算在內。 當n增長時沒有顯着增長的其他變量可以計為常數:O(n)+ c = O(n)

只是為了補充其他人所說的內容,我同意那些說你算上一切的人,但是如果我從大學的算法課程中正確地回憶起來,與比較時間相比,交換開銷通常很小,在某些情況下是0(如果有問題的列表已經排序)。

例如。 線性搜索的公式是

T = K * N / 2。

其中T是總時間; K是定義總計算時間的常數; N是列表中元素的數量。

平均而言,比較次數為N / 2。

但我們可以將其重寫為以下內容:

T =(K / 2)* N.

或重新定義K,

T = K * N.

這清楚地表明時間與N的大小成正比,這正是我們真正關心的。 隨着N的顯着增加,它成為唯一真正重要的事情。

另一方面,二進制搜索以對數方式增長(O log(N))。

暫無
暫無

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

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