斯坦福大学 算法algorithm课 divide and conquer 第三周笔记(含习题解释和代码)

第三周要点:

1. quick sort(快速排序O(Nlog(N))

input: a array,unsorted
output: Same numbers sorted in increasing order

algorithm:
在这里插入图片描述
pseudocode for partition
在这里插入图片描述
the importance of choosing pivot:
worst O ( N 2 ) O(N^2) 例子: 一个y已经排好序的数组 每次只减少了一个元素
best: : O ( N l o g ( N ) ) O(Nlog(N)) 例子: 每次的pivot元素都选到了中间。

而quick_sort 基本上可以达到 O ( N l o g ( N ) ) O(N*log(N)) 的复杂度

2. 证明:

can’t apply master method

decomposition method
在这里插入图片描述
general decomposition principle
在这里插入图片描述
更详细证明见课程:https://www.coursera.org/learn/algorithms-divide-conquer/exam/h06aN/problem-set-3

3. 习题解释

题目1
每个数组都有n个元素,要使小的那个数组的长度比 α n \alpha n 大,那么快速排序中所要选择的那个pivot 元素x一定要满足
α n + 1 < = x < = n α n \alpha n +1<=x<=n-\alpha n 所以这样的概率对于长度为n的数组来说就是 P = n 2 α n n = 1 2 α P = \frac{n-2\alpha n}{n} = 1 - 2*\alpha
在这里插入图片描述
由题已知 α < 1 α \alpha < 1 - \alpha , 假设迭代次数为 x x , 在经过x次迭代后,长度最小的那个向量应该为 α x n \alpha^{x}n ,最大的应该为 ( 1 α ) x n (1-\alpha)^{x}n , 令这两个边界等于1,即可得到答案。
在这里插入图片描述
期望的可加性:
E ( X + Y ) = E ( X ) + E ( Y ) E(X + Y) = E(X) + E(Y)
E ( i , j ) E(i,j) 定义为第i个人和第j个人同一天生日的期望 有 E ( i , j ) = 1 1 / 365 = 1 / 365 E(i,j) = 1* 1/365 = 1/365
E ( ) = i = 1 k 1 j = i + 1 k E ( i , j ) = k ( k 1 ) 2 1 / 365 = 1 E(有一个人过生日) = \sum_{i=1}^{k-1}\sum_{j=i+1}^{k}E(i,j) = \frac{k*(k-1)}{2} *1/365=1
所以k = 28

期望不是概率
期望是事件的平均数!

在这里插入图片描述
分别计算一下两边的概率即可得出结论
公式:
在X 和 Y 是独立事件的情况下:
E ( X Y ) = E ( X ) E ( Y ) E(X * Y) = E(X) * E(Y)

4. quick_sort 代码

#全局变量m用来记录比较次数
m = 0
def partition(A,P):
    i = 1
    #挪到首位
    A[0],A[P] = A[P],A[0]
    for j in range(1,len(A)):
        if(A[j]<=A[0]):
            A[j],A[i] = A[i],A[j]
            i += 1
    return i

def quick_sort(A):
    global m
    if(len(A)==1 or len(A)==0):
        return A
    else:
        #三個元素比較 
        mid = (len(A)-1)//2
        P = A.index(sorted([A[0],A[mid],A[len(A)-1]])[1])
        i = partition(A,P)
        A[0],A[i-1] = A[i-1], A[0] 
        m += len(A) - 1
        A[:i-1] = quick_sort(A[:i-1])
        A[i:] = quick_sort(A[i:])
        return A
发布了10 篇原创文章 · 获赞 0 · 访问量 98

猜你喜欢

转载自blog.csdn.net/xcpython/article/details/103899639