由SS表构造GS表(O(m))

暴力构造:

for (unsigned int j = 0; j < m; j++) gs[j] = m; //初始化
for (ui j = 0; j < m; j++)
	if (ss[j] == j + 1)
		for (ui i = 0; i < m - j - 1; i++)
			gs[i] = min(gs[i], m - j - 1);
	else
		gs[m - ss[j] - 1] = min(gs[m - ss[j] - 1], m - j - 1);
for (ui i = 0; i < m; i++)
	cout << gs[i] << " ";

先对ss[j] == j + 1的情况处理,注意到:j↑,m-j-1↓。因此,赋值区间不断缩小,且赋的新值必小于原值。

for (unsigned int j = 0; j < m; j++) 
	gs[j] = m; //初始化
for (ui j = m - 1, i = 0; j < UINT_MAX; j--)
	if (ss[j] == j + 1)
		for (; i < m - j - 1; i++)
			gs[i] = m - j - 1;
for (ui j = 0; j < m - 1; j++)
	if (ss[j] != j + 1)
		gs[m - ss[j] - 1] = min(gs[m - ss[j] - 1], m - j - 1);

再对ss[j] != j + 1的情况处理,注意到:gs的原值中,gs[i < m - j - 1] = m - j - 1 > i,因此,gs[i] > i。而ss[j] < j + 1,m - ss[j] - 1 > m - j - 2,即m - j - 1 <= m - ss[j] - 1 < gs[m - ss[j] - 1]。故min(gs[m - ss[j] - 1], m - j - 1) = m - j - 1。并且,即便ss[j] == j + 1,也不过是等价于上面的gs[i = m - j - 2] = m - j - 1。因此可优化为:

for (unsigned int j = 0; j < m; j++) gs[j] = m; //初始化
for (unsigned int i = 0, j = m - 1; j < UINT_MAX; j--) //逆向逐一扫描各字符P[j]
	if (j + 1 == ss[j]) //若P[0, j] = P[m - j - 1, m),则
		while (i < m - j - 1) //对于P[m - j - 1]左侧的每个字符P[i]而言(二重循环?)
			gs[i++] = m - j - 1; //m - j - 1都是gs[i]的一种选择
for (unsigned int j = 0; j < m - 1; j++) //画家算法:正向扫描P[]各字符,gs[j]不断递减,直至最小
	gs[m - ss[j] - 1] = m - j - 1; //m - j - 1必是其gs[m - ss[j] - 1]值的一种选择
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源包含了几乎所有的数据结构的动画视频,帮助我们更好的理解数据结构与算法的编程思路。 目录如下: 'B树的删除.swf', 'B树的生长过程.swf', '三元组的转置.swf', '中序线索化二叉树.swf', '的顺序存储.swf', '二分查找.swf', '二叉排序树的删除.swf', '二叉排序树的生成.swf', '二叉树的建立.swf', '克鲁斯卡尔算法构造最小生成树.swf', '冒泡排序.swf', '分块查找.swf', '单链结点的删除.swf', '单链结点的插入.swf', '图的深度优先遍历.swf', '基数排序.swf', '堆排序.swf', '头插法建单链.swf', '寻找中序线索化二叉树指定结点的前驱.swf', '寻找中序线索化二叉树指定结点的后继.swf', '尾插法建.swf', '希儿排序.swf', '开放定址法建立散列.swf', '归并排序.swf', '循环队列操作演示.swf', '快速排序.swf', '拉链法创建散列.swf', '拓扑排序.swf', '最短路径.swf', '朴素匹配算法过程示意.swf', '构造哈夫曼树的算法模拟.swf', '构造哈夫曼树过程.swf', '栈与递归.swf', '树、森林和二叉树的转换.swf', '桶式排序法.swf', '直接插入排序.swf', '直接选择排序.swf', '邻接示的图的广度优先遍历.swf', '邻接示的图的深度优先遍历.swf', '顺序查找.swf', '顺序栈(4个存储空间).swf', '顺序栈(8个存储空间).swf', '顺序的删除运算.swf', '顺序的插入.swf', '顺序队列操作.swf'。 (注:.swf动画格式可直接使用播放器打开。)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值