zoukankan      html  css  js  c++  java
  • 那些基础算法的 数学不等式 @快排分划 @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;

    }

  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/titer1/p/2429370.html
Copyright © 2011-2022 走看看