合法棧輸出隊列的充要條件
問題背景
Algorithm 4th (Robert Sedgewick, Kevin Wayne) 一書中有這樣一道習題:
1.3.46 Forbidden triple for stack generability. Prove that a permutation can be gener- ated by a stack (as in the previous question) if and only if it has no forbidden triple (a, b, c) such that a < b < c with c first, a second, and b third (possibly with other intervening integers between c and a and between a and b).
翻譯成中文,可以理解為:請證明:如果一個棧的出棧順序合法,當且僅當不存在這樣的 forbidden triple:在序列中編號 c 後有編號 a、b,其中 c和a, a和b可以有間隔,而且 a < b < c。
定理描述
對於任意一個棧,假設其入棧編號分別從 1 到 n,其出棧順序編號分別為 p1 到 pn。那麼
一個合法的出棧順序編號當且僅當對任意的 pm (m >= 1 且 m < n),從 pm+1開始,所有小於 pm 的子串嚴格單調遞減。
這個定理通俗的描述是,一個合法的出棧順序,對於任意一個編號,隨後所有小於這個編號的部分是嚴格單調遞減的。反過來也成立。
例如,下面這個入棧序列
1 2 3 4 5
的一個兩個出棧序列
- 3 2 1 5 4
- 3 1 2 5 4
第一個是合法的,第二個是不合法的,因為比編號 3 小的隨後的兩個數 1 2 是遞增的。
算法的證明
本文僅給出一個簡略的證明方法。假設在出棧過程中,在某一個步驟時,棧中存留的元素有 n 個,分別是 s1 到 sn。
此時,對於元素 sn,有兩種可能性。
1)在下一步時,可以選擇彈出 sn。那麼,比 sn 小的所有元素,只有兩種可能:
a. 還未出棧(不可能還未入棧,因為比它大的元素 sn 已經入棧了):則一定在 sn 後以遞減的順序出現在出棧隊列中(因為入棧的順序是嚴格遞增的)
b. 已經出棧:此時,比這個元素還小的元素如果還沒出棧,當它即將出棧的時候,就會又遞歸回到1)的情況。
2)可以不彈出 sn 而是繼續入棧,則又回到 1)的情況。
綜上所屬,對於這個元素 sn,其後續元素一定是單調遞減的。
原書的證明
原書給出的部分證明如下。
Partial solution: Suppose that there is a forbidden triple (a, b, c). Item c is popped before a and b, but a and b are pushed before c. Thus, when c is pushed, both a and b are on the stack. Therefore, a cannot be popped before b.
更多的證明和參考材料
棧序列及其生成算法(鄭州大學學報)Vol33,No 4,Dec 2001
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。