最小表示法证明

最小表示法证明

 

设字符串为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)。

 

 

 

posted @ 2017-07-19 00:46  congmingyige  阅读(278)  评论(2编辑  收藏  举报