数据结构与算法基础设计到的内容
- 数组与矩阵
- 线性表(⭐⭐⭐)
- 广义表
- 树与二叉树(⭐⭐⭐)
- 图
- 排序与查找(⭐⭐⭐)
- 算法基础及常见的算法(⭐⭐⭐)
数组
一维数组 a[n]
a[i]
的存储地址为 :a+i*len
二维数组 a[m][n]
a[m][n]
的存储地址(按行存储)为:a+(i*n+j)*len
a[m][n]
的存储地址(按列存储)为:a+(j*m+i)*len
例:已知五行五列的二维数组a中的各元素占两个字节,求元素a[2][3]
按行优先存储的存储地址?
a+(2*5+3)*2
稀疏矩阵
如果一个矩阵中记录的元素大量为0,则被称之为稀疏矩阵。
上三角矩阵和下三角矩阵在存储时会将该矩阵按行优先或者时列优先压缩连续存储在一个数组中。
数据结构的定义
1.什么是数据结构?
数据结构就是计算机存储和组织数据的一种方式。不同的数据结构在存储和使用上会存在很大的差异。
2.数据逻辑结构分为线性结构(一条线)和非线性结构(树,图)。
分成不同的结构,主要还是为了进行分类探讨和研究。
从广义上来讲,图可以包含树,树可以包含线性结构。
线性表的定义
1.线性表 (a1 ,a2 ,a3 ,a4 …,an)
2.线性表常见的两种存储结构:顺序存储结构(顺序表)和链式存储结构(链表)
(区别:链表不一定是连续的,通过指针指向下一个数据的地址)
链表的基本操作:
- 单链表删除节点
- 单链表插入节点
- 双向链表删除节点
- 双向链表插入节点
线性表——顺序存储与链式存储对比
这里涉及到的查找算法时间复杂度指的是顺序查找,不涉及到二分查找等查找算法。
线性表——队列与栈
在循环队列中为了清楚的区分队空和队满,选择少存一个元素,即当tail指向空间的下一个空间是head指向的空间时,表示队满。
例:元素按照a,b,c的次序进入栈,请尝试写出其所有可能的出栈序列。(注意:入栈指的并不是一次性全部入栈)
广义表
广义表是n个表元素组成的有序序列,是线性表的推广。
通常用递归的形式进行定义,记作:LS=(a0 ,a1 ,…,an)
注:其中LS是表名,ai 是表元素,它可以是表(称作子表),也可以是数据元素(称为原子)。其中n是广义表的长度(也就是最外层包含的元素个数),n=0的广义表为空表;而递归定义的重数就是广义表的深度,直观地说,就是定义中所含括号的重数(原子的深度为0,空表的深度为1)。
基本运算:取表头head(Ls)和取表尾tail(Ls)
若有:LS1=(a,(b,c),(d,e))
表头head表示最外层的第一个元素,表尾tail是除了表头之外的所有元素
head(LS1)=a
tail(LS1)=((b,c),(d,e))
对应的LS1的长度为3 (最外层包含的元素的个数),深度为2 (表示括号的重数)
例如:有广义表LS1=(a,(b,c)