一、一维数组与多维数组
1. 一维数组
一维数组的每个数组元素是一个序对,由下标(index)和值(value)组成。
数组的连续存储方式
2. 多维数组
二维数组的动态定义和初始化
int **A;
int row = 3, col = 3; int i, j;
A = new int* [row];
for(int i = 0; i < row; i++){
A[i] = new int [col];
}
存储方式
行优先:存好一行再存一行
列优先:存好一列再存一列
三维数组
各维元素个数为
下标为的数组元素的存储地址:
二、特殊矩阵
指非零元素或零元素的分布有一定规律的矩阵:对称矩阵、三对角矩阵。
1. 对称矩阵的压缩存储
对于一个的对称阵,可以只存其上三角矩阵或下三角矩阵,存的元素数量为。
假设一个数组只存其下三角矩阵,行优先
- 若,则则在下三角部分,在中有储存,下标为
- 若,则在上三角部分,去找,下标为
假设一个数组只存其上三角矩阵,行优先
- 若,则在上三角部分,在中有储存,下标为
- 若,则在下三角部分,去找,下标为
2. 三对角矩阵的压缩存储
三对角矩阵总共有个非零元素
在三条对角线上的元素满足:
矩阵的在矩阵中的位置为
若已知三对角矩阵中某元素在数组存放在第个位置,则有
三、稀疏矩阵
稀疏因子:对于矩阵有个非零元素,令稀疏因子,通常若,则称矩阵为稀疏矩阵
两种表示方式:三元组表示确定了矩阵的一个非零元素、正交链表表示
1. 三元组表示
三元组中的排列应该现根据行从小到大排,再根据列从小到大排
快速转置法
建立辅助数组rowSize、rowStart
2. 带行指针数组的二元组
3. 正交链表
优点:适应矩阵操作是矩阵非零元素的动态变化
表头结点:
| head | next |
|---|---|
| down | right |
question:next和right的作用是什么?有什么区别?
非零元素结点
| head | row | col |
|---|---|---|
| down | value | right |
四、字符串
字符串是个字符的有限序列。
1. 概念
子串:串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串
子串在主串中的位置:位置从0开始数,首次出现的首字母位置。
2. 模式匹配(KMP 算法)
在主串中寻找子串(第一个字符)在串中的位置
用一个next特征向量来确定:
当模式中第个字符与目标中相应字符失配时,模式中应当由哪个字符(设为第个)与目标中刚失配的字符重新继续进行比较
next数组的定义
next[i]表示模式串A[0]至A[i]这个字串,使得前个字符等于后个字符的最大值
五、广义表(General Lists)
1. 概念
广义表是个表元素组成的有限序列,记作。
是表名,是表元素,可以是表(称为子表),可以是数据元素(称为原子)。
是表的长度,的广义表为空表。
表头:表的第一个表元素
表尾:其他表元素组成的表称为广义表的表尾(tail)
线性表:只包含原子的表
纯表:所有元素在表中仅出现一次
再入表/共享表:存在元素在在表中出现多次
2. 特性
有次序性、有深度、有长度、有共享、可递归(本身为自己的子表)
A() // A长度为0,深度为1
B(6, 2) // B长度为2,深度为1
C('a', (5, 3, 'x')) // C长度为2,深度为2
D(B, C, A) // D长度为3,深度为3
3. 表头、表尾
A() // head(A) 和 tail(A) 不存在
B(6, 2) // head(B) = 6, tail(B) = (2)
C('a', (5, 3, 'x')) // head(C) = 'a', tail(C) = ((5, 3, 'x'))
D(B, C, A) // head(D) = B, tail(D) = (C, A)
4. 广义表结点定义
utype | info | tlink
结点类型utype:
- 0, 表头
- 1, 原子数据
- 2, 子表
信息info:
utype = 0时,存放引用计数utype = 1时,存放数据值valueutype = 2时,存放指向子表表头的指针(hlink)
尾指针tlink:
utype = 0时,指向该表第一个结点utype0时,指向同一层下一个结点。