第四章学习小结

一、内容小结

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 
#include  
#include 
#include 
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 ) {
        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 ( sm ) {
        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;  
}
KMB算法

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的编程题老是卡在最后一个测试点,就运行超时,真是令人头大。

三、学习目标

第五章内容跟上进度,学会优化代码,不要再运行超时啦!!!!

你可能感兴趣的:(第四章学习小结)