QuickSelect平均时间复杂度O(n)[如何?]

时间:2019-02-11 14:39:47

标签: java time-complexity quickselect

我正在学习QuickSelect,以查找第K个最小数字。 我了解该程序。 但是我对QuickSelect的平均时间复杂度如何为O(n)感到困惑。

我已经尝试过用Java编写代码,并且可以正常工作。但是我对时间的复杂性感到困惑。

public class KthSmallestNumberUsingQuickSelect {

    int findKthNumber(int arr[], int left, int right, int k ) {
        if(k > 0 && k <= right - left + 1) {

            int pos = partition(arr,left,right);

            if(pos - left == k - 1)
                return arr[pos];

            if(pos - left > k - 1)
                return findKthNumber(arr, left, pos - 1, k);
            System.out.println(k - pos + left - 1);
            return findKthNumber(arr, pos + 1, right, k - pos + left - 1);
        }
        return Integer.MAX_VALUE;
    }

    int partition(int arr[], int left, int right) {
        int i = left ;
        int j;
        int x = arr[right];
        int temp = 0;

        for(j=left; j<right; j++ ) {
            if(arr[j] <= x) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;

                i++;
            }
        }
        temp = arr[i];
        arr[i] = x;
        arr[right] = temp;

        return i;
    }

    public static void main(String[] args) {
        KthSmallestNumberUsingQuickSelect kq = new KthSmallestNumberUsingQuickSelect();


        int arr[] =  {7,10,4,3,20,15};
        int k = 3;

        System.out.println(kq.findKthNumber(arr,0,arr.length-1, k));
    }
}

平均时间复杂度O(n)如何? 谁能向我详细解释一下?

1 个答案:

答案 0 :(得分:1)

我认为您的问题不是QuickSelect特有的。您在问大O表示法和平均Theta(Θ)表示法有什么区别。

大O符号表示算法将使用的最大潜在复杂性。

另一方面,Θ符号是问题输入的所有可能组合中的平均复杂度。

还有Ω(Ω)表示法,可以实现最佳的案例复杂性。

快速选择算法具有与快速排序类似的复杂度,您很正确地认为两者的O表示法都为O(n ^ 2),但通常情况下,它们更好。

如果您需要更具体的说明,为什么平均情况是线性的,请阅读此post中的答案。