优化ss[]表构造提升gs[]表构建效率

需积分: 50 64 下载量 194 浏览量 更新于2024-08-05 收藏 21.63MB PDF 举报
本资源主要讨论的是数据结构中的一个重要概念——由ss[]表构造gs[]表的方法,这是基于SAE J1772-2017标准中的一个算法。在文本处理和字符串匹配中,ss[]和gs[]表通常用于计算最长公共前后缀(LCP)数组,这对于许多字符串操作如编辑距离计算、后缀数组构建等至关重要。 首先,ss[]表(前缀函数)存储的是每个位置j的最长公共前缀长度,而gs[]表则是基于ss[]表进一步构建的,用于找到更安全的LCP值。在构建过程中,如果一个位置j满足ss[j] <= j,这意味着MS[j](前缀的后缀)只包含P[0, j]的一部分,同时,如果P[m - ss[j] - 1]不等于P[j - ss[j]],那么m - j - 1可以成为gs[m - ss[j] - 1]的候选值。gs[i]的值就是所有候选中最小的一个,这可以通过画家算法(一种高效的查找算法)来实现,时间复杂度为O(m)。 ss[]表的构造采取了逆向扫描的方式,从后往前计算ss[j]值,利用已知的P[m - hi + j - 1]来推断ss[j],这样可以避免重复扫描,大大提高了效率,降低了时间复杂度至O(m)。这个过程涉及到两个情况:当ss[m - hi + j - 1] <= j - lo时,ss[j]可以直接取ss[m - hi + j - 1];另一种情况则需要进一步分析。 整个过程体现了对数据结构和算法的有效运用,特别是对于字符串处理中的高级技巧,比如前缀函数的计算,这对于C++编程中的字符串操作和算法设计具有实际意义。此外,文本中还提到了该方法是清华大学985名优教材立项资助的结果,反映出该算法被广泛应用于教育领域,教材编写者邓俊辉教授强调了教材既要保持基础知识的稳定性,又要与时俱进,适应科技发展。 该资源详细讲解了如何利用ss[]表高效地构造gs[]表,以及这种算法在计算机科学教育中的应用,对于理解字符串处理和数据结构优化有着深入的指导价值。

#define _CRT_SECURE_NO_WARNINGS //顺序存储的栈 实现文件 ///////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct SeqStack { int* data; // 数据元素指针 int top; // 栈顶元素编号 int max; // 最大节点数 }SeqStack; /*创建一个栈*/ SeqStack* SS_Create(int maxlen) { SeqStack* ss = (SeqStack*)malloc(sizeof(SeqStack)); ss->data = (int*)malloc(maxlen * sizeof(int)); ss->top = -1; ss->max = maxlen; return ss; } /*释放一个栈*/ void SS_Free(SeqStack* ss) { free(ss->data); free(ss); } /*清空一个栈*/ void SS_MakeEmpty(SeqStack* ss) { ss->top = -1; } /*判断栈是否为满*/ int SS_IsFull(SeqStack* ss) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ if (ss->top == ss->max - 1) return 1; return 0; /******END******/ } /*判断栈是否为空*/ int SS_IsEmpty(SeqStack* ss) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ if (ss->top == -1) return 1; return 0; /******END******/ } /*将x进栈,满栈则无法进栈(返回0,否则返回1)*/ int SS_Push(SeqStack* ss, int x) { //务必看清楚使用的是C语言还是C++喔 /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ /******END******/ } /*出栈,出栈的元素放入item,空栈则返回0,否则返回1*/ int SS_Pop(SeqStack* ss, int* item) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ /******END******/ } /*从栈底到栈顶打印出所有元素*/ void SS_Print(SeqStack* ss) { if (SS_IsEmpty(ss)) { printf("stack data: Empty!\n"); return; } printf("stack data (from bottom to top):"); int curr = 0; while (curr <= ss->top) { printf(" %d", ss->data[curr]); curr++; } //printf("\n"); } int main() { int max; scanf("%d", &max); SeqStack* ss = SS_Create(max); char dowhat[100]; while (1) { scanf("%s", dowhat); if (!strcmp(dowhat, "push")) { int x; scanf("%d", &x); SS_Push(ss, x); } else if (!strcmp(dowhat, "pop")) { int item; SS_Pop(ss, &item); } else { break; } } SS_Print(ss); SS_Free(ss); }

2023-06-10 上传