首页 > 代码库 > 最小表示法

最小表示法

下面对有用到的概念和符号进行声明:

最小表示法:将一个周期已知的周期循环字符串,以字典序最小的周期进行表示的方法。

最小周期:字典序最小的那个周期,用M表示

T:代表周期

循环字符串:即S[i+T]=S[i]

设S是一循环字符串

S(i):代表S中以下标i为开始的一个周期。

S(i)>S(j):代表S(i)的字典序大于S(j)

S(i)=S(j):代表S(i)于S(j)的字典序相等,即完全匹配。

同构字符串:设W,U同构,则存在常数r使得W[i+r]=u[i],r称为W,U间的相位差

性质1:假设W,U两个串是同构循环字符串循环

则存在0 <=p,q<T ,满足有W(p)=U(q)=M

性质2,若W[i+x]=U[j+x] (x=0,1,2……k-1) 且W[i+k]>W[j+k]

则有 W(i+x)>U(j+x)(x=0,1,2,……k-1,k)

一,用最小表示法匹配同构字符串的原理

假设i<=p,j<=q。W,U是互相同构的周期字符串

W(i),U(j)的匹配结果:

1.当匹配到k时失败

  若W[i+k]<U[j+k]

  说明U(i)<W(i)

  这时保持i不变,改变j

  若W[i+k]>U[j+k]

  说明U(i)>W(i)

  这时保持j不变,改变i

  即保持字典序较小的那个不变,

2,当k=T-1时还是成功

  说明U(i)=W(i)

  即W(i)与U(j)相位差为i-ji

  即W[x+i-j]=U[x]

 

这样最坏情况就是,i=p,j=q才匹配成功

因为W(q)和U(p)是最小周期,所以i,j到了p,q无法在继续前进。现在的问题是如果快速的移动i,j,

以往我们移动i,j,的方法是暴力枚举,即匹配失败后我们只移动一格,但是效率实在太低了。然而如果利于的字典序的话,我们就能让i,j跳起来!,从而在O(n)的时间内完成匹配

不妨假设W(i),和U(j)在下标k处匹配失败(0<=k<=T-1)且W(i)>U(i)

1.W[i+k]>U[j+k]

2.W[i+x]=U[j+x] (x=0,1,2……k-1)

由1,2(即性质2)可得

W(i+x)>U(j+x) (x=0,1,2……k)

说明存在比W(i+x)字典序还小的周期

W(i+x)(x=0,1,2……k)都不是最小周期

所以i+k<q

所以i可以放心的移动到i+k+1

同理当W(i)<U(i)时

j可以放心的移动到j+k+1

这样我们实现在不浪费每次匹配的情况下完成了匹配

即使在结果为i=p,j=q的最坏情况下,也只要匹配p+q+n个字符 。

二.求最小表示法

求最小表示法的关键在于利用性质2,快速排除字典序较大的周期

设循环字符串S的最小表示为S(q), 0<=q<T

显然若S(i)=S()

三,其他应用

1.求最小周期周期

2.求最大表示

3.求最大的表示的最大下标

 

最小表示法