一、内容小结
1、串有两种基本存储结构:顺序存储(定长、堆式)和链式存储。
//串的定长顺序存储结构 #define MAXLEN 100 // 可由用户定义的块大小 typedef struct { char ch[MAXLEN+1]; int length; // 串长度 } SString; //串的堆式顺序存储结构 typedef struct { char *ch; int length; // 串长度 } Hstring; //串的链式存储结构 #define CHUNKSIZE 80 // 可由用户定义的块大小 typedef struct Chunk { char ch [CHUNKSIZE]; struct Chunk *next; }Chunk; typedef struct { Chunk *head, *tail; // 串的头指针和尾指针 int curlen ; // 串的当前长度 }LString;
2、串的部分主要学串的匹配,BF算法简单粗暴,容易理解但时间复杂度高,KMP算法耗时短但较难理解,开始我以为我大概听懂了思路,但到了算法实现的部分时才发现...其实我还没懂,特别是next(match),还是需要多看几遍视频琢磨琢磨,捋顺思路。
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> using namespace std; typedef int Position; #define NotFound -1 void BuildMatch( char *pattern, int *match ) { Position i, j; int m = strlen(pattern); match[0] = -1; for ( j=1; j<m; j++ ) { i = match[j-1]; while ( (i>=0) && (pattern[i+1]!=pattern[j]) ) i = match[i]; if ( pattern[i+1]==pattern[j] ) match[j] = i+1; else match[j] = -1; } } Position KMP( char *string, char *pattern ) { int n = strlen(string); int m = strlen(pattern); Position s, p, *match; if ( n < m ) return NotFound; match = new Position[m]; BuildMatch(pattern, match); s = p = 0; while ( s<n && p<m ) { if ( string[s]==pattern[p] ) { s++; p++; } else if (p>0) p = match[p-1]+1; else s++; } return ( p==m )? (s-m) : NotFound; } int main() { char string[] = "This is a simple example."; char pattern[] = "simple"; Position p = KMP(string, pattern); if (p==NotFound) cout << "Not Found.\n"; else cout << string+p; return 0; }
3、补充了稀疏数组的压缩存储,可由三元组或十字链表来表示。
typedef struct { int i;// 行下标 int j;// 列下标 Elemtype vlaue;// 非零元素值 } node; typedef struct { int lines;// 行数 int columns;// 列数 int non-zeros;// 非零元素个数 node *data;// 用于存储非零元素的一维数组,数组空间在初始化时再申请 } triple;
typedef struct OLNode { int i;//行下标 int j;//列下标 ElemType value;//非零元素值 struct OLNode *right, *down;//指针域 右指针 下指针 }OLNode, *OLink; typedef struct { OLink *rhead;//行链表头指针 OLink *chead;//列链表头指针 int mu,nu,tu;//矩阵的行数,列数和非零元的个数 }CrossList;
4、了解了广义表的定义和它的两种存储结构。
二、学习心得
本来以为第四章的内容会好上手一些,毕竟串和数组都是有学过一些的,结果...点一首《没那么简单》送给快被next逼疯的自己,感谢美美雪中送炭,我终于get到了next的值是怎么得来的。
这周课堂上讲了不少与时间复杂度分析及计算相关的内容,听完后感觉下次分析算法时间复杂度时比较好下手了。
讨论题的话主要卡在string的返回类型以及它与char[ ]和char*的关系。
PTA的编程题老是卡在最后一个测试点,就运行超时,真是令人头大。
三、学习目标
第五章内容跟上进度,学会优化代码,不要再运行超时啦!!!!
原文:https://www.cnblogs.com/ShanaYang/p/12792256.html