2

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]),求区间最小值

利用这个性质求出任意后缀的最长公共前缀

 

 【概率与期望】P(E)

事件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 

注:只有在独立的情况下乘法才能满足线性 
posted @ 2018-04-05 16:31  DDYYZZ  阅读(370)  评论(0编辑  收藏  举报