串,数组和广义表

本文探讨了字符串的线性表定义、子串概念、串操作及链式存储优化。介绍了基本的暴力破解模式匹配算法以及KMP算法在模式匹配中的应用。此外,还讲解了数组的基本概念、不同维度数组的存储公式,以及矩阵的压缩存储方法,如对称矩阵、三角矩阵和稀疏矩阵的存储策略。最后提到了广义表的概念及其在数据结构表示中的灵活性。
摘要由CSDN通过智能技术生成

只能是字符的线性表

子串

串中取任意字符包括串自身

子串位置

子串在串中第一个字符出现的位置

空格串

" "空格串

""空串

串的操作无非增删查改拼接等等,高级语言中都有相应的函数,即使没有使用线性表中各个函数结合也可以做到,这里就不具体实现了.

串的链式存储常用块链(一块中存几个字符,然后在指向下一块),可以增加密度.

串的模式匹配算法(这个特别常用)

其实就是串中所含子串(模式串)第一次出现的位置(就是查找定位)

BF算法(brute force)就是暴力破解

这个很有意义,暴力破解就是变量寻找变量之间的关系.然后找出匹配和不匹配的情况.但是实际上暴力破解嘛.还是不太可取的.

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str = "asfddsfdsafljlkjglkfdajg";
	string str2 = "dsa";

	int i = 0, j = 0;
	int index = 0;

	while (i < str.size() && j < str2.size())
	{
		if (str[i] == str2[j])
		{
			i++;
			j++;
		}
		else
		{
			j = 0;
			//i-j 减去原来的位置 +1 向后移动一位 其实无论什么要求都是在i和j这种变量之间寻找关系
			i = i - j + 1;
		}
	}

	if (j >= str2.size())
	{
        //减去子串的长度就是子串在串中的下标.
		index = i - str2.size();
	}
   
	cout << index << endl;			//7

	return 0;
}

KMP算法(这个是三个科学家名中各取一个字母)

这个算法真心好难理解,反正我是一直记不住,更是写不出来....

他是根据前缀和后缀来确定j的值,然后i一直向前就可以.

由于这个算法我也不理解,曾经看了没看太懂,写这个的时候又去看了一下,表示还没理解.我选择现在放弃.就不复制粘贴代码了实在没啥意义.

数组

相同类型的元素集合

线性表是特殊的数组也就是一维数组,一个前驱一个后继

二维数组,有两个前驱两个后继,物理上就是行列个一个前驱后继

同理三维数组就是三个等等

数组的操作就是构造,销毁,取值,赋值等等这里我也不进行实现了.

数组的结构是固定的,所以一般不会出现链式结构,同样数组中也一般不会出现插入删除操作.

数组存储公式(这个很重要哦)

loc(0,0) 起始位置(数组首地址)

L 类型大小

二维数组(loc(m,n))

loc(i,j) = loc(0,0) + (i * n + j) * L

三维数组(loc(m,n,p))

loc(i,j,k) = loc(0,0) + (i * n * p + j * p + k) * L

特殊矩阵存储压缩

矩阵常规存储

二维数组

矩阵常规存储特点

可以随机存取,密度为1

不适合常规存储的矩阵

相同元素多,且按照某种规律,0元素多

矩阵压缩存储

相同元素分配一个存储空间,0元素不分配空间

什么样的矩阵可以压缩

一些特殊的矩阵如,对称矩阵,三角矩阵,稀疏矩阵

稀疏矩阵

矩阵中非0元素个数少(%5)

对称矩阵

arr[i][j] == arr[j][i]

存储方法

只存储上(下)三角(包括对角线上的元素),占用 n * (n + 1) / 2 个空间.

一维数组arr[n * (n + 1) / 2]

arr[i][j] = arr[i - 1 + j - 1](具体算法为等差数列)

三角矩阵

对角线上(下)为相同元素,占用 n(n + 1) / 2 + 1 个空间

上三角下标:(i - 1)(2n - i + 2) / 2 + j - i - 1

下三角下标:i(i - 1) / 2 + j

对角矩阵

元素只在对角线(或平行)的区域(几条对角线就是几条对角矩阵)

从上到下存储,对角先以0为下标,上面的为负,下面的为正

稀疏矩阵

三元组

三元组存储是{i,j,arr[i][j]}

也就是二维数组arr[n][3]

首行元素存储三元组的总行数,总列数,总个数

可是三元组不能随机存储

十字链表

方便新元素的插入删除更加灵活

结点除了保存行,列,元素之外还需要两个指针,一个指针指向行下一个非零元素,另一个指针指向列下一个非零元素

行列都需要头指针,也就是两个头指针

广义表

又称列表(lists),线性表是相同类型元素,广义表不一定是相同类型元素.

每个元素可以是单独的一个元素,也可以还是一个广义表(子表)

广义表的灵活度很高,几乎任何数据结构(其实可以说成所有)都可以使用广义表来表示

广义表常规操作是获取表头和表尾.

广义表只能以链式存储

表头

广义表的第一个元素,可以是子表

表尾

广义表中除第一个元素外的子表

元素个数

最外层的元素个数,也就是说如果广义表中存在一个子表,那么它只代表一个元素.

深度

展开广义表,张开几次深度就是几,一个单纯元素(非子表)深度为0

共享

广义表可以共享,广义表A的元素可以是广义表B

递归表

广义表A(a,A) = (a(a,a(a,....)))

这里只是简单介绍,有兴趣的话可以自行查找资料.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值