5.栈和队列有哪些具体应用?
栈:行编辑,括号匹配的检验,表达式求值,函数递归时存储当前环境。
队列:打印缓冲区中的数据
6.如何实现循环队列?有何好处?
实现:把数组弄成一个环,让rear和front指针沿着环邹,这样就可以产生循环队列
好处:循环队列是顺序队列的改进,在顺序队列中,在元素进队的时候,rear要向后移动,元素出队的时候,front也要向后移动,这样经过一系列的出队入队操作后,两个指针最后会达到数组的末端,此时虽然队中已经没有元素了,但是还是不能让元素入队,即出现“假溢出”现象。循环队列能够避免出现这个现象。
7.有哪些常用的字符串匹配算法?他们的算法思想分别是什么?
字符串匹配算法,一般由以下几种:
Brute Force算法:首先将匹配串和模式串左对齐,然后从左到右一个一个进行比较,如果不成功,则模式串向右移动一个单位。这种算法显然存在缺陷,每次匹配不成功时,前面匹配成功的信息也不能利用起来,速度很慢。
KMP算法:利用不匹配的字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离。它的改进在于,每当一趟匹配过程中出现字符比较不等时,不需要回溯比较指针,而是利用已经得到的福分匹配结果,将模式向右滑动尽可能远的距离后,继续进行比较。比如模式串ababac比较的时候发现在c处不匹配,然后看c前面那串字符串的最大相等前后缀,然后再来移动。下面是模式串原始位置ababac,移动后ababac;因为后缀已经是匹配了的,二前缀后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c处,也就是现在的第二个b处进行比较。
Horspool算法:模式串是从右到左进行比较,出现不匹配时,找到匹配串中不匹配的字符在模式串的位置,将模式串中该字符的位置与匹配串中该不匹配字符对齐后,从右到左继续比较。
Boyer-Moore算法:BM算法很复杂,理论上课KMP差不多,但实际上比KMP要快,分为两步预处理。
Sunday算法:算法思想和Horspool有些相似,比BM快而且更简单,当出现不匹配时,不是去找匹配串中不匹配的字符在模式串中的位置,而是直接找匹配中最右边对齐的有一位的那个字符在模式串的位置。
8.特殊矩阵与稀疏矩阵分别如何进行压缩处理?
特殊矩阵:
非零元素的分布具有明显的规律,可以将其压缩到一个一维数组中,关键是找到非零元在一维数组中的对应关系。
对称矩阵:可划分为三个部分(上三角区、主对角线、下三角区),采用二维数组会浪费掉几乎一半的空间,因此只存放主对角线和下三角区的元素。
三角矩阵:比如下三角矩阵存储思想是,存储完下三角区和主对角线上的元素后,紧接着存储对角线上方的常量一次。
三对角矩阵:带状矩阵,将三条对角线上的元素按行优先方式存放在一维数组中。
稀疏矩阵:
矩阵零元素个数远大于非零元素个数的矩阵,常规存储的话,非常浪费时间,因此考虑仅存储非零元素的信息,但是由于非零元素的分布没有规律,因此还要存储它所在的行和列。
即:将非零元素及其相应的行列构成一个三元组(行标、列标、值)来进行存储。