# 閱讀筆記: Bottom-up Mergesort ## Notations * **比較次數** * $C_{b,td}(N)$ : 最佳狀況下, top-down 演算法的比較次數 * $C_{w,td}(N)$ : 最糟狀況下, top-down 演算法的比較次數 * $C_{a,td}(N)$ : 平均狀況下, top-down 演算法的比較次數 * $c_{n,m}$ : 在一次 $(n,m)$ 合併中的比較次數 * **機率與期望值** * $P\{\cdot\}$ 機率 * $E\{\cdot\}$ 期望值 ## 歷史回顧 ### 從週期函數分析 Top-down 合併排序 Bottom-up Mergesort 於引言中最後一段有說明: > this paper may be seen the complement to [[Flajolet, Golin]](#1) for the bottom-up algorithm. 這篇文章的架構是建立在 [[Flajolet, Golin, 1]](#1) 對 Top-down 合併排序的係數做漸進分析( asymptotics )得到一個較為精準的複雜度分析。 Flajolet 和 Golin 的作法是將分治法遞迴:$$f_N=f_{\lfloor \frac{N}{2} \rfloor}+f_{\lceil \frac{N}{2} \rceil}+e_N,\quad N\geq 2,\quad f_1=0$$, $e_N$ 根據不同問題而定。 藉由複變函數分析改寫成帶有一週期函數 $P(x)$ 的形式:$$N\log_2N+NP(\log_2N)+o(N)$$ Top-down 合併排序虛擬碼,摘錄自 [[1]](#1): ``` /* Flajolet, Philippe, and Mordecai Golin. * Mellin transforms and asymptotics: the mergesort recurrence. * */ Algorithm MergeSort(A[1,..,N]) if length of A > 0 then MergeSort(A[1,...,floor(N/2)]); MergeSort(A[ceil(N/2),...,N]); Merge(A[1,...,floor(N/2)],A[ceil(N/2),...,N],B[1,...,N]) /* Merges sorted lists A and B into list C * and then copies the result into list D * */ Procedure Merge(A, B, C); i=size(A), j=size(B); // Compare largest elements in each list while(i > 0, j > 0) do if(A[i] > B[j]) then {C[i+j]=A[i];i=i-1;} else {C[i+j]=B[j];j=j-1;} // Move contents of nonempty list over to C S=i+j; if(i > 0) then for k=S downto 1 do C[k]=A[k]; else for k=S downto 1 do C[k]=B[k]; for j=1 to i+j do D[k]=C[k]; ``` 以下是基於合併過程中三種情況下的比較次數: * Worst Case $<i,j>$ 合併,最糟情況下 $i+j$ 長度的串列需要做 $i+j-1$ 次比較,在非空串列中剩餘的元素個素 $S=1$ ,故在此狀況下 $e_N=N-1$: $$T(N)=T\left(\left\lfloor \frac{N}{2} \right\rfloor\right)+T\left(\left\lceil \frac{N}{2} \right\rceil\right)+N-1, \quad N\geq 2, \quad T(1)=0.$$ * Best Case $<\left\lceil \frac{N}{2} \right\rceil, \left\lfloor \frac{N}{2} \right\rfloor>$ 合併,,故在此狀況下 $e_N=\left\lfloor \frac{N}{2} \right\rfloor$: $$Y(N)=Y\left(\left\lfloor \frac{N}{2} \right\rfloor\right)+Y\left(\left\lceil \frac{N}{2} \right\rceil\right)+\left\lfloor \frac{N}{2} \right\rfloor, \quad N\geq 2, \quad Y(1)=0.$$ * Average Case 討論平均狀況,需要引入機率的概念來處理。令 $x$ 為非空串列中剩餘的元素個數,以 $x$ 元素形成的集合為 $X$ 。 $X$ 非空集合,因為最佳 $x=\left\lfloor \frac{N}{2} \right\rfloor$ 與最糟 $x=1$ 狀況皆存在於 $X$ 中。 而對於一個 $i+j$ 長度的串列,要將其分割成長度為 $i$ 子串列與長度為 $j$ 子串列,總共有 $\displaystyle{i+j\choose i}={i+j\choose j}$ 種分割方式。 則機率分布( probability distribution )為: $$Pr(X\geq x)=\dfrac{\displaystyle{i+j-x\choose i}+\displaystyle{i+j-x\choose j}}{\displaystyle{i+j\choose i}}.$$ 期望值: $$E(X)=\dfrac{i}{j+1}+\dfrac{j}{i+1}.$$ 在$<\left\lceil \frac{N}{2} \right\rceil,\left\lfloor \frac{N}{2} \right\rfloor>$ 合併中需要的比較次數為 $e_N=N-\gamma_N$ 此處根據期望值可得 $$\gamma_N=\dfrac{\left\lfloor \frac{N}{2} \right\rfloor}{\left\lceil \frac{N}{2} \right\rceil+1}+\dfrac{\left\lceil \frac{N}{2} \right\rceil}{\left\lfloor \frac{N}{2} \right\rfloor+1}$$ 故平均比較次數的遞迴式為: $$U(N)=U\left(\left\lfloor \frac{N}{2} \right\rfloor\right)+U\left(\left\lceil \frac{N}{2} \right\rceil\right)+N-\gamma_N, \quad N\geq 2, \quad U(1)=0.$$ 假設串列有 $N$ 個元素, top-down 合併排序的比較次數有界: $$ \sum_{i=1}^{N-1} \nu(i) \leq C_n \leq \lceil \log_2 N \rceil N - 2^{\lceil \log_2 N \rceil} + 1 $$ 此處 $\lceil \cdot \rceil$ 為上取整函數( ceil function ),$\nu(i)$ 為 $i$ 以二進位表示法下 $1$ 的數量。實際演算法見[2024q1 第 4 週測驗題 population count](https://hackmd.io/@sysprog/linux2024-quiz4) <!-- 以 GeoGebra 繪製 $A(x)$ <iframe src="https://www.geogebra.org/calculator/vn4wua5e?embed" width="700" height="350" allowfullscreen style="border: 1px solid #e4e4e4;border-radius: 4px;" frameborder="0"></iframe> --> ### 針對合併排序中週期函數的分析 [[1, Theorem 1]](#1)以週期函數表示最糟比較次數: $$ N \log_2{N} +NA(\log_2{N})+1 $$ 此處 $A(x) = 1 -\{x\}-2^{1-\{x\}}$ 是週期為 $1$ 的週期函數。 $\{\cdot\}\equiv x - \lfloor x \rfloor$ ,當 $x$ 大於 $0$ 。 參見 [Fractional part](https://en.wikipedia.org/wiki/Fractional_part) 。 **證明:** 只要證明 $$ N \log_2{N} +NA(\log_2{N})+1 $$ 與 $$ \lceil \log_2{N} \rceil N - 2^{\lceil \log_2{N} \rceil} + 1 $$ 兩者等價即可。 把上取整數函數改寫成: $\begin{align} \lceil \log_2 N \rceil &= \log_2 N - \log_2N + \lceil \log_2 N \rceil \\ &= \log_2 N - \left(\log_2 N - \lceil \log_2 N \rceil \right) \\ &= \log_2 N - \left(\log_2 N - (\lfloor \log_2 N \rfloor+1) \right) \\ &= \log_2 N + 1 - \{ \log_2 N\} \end{align}$ 最後得到 $\begin{align} \lceil \log_2 N \rceil N - 2^{\lceil \log_2 N \rceil} + 1 &= \lceil \log_2 N \rceil N - 2^{\log_2 N + 1 - \{ \log_2 N\}} +1 \\ &= \lceil \log_2 N \rceil N -N2^{1 - \{ \log_2 N\}}+1 \\ &= N\left(\log_2 N + 1 - \{ \log_2 N\} -2^{1 - \{ \log_2 N\}}\right) +1 \\ & = N \log_2N +NA(\log_2N)+1 \end{align}$ ### 合併排序法最佳與最糟比較次數的表示法 [A000788 - OEIS](https://oeis.org/A000788) [A003071 - OEIS](https://oeis.org/A003071)查看這個數列的形式 ## 參考資料 <a id="1">[1]</a> Flajolet, Philippe, and Mordecai Golin. "Mellin transforms and asymptotics: the mergesort recurrence." Acta Informatica 31 (1994): 673-696. [wikipedia: Sorting number](https://en.wikipedia.org/wiki/Sorting_number) [](https://oeis.org/A003071)