zoukankan      html  css  js  c++  java
  • 最小表示法证明

    最小表示法证明

     

    设字符串为a[1],a[2],……,a[n]。该字符串形成环,即a[n]的后继为a[1],两者连接起来。

     

    设置两个指针i,j,一开始i=1,j=2,

    1.比较以i,j为始的字符串,字符串长度k从1到n递增,两个字符串不再相等或长度为n之后结束比较。

    2.当字符串长度k为n时,结束比较。当字符串长度k不为n,即两个字符串不相等,当以i为始的字符串大于以j为始的字符串(比较第k位即可,前面k-1位相等),则i=max(i+k+1,j+1);

    当以j为始的字符串大于以i为始的字符串(比较第k位即可,前面k-1位相等),则j=max(j+k+1,i+1);

    3.直到i>n或者j>n结束操作,最小字符串(其中一个)的首位置为a[min(i,j)];否则重复1,2,3操作。

     

    证明该方法的正确性:

    I.每次进行1,2操作后a[1]~a[i-1](排除j),a[1]~a[j-1](排除i)不能够作为最小字符串的首位置

    证明:

    设上一次的值为i,j,这一次的值为i’,j’。归纳假设,设上一次的值i和j满足a[1]~a[i-1] (排除j),a[1]~a[j-1](排除i)不能够作为最小字符串的首位置。

     

    1操作有a[i+k]>a[j+k]或a[i+k]<a[j+k](k<n):

     

    A:当a[i+k]>a[j+k],a[i]~a[i+k]都不能够作为最小字符串的首位置,因为以a[i+t](0<=t=k)作为字符串的首位置,大于以a[j+t]作为字符串首位置的字符串【它们前k-t位相同,而a[i+t+(k-t)]>a[j+t+(k-t)],即a[i+k]>a[j+k]】。即a[1]~a[i+k]不能够作为最小字符串的首位置。

     

    i’=max(i+k+1,j+1)是因为前面已经得证a[1]~a[i+k],a[1]~a[j-1]不能够作为最小字符串的首位置,而且j(j')可以排除。

     

    此时的i’满足a[1]~a[i’-1] 不能够作为最小字符串的首位置(排除j');

    j’=j,当前a[i]不能够作为最小字符串的首位置,满足a[1]~a[j’-1] 不能够作为最小字符串的首位置,得证。

     

    排除j,排除i的例子:

    cabcab的(i,j)变化:(1,2)->(3,2)(排除2)->(4,2) (排除2)->(5,2) (排除2)->结束

    bcabca的(i,j)变化:(1,2)->(1,3)(排除3)->(4,3) (排除3)->(5,3) (排除3)->(6,3) (排除3)

     

     

    B:当a[i+k]<a[j+k],同理得证。

     

    II.当k=len时退出,min(i,j)为最小字符串的首位置

    证明:

    设此刻的值为i,j。i,j不相等,设i<j。

    a[i]~a[i+len-1]和a[j]~a[j+len-1]相等,则说明j-i为一个循环节,其中一个最小字符串的首位置为i~j-1的其中一个。

    前面已证明a[1]~a[i-1](排除j),a[1]~a[j-1](排除i)不能够作为最小字符串的首位置,其中包含a[i+1]~a[j-1],所以得出最小字符串的开头位置为a[i](当然a[j]也可以,距离相差r*(j-i)的对应的数也可以)。

     

     

    III. 直到i>n或者j>n结束操作

    证明:

    前面已证明a[1]~a[i-1](排除j),a[1]~a[j-1](排除i)不能够作为最小字符串的首位置,当i>n,则位置j以外的字符串的其它数不能够作为最小字符串的首位置,即位置i为最小字符串的首位置;当j>n,则位置i以外的字符串的其它数不能够作为最小字符串的首位置,即位置j为最小字符串的首位置。得证。

     

    时间复杂度:

    每次操作1,2结束后,max(i,j)都会增加,而初始max(i,j)=2,而倒数第二次max(i,j)<=n,所以最多执行n次,时间复杂度O(n)。

     

     

     

  • 相关阅读:
    第二阶段冲刺--第五天
    git托管代码随笔--运用ssh传输,不用每次提交频繁输入github账号密码
    项目冲刺--第十天
    项目冲刺--第九天
    随堂练习--用例图练习
    项目冲刺--第四天
    第五次个人作业: 案例分析--微软必应词典客户端
    Code.R团队展示
    Android 自定义AlertDialog
    Ubuntu打开系统监视器查看进程&资源等信息
  • 原文地址:https://www.cnblogs.com/cmyg/p/7203585.html
Copyright © 2011-2022 走看看