2018.4.5课堂笔记
【trie树】
trie树
存在的问题
1.空间大
不能用数组存(一般)
如果字母表特别特别大
(1.邻接表+hash
(2.平衡树存字母表
2.缩编加速
a->b->c->d----》a->bcd
【后缀树】
用Tre来实现kmp的功能
把文本串的所有后缀建一个trie树
--》后缀树
两个后缀的最长公共前缀
就是后缀树(trie树)中对应叶子节点的lca
后缀数组,
把后缀数组放在那,从左往右看每个叶子节点的编号所构成的数组,就是后缀数组
笛卡尔树
从后缀数组建后缀树
后缀数组实际上就是将所有后缀按字典序排序
如何快速的讲两个后缀数组排序?
用倍增算法。
因为很有可能出现大量重复。
我们可以很轻松的用桶给单个字符排序
那么同样,我也可以通过已经排好序的单个字符,给长度为二的字符串排序,
长度为4,长度为8的。。。同理
所以时间复杂度是O(nlogn)
这个时间实际上是非常快的
后缀数组的应用
(1 求某两个后缀数组的最长公共前缀
sa[]表示后缀数组(已经排好序的)
例 :abcabd
sa[]={1,4,2,5,3,6}
1 abcabd
4 abd
2 bcabd
5 bd
3 cabd
6 d
hight[n]=sa[n-1]和sa[n+1]的最长公共1前缀
某两个后缀的最长公共前缀,等于这两个后缀在后缀数组里的排名中间所有的hight的最小值
如何求hight?
h表示每一个后缀最多能匹配多少位
证明:h[i+1]>=h[i]-1;
h[i]<=1;一定成立
h[i]>1
h[i]=hifht[rank[i]]
【整理】
sa每一个后缀的编号
排序后的sa值存进数组
rank第i个数对应的对应后缀数组中的哪个数
heght相邻两个后缀数组中的后缀的最长公共前缀
有一个性质:LCA(i,j)=RMQ(height[rand[i+1],height[rand[j]),求区间最小值
利用这个性质求出任意后缀的最长公共前缀
事件E
什么情况会出现在你的事件里
随机变量X
X=a1,a2,a3,.....,an
P(X)=ai;
期望
平均的取值就是期望
EX=sigma pi ai (I=1......n)
方差=E(X-EX)^2
DV[X]=1;
期望的线性性
E(X+Y)=EX+EY
期望的独立性
x=x1....xn y=y1......yn
p(x=xi,y=yi)=p(x=xi)p(y=yi)
在独立性的前提下
E(X*Y)=EX*EY
注:只有在独立的情况下乘法才能满足线性