[数据结构]字符串,数组与特殊矩阵,递归

文章目录

  • 字符串
    • 具体类型定义
    • 字符串的模式匹配
      • 模式匹配---BF算法
      • 模式匹配---KMP算法
      • KMP算法next向量计算方法
  • 数组
    • 二维数组映射方式
    • 特殊矩阵-压缩存储
      • 对称矩阵
      • 三角矩阵
      • 对角矩阵
    • 稀疏矩阵-压缩存储
      • 三元组表
      • 十字链表
  • 递归
  • 复杂递归程序到非递归程序的转换
    • 递归函数,求数组中的最大数
    • 编写函数,采用递归法实现数组首尾倒置
    • 递归查找(顺序,二分)
  • 课上答疑

字符串

顺序串:用数组来存储串中的字符序列

具体类型定义

#define MAXSIZE 100
typedef struct
{
	char str[MAXSIZE];
	int length;
}seqstring;

链接串:用链接存储结构来存储串

字符串的模式匹配

模式匹配指的是寻找字符串p在字符串t中首次出现的起始位置,其中p为模式,t为正文,t的长度远远大于p的长度

模式匹配—BF算法

[数据结构]字符串,数组与特殊矩阵,递归_第1张图片
[数据结构]字符串,数组与特殊矩阵,递归_第2张图片
[数据结构]字符串,数组与特殊矩阵,递归_第3张图片
综上:普通模式匹配效率较低

模式匹配—KMP算法

[数据结构]字符串,数组与特殊矩阵,递归_第4张图片
[数据结构]字符串,数组与特殊矩阵,递归_第5张图片

KMP算法next向量计算方法

[数据结构]字符串,数组与特殊矩阵,递归_第6张图片

数组

二维数组映射方式

  • 按行优先
    [数据结构]字符串,数组与特殊矩阵,递归_第7张图片
    [数据结构]字符串,数组与特殊矩阵,递归_第8张图片
  • 按列优先

特殊矩阵-压缩存储

[数据结构]字符串,数组与特殊矩阵,递归_第9张图片

对称矩阵

[数据结构]字符串,数组与特殊矩阵,递归_第10张图片

三角矩阵

  • 上三角
    [数据结构]字符串,数组与特殊矩阵,递归_第11张图片
  • 下三角 [数据结构]字符串,数组与特殊矩阵,递归_第12张图片
    [数据结构]字符串,数组与特殊矩阵,递归_第13张图片

对角矩阵

[数据结构]字符串,数组与特殊矩阵,递归_第14张图片
[数据结构]字符串,数组与特殊矩阵,递归_第15张图片注意这里从0开始

稀疏矩阵-压缩存储

三元组表

[数据结构]字符串,数组与特殊矩阵,递归_第16张图片
按行优先逐个记录,先左后右,先上后下
是否对应惟一的稀疏矩阵?
不是,不知道是按行优先还是按列优先

typeodef struct{
int data[100][100];
int m,n;
}matrix;
typedef int spmatrix[100][3];
void compressmatrix(matrix A,spmatrix B)
{
int i,k=1;//第一行
for(i=0;i<A.m;i++)
for(j=0;j<A.n;j++)
if(A.data[i][j]!=0){
	B[k][0]=i;
	B[k][1]=j;
	B[k][2]=A.data[i][j];
	k++;
	}
	B[0][0]=A.m;//行数,列数,非0元素的总个数存储
	B[0][1]=A.n;
	B[0][2]=k-1;
}

十字链表

递归

[数据结构]字符串,数组与特殊矩阵,递归_第17张图片
最简单的例子

void print(int n)
{
if(n>0)
	{
	printf("%d:",n);
	printf("How are you\n");
	print(n-1);
	}
}
  • 循环迭代:自底向上
  • 递归:自顶向下

复杂递归程序到非递归程序的转换

[数据结构]字符串,数组与特殊矩阵,递归_第18张图片
递归

#define MAXSIZE 20
typedef int listarr[MAXSIZE];
void listorder(listarr list,int left,int right)
{
int mid;
if(left<=right)
{
mid=(left+right)/2;
printf("%4d",list[mid]);
listorder(list,left,mid-1);
listorder(list,mid+1,right);
}
}

非递归:听不懂,以后来补笔记

递归函数,求数组中的最大数

int max(int a[],int left,int right)
{
int lmax,rmax,mid;
if(left==right){//只含有一个元素
	return a[left];
	}
else{
	mid=(left+right)/2;
	lmax=(a,left,mid);//注意这里不是mid-1
	rmax=(a,mid+1,rigth);
	return lmax>rmax?lmax:rmax;
	}
}

编写函数,采用递归法实现数组首尾倒置

void reverse(int a[],int left,int right)
{
int temp;
temp=a[left];
a[left]=a[right];
a[right]=temp;
reverse(a,left+1,right-1);
}

递归查找(顺序,二分)

尾递归

int seqSearch(int a[],int n,int x)
{
if(n==0) return -1;
else if(n==1) return a[n-1]==x?n-1:-1;
else if(a[0]==x) return -1;
else return seqSearch(a,n-1,x);
}
int seqSearch(int a[],int left,int right)
{
if(left>right) return -1;
else if(left==right) return a[n-1]==x?left:-1;
else if(a[left]==x) return -1;
else return seqSearch(a,left+1,right);
}

课上答疑

用kmp算法,abaabaabcabaabc中abaabc需要对比多少字符?
在这里插入图片描述
10次

你可能感兴趣的:(数据结构,数据结构)