首页 > 代码库 > 最小表示法
最小表示法
下面对有用到的概念和符号进行声明:
最小表示法:将一个周期已知的周期循环字符串,以字典序最小的周期进行表示的方法。
最小周期:字典序最小的那个周期,用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.求最大的表示的最大下标
最小表示法