后缀数组:
1.倍增算法O(nlogn);
2.DC3算法O(n);
在字符窜后加一个小于所有字符的字符;
f=g+h;
g:是已知的代价;
h:预估代价;
h<实际代价;
开放列表(优先队列)中取最小,时候加入到关闭列表,每次更新判断是否在关闭列表;
评估函数:任意节点的评估值f必须不小于父节点的f值,即f单调递增;
IDA*
预定maxh;
当maxh<now+h剪枝;
在程序实现上,IDA*要比A*方便,因为不需要保存结点,不需要判重复,也不需要根据h值对结点排序,占用空间小
ac自动机,tire图
1.建立tire树;
2.建立ac自动机
用bfs,找到fail指针、匹配长度、匹配量……等所需信息;
3.文本匹配,获取信息;
后缀数组
1.倍增算法。
2.DC3算法
要在字符窜后加一个比所有字符都小的字符。
能得到字符窜所有后缀的排名
双连通分量,求无向图的桥(割边),割点。
强连通分量,求有向图。
都有Tarjan算法。
矩阵乘法O(M^3*logN),直接转移O(M^2*N);所以当N比较大时,M比较小时用它。
1.倍增算法O(nlogn);
2.DC3算法O(n);
在字符窜后加一个小于所有字符的字符;
但DC3的基数比较大,实际效率1.5:1左右;
f=g+h;
g:是已知的代价;
h:预估代价;
h<实际代价;
开放列表(优先队列)中取最小,时候加入到关闭列表,每次更新判断是否在关闭列表;
评估函数:任意节点的评估值f必须不小于父节点的f值,即f单调递增;
IDA*
预定maxh;
当maxh<now+h剪枝;
在程序实现上,IDA*要比A*方便,因为不需要保存结点,不需要判重复,也不需要根据h值对结点排序,占用空间小
ac自动机,tire图
1.建立tire树;
2.建立ac自动机
用bfs,找到fail指针、匹配长度、匹配量……等所需信息;
3.文本匹配,获取信息;
可用于状态转移,去除失败状态,得到转移的矩阵(一般边长为状态数),然后进行dp,快速幂等;
可以直接在ac自动机上直接dp而不得出矩阵;
后缀数组
1.倍增算法。
2.DC3算法
要在字符窜后加一个比所有字符都小的字符。
能得到字符窜所有后缀的排名
双连通分量,求无向图的桥(割边),割点。
强连通分量,求有向图。
都有Tarjan算法。
矩阵乘法O(M^3*logN),直接转移O(M^2*N);所以当N比较大时,M比较小时用它。