字符串与模式匹配算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中定义的字符串
• 存储结构: 字符指针 … \0 • 操作: <string.h>
– char *strcpy(char *dst, char *sorc)
– int strcmp(char *str1, char *str2); – char* strcat(char *dest, const char* sorc,size); – char* strstr(char *str, const char *strSearch);
•6 •3
•12 •2
•10 •1
•11 •0
•3 •2
•5 •1
•9 •0
两个一元多项式的乘法
• 可以利用两个一元多项式相加的算法来实现 • M(x) = A(x) B(x)
= A(x) [b1xe1+b2xe2+...+bnxen] =
•O(n2)复杂度的运算。
字符串与模式匹配:
• 字符串概念与抽象数据类型 • 串模式匹配
链表的用用:一元多项式和运算
• 一元多项式:Pn(x) = p0+p1x+p2x2+…+pn xn • 线性表表示:P=(p0, p1, p2, …, pn)
• 顺序表表示:只存系数(第i个元素存xi的系数)
•
特殊问题:p(x) = 1+ 2x10000 + 4x40000
• 链表表示: 每个结点结构 •系数 •指数
顺序串示例
• s = “abcdefg”
•s.n = 7 •s.c
•a •b •c •d •e •f •g
•0 1 2 3 4 5 6
MAXNUM-1
字符串ADT —— 创建顺序结构空串
PSeqString createNullStr_seq( int m )
{
PSeqString pstr = (PSeqString)malloc(sizeof(struct SeqString));
if (pstr != NULL)
{
pstr->c = (char* )malloc(sizeof (char)*m);
if (pstr->c != NULL) {
pstr->n = 0; pstr->MAXNUM = m; return (pstr)
•0 • -1
•1 •0
•2•10000
•4•40000 •^
一元多项式表示和运算-3
• 数据定义: typedef struct { float c; //系数 int e; //指数 struct item *next } Item ;
•加法: • 相同指数对应结点的系数项相加, • 如和为0,删除结点,否则必定为 • 和链表的一个结点。 • (实质上就是两个单链表的合并问题)
– size_t strlen(const char* str); – gets(char *); puts(char*);
串匹配函数:
char* strstr(const char[ ],constchar[ ]);
•线性表到字符串ADT
•String createNullStr (void) • 创建一个空串。 •int IsNullStr ( String s ) • 判断串s是否为空串,若为空串,则返回1,否则返回0。 •int length ( String s ) • 返回串s的长度。 •String concat (String s1, Sting s2 ) • 返回将串s1和s2拼接在一起构成的一个新串。 •String subStr (String s, int i, int j ) • 在串s中,求从串的第i个字符开始连续j个字符所构成的子串。 •int index (String s1, String s2 )
顺序表应用举例 —— Josephus问题
void josephus_seq( PSeqList palist, int s, int m)
{
int s1, i, w;
s1 = s - 1;
for( i = palist->n; i>0; i--)
/* 找出列的元素 */
{ s1 = ( s1 + m - 1 ) % i ; w = palist->element[s1]; printf(“Out element %d \n”,w);
• 如果串s2是s1的子串,则可求串s2在串s1中第一次出现的位置。
顺序结构字符串ADT的定义
•struct SeqString {
/* 顺序串的类型 */
• int MAXNUM;
/* 串允许的最大字符个数 */
• int n;
/* 串的长度,nMAXNUM */
• char *c;
•};
•typedef struct SeqString *PSeqString;
/*下一个出列的元素*/ /* 求下标为s1的元素的值 */ /* 元素出列 */
delete_seq(palist,s1);
/* 删除出列的元素 */
}
}
算法复杂度分析 (顺序结构)
• 步骤: – 1: 建立顺序表 – 2: 出列
• 时间复杂度分析:出列元素的删除(移动实现) 为基本运算(每次最多i-1个元素移动,需要n-1次 ) (n-1)+(n-2)+……+1 = n(n-1)/2 => O(n2)
字符串与模式匹配算法
来自百度文库
作业讲评:
链表应用举例 —— Josephus问题
• 求解Josephus问题的一般步骤为:
(1)首先利用线性表的一些运算如创建空线性表、插入元素等构 造Josephus表;
(2)从Josephus表中的第s个结点开始寻找、输出和删除表中的第 m个结点,然后再从该结点后的下一结点开始寻找、输出和删 除表中的第m个结点,重复此过程,直到Josephus表中的所有元 素都删除。
算法复杂度分析 (链表结构)
• 步骤: – (1)建立循环链表; – (2)找循环单链表中的第s个结点放在指针变量p中 – (3)从p所指结点开始计数寻找第m个结点,输出该结点的元素值 ; – (4)删除该结点,并将该结点的下一个结点放在指针变量p中, 转去执行(2),直到所有结点被删除为止;
• 时间复杂度分析: – 三部分时间(创建链表:O(n)+ 求第s个结点:O(s)+ 求n个第m个应出列的元素:O(m*n))