那些基础算法的 数学不等式 @快排分划 @kmp覆盖函数

 

这里做个说明: 那个覆盖函数第二个分支还不了接:

 

正文:

 

 

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;

}

posted @ 2012-04-01 21:21  os66  阅读(289)  评论(0编辑  收藏  举报