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;

    }

  • 相关阅读:
    常用C# 6.0 常用 新特性
    VS 编译总是出现错误: "LC.EXE 已退出,代码为1"
    C# XML封装
    VS 2015秘钥
    写入Txt文本信息
    C# 7.0 新特性
    Winform 弹框增加确定按钮并点击确定后进行下一步操作
    VS 代码过长自动换行
    C# 6.0 新特性
    string::npos 是什么 c++ /STL
  • 原文地址:https://www.cnblogs.com/titer1/p/2429370.html
Copyright © 2011-2022 走看看