一.本章内容小结

本章我们学习了串,数组和广义表

首先,我们学习了串,线性表主要由顺序表示或链式表示。在实际应用中,常以栈,队列,字符串等特殊形式使用。线性表和串的操作基本类似,但串的操作针对串的整体,而线性表则针对单个元素。

概念的理解并不复杂,接下来是实现所用的算法

1.BF算法

BF算法即暴风算法,是普通的模式匹配算法。BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法的优势在于他在思维上的简单,代码容易打,但是时间复杂度较大。

2.KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息

Position KMP(char *string,char* pattern)
{
	int n=strlen(string);
	int m=strlen(pattern);
	int s,p,*match;
	if(n<m) return NotFound;
	match=(int *)malloc(sizeof(int) *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++;
}

  以上是部分代码;

2.数组

分为一维数组,二维数组,和多维数组,概念相对简单。学习了压缩数组。对称矩阵多用下三角法,稀疏矩阵可用三元表法

3.广义表

从定义上,广义表是一种递归的线性表。

二.作业心得体会

本章作业中的编程题为  串的模式匹配

一开始要面对自己独立完成KMP算法,有点模糊,感觉难以下手,通过阅读老师在博客园的代码和复现完成了本次作业,争取以后能独立完成代码

int kmp(string sstring, string pstring)
{
    int *next = new int[pstring.length()];
    calc_next(pstring, next);//得到 next[]数组
    char *s = trans(sstring), *p = trans(pstring); //转字符串为字符数组
    int i=0, j=0;
    int pos = 0;
    
    while( i<=sstring.length() || j<=pstring.length()){
        if( j == -1 || s[i] == p[j]){
            i++;
            j++;
        }else{
            j = next[j];
           
        }
        
        
        if(j == pstring.length()){//匹配成功 
            pos = i-j+1;
            break; 
        }
    } 
    
    return pos;
    
}

  而实践一在了解到sort函数之前一直在实现sort的功能而反复调试,后面掌握了sort函数后基本行云流水。

代码就不放在这里了,在main函数就可以解决所有问题。

存在的问题:

在数据结构这门课上还是感觉比较吃力,难以独自完成,都是要通过帮助,其实也印证了我的学习还不够深入,理解也不够透彻,希望能加以改进。

下一阶段的目标:
将复现过的代码争取都能直接复现,而不需要各种各样的提示,当然对下一章内容也要能很好的掌握。