这里做个说明: 那个覆盖函数第二个分支还不了接:
正文:
procedure QSort(L,U)
if L >« U then
/* at most one element, do nothing */
else
/* partition array around a given
value, which is eventually
placed in its correct position P
*/
QSort(L, P-1)
QSort(P+1, U)
procedure QSort(L,U)
if L < U then
Swap(X[L], X[RandInt(L,U)])
T := X[L]
M := L
for I := L+1 to U do
/* Invariant: X[L+1..M] < T and X[M+1..I-1] >= T */
if X[I] < T then
M := M+1
Swap(X[M], X[I])
Swap(X[L], X[M])
/* X[L..M-1] < X[M] <= X[M+1..U] */
QSort(L, M-1)
QSort(M+1, U)
再次注明:其实第一版本 珠儿 是没有 那个混合版本排序的
计算这个overlay函数的方法可以采用递推,可以想象如果对于pattern的前j个字符,如果覆盖函数值为k
a0a1...ak-1ak= | aj-kaj-k+1...aj-1aj |
则对于pattern的前j+1序列字符,则有如下可能
⑴ pattern[k+1]==pattern[j+1] 此时overlay(j+1)=k+1=overlay(j)+1
66 | 这是最幸运的情形 |
⑵ pattern[k+1]≠pattern[j+1]
此时只能在pattern前k+1个子符组所的子串中找到相应的overlay函数,
h=overlay(k),
如果此时pattern[h+1]==pattern[j+1],则overlay(j+1)=h+1否则重复(2)过程.
66 | 这里就是利用 自我覆盖函数 overlay数组的时候 |
| 书上的代码 还有一个分支:详细如下 简化代码 |
if ( target[target_index] ==pattern[pattern_index] )
//luky one
{
++target_index;
++pattern_index;
}
else if( pattern_index ==0){
++target_index; //?? 66分析,这说明刚才pattern_index 开始,或者被打到老家了
}
else{
pattern_index=overlay_value[pattern_index -1] +1;
}