导论:
1.数据的逻辑结构有哪些
答:(四种)集合结构,线性结构,树形结构,网状结构
2.数据有哪些存储结构
答:(两种)顺序存储结构和链式存储结构
3.怎么评价一个算法的优劣
答:看时间复杂度(运行时间)和空间复杂度(所需存储空间)
4.算法的五个特征:(定行有出入)
答:有限性,确定性,可行性,输入和输出(确定这种方法是可行的,它能在有限的范围内输入和输出)
线性表
1.什么是线性表
答:相同数据元素组成的有限序列
性质:
1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有唯一的后继(后件)。
4.除第一个元素之外,均有唯一的前驱(前件)。
2.什么是顺序表
答:在内存中用一组地址连续的存储单元依次存放线性表的元素
3.在顺序表中插入一个数需移动的次数为n/2,删除一个数为(n-1)/2
4.链表分为哪几种(三种)
单链表,双链表,循环链表
单链表:用一个个结点,包含数据和一个指向下个结点的指针构成的线性表叫链表 附加: 静态链表: 用数组描述的链表,即称为静态链表。
双链表:在单链表基础上增加了前驱结点,指向上一个结点的链表
循环链表:表中最后一个结点指向头指针,形成收尾相连的链表
6..在链表中插入一个数怎么做
答:先给新结点分配存储空间,赋值,把上一个结点的指针指向新结点,新结点指向上一个结点原本指向的下一个结点
在链表中删除一个数怎么做
答:使要删除结点的上一个结点指向下下个结点,释放要删除结点的内存空间
栈和队列
1.栈和队列都是线性表
2.什么是栈和队列
栈:允许在表的一端进行插入和删除操作的线性表,栈顶和栈底,后进先出。top为0位空栈,top为MAX为满栈
队列:允许在表的一端进行插入,另一端进行删除操作的线性表。队头和队尾。进队和出队。先进先出
3.循环队列怎么判断队列满
答:front=rear是不可以判断是空还是满的
可以少用一个内存空间留着,当rear的下一个位置是front时,停止进队,表示队满
4.堆和栈有什么区别
(1)数据结构的栈和堆
栈是后进先出的线性表,就好比我们要拿箱子里的东西,要想把上面的东西拿出来才可以
堆是一种经过排序的树形数据结构,指二叉堆。堆的存取是随意的,就好比从书架取书
https://www.jianshu.com/p/6b526aa481b1
并且,堆有最大堆和最小堆,基于这个特点,可以快速找到集合的最大值或者最小值。且内存占用比普通的树要小。不能代替二叉排序树,因为节点的顺序不同
(2)内存分配中的堆和栈
内存中,栈区地址是向下增长的,用来存放局部变量自动分配,;堆区向上增长,用来分配用户申请的内存空间,动态分配,用户手动释放。
串和数组
1.什么是串,什么是串的模式匹配
串是字符串的简称,每个元素都是字符,是有限的,元素为0是空串。串的模式匹配是字符串文本中查找指定字符串。
2.有几种特殊矩阵
对称矩阵,三角矩阵,对角矩阵。
对称矩阵:a[i][j]=a[j][i]
三角矩阵:下三角和上三角
对角矩阵:非零元素都集中在以对角线为中心的带状 区域,其他为0
3.什么是稀疏矩阵,稀疏矩阵的存储方式有哪几种
矩阵中非0元素较少20%以下,分布没有规矩叫稀疏矩阵。
三元组表示法,十字链表法
三元组表示法:存储元素的时候同时存储元素所在的 行和列的位置,三个域:行号,列号, 元素值
十字链表法:在三元组三个域的基础上增加down和 right分别指向同一列的下一个元素的位 置,和同一行下一个元素的位置,构成 列链表和行链表,故称为十字链表。
4.什么是广义表
广义表是n个数据元素的有限序列, 里面的元素既可以是单个元素,也可以是一个广义表。a1表示表头,其他表示表尾。
5字符串的内部存储方式有哪些
定长顺序存储,堆存储,块链存储。
树与二叉树
1.什么是树
树是每个结点有零个或多个子结点,每一个非根结点有且只有一个父结点的数据结构
2.结点的度:一个结点的子树的个数
树的度:树中所有结点的度的最大值
叶子结点,度为0的结点,即没有后继的结点
分支结点:度不为0的结点
孩子:一个结点的直接后继
双亲:一个结点的直接前驱
树的深度:层数
森林: 多颗互不相交的树的集合 (树中的结点数等于所有结点的度数加1(含有n个结点的树边数为n-1)
3.什么是二叉树,满二叉树,完全二叉树,二叉搜索树(二叉排序树,二叉查找树),AVL树,红黑树,平衡二叉树, 哈夫曼树(最优二叉树)
二叉堆: 所有父结点都比子结点要小的完全二叉树我们称为最小堆。反之,如果所有父结 点 都比子结 点要大,这样的完全二叉树称为最大堆。
二叉树:每个节点最多有两棵子树的树被称为二叉树
满二叉树:二叉树中所有的非叶子结点的度数都为2,且叶子结点都在同一层
完全二叉树:满二叉树最后一层从右到左删除一些结点
二叉排序树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (4)没有键值相等的节点。
(5)中序遍历后,可以得到递增有序序列
AVL树: AVL树中任何节点的两个子树的高度最大差别为1,同时又有二叉排序树的特点
红黑树: 有AVL树的特点 ,根节点必须是黑色的,其他结点要么是黑色,要么是红色,红结点不能连续,红结点的两个子节点都为黑色。
平衡二叉树:1.任何节点的两个子树的高度最大差别为1。2.若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
哈夫曼树: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径 长度最短的树,权值较大的结点离根较近。
带权路径长度计算:结点的权值X(深度+1)相加
哪些树是平衡二叉树?
AVL树,红黑树等是平衡二叉树
二叉排序树,满二叉树,完全二叉树都不一定是平衡二叉树,因为可能不满意左节点的值小于根节点,右节点的值大于根节点或者两个子树的高度不超过1。
4.二叉树的性质
(1) 在非空二叉树中,第i层的结点总数不超过 , i>=1;
(2) 深度为h的二叉树最多有 个结点(h>=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
即使对于满二叉树最后一层的节点个数等于前面层所有节点的个数和加1
(4) 具有n个结点的完全二叉树的深度为
(注:[ ]表示向下取整)
5.二叉树的存储结构
2种:顺序存储结构和链式存储结构
6.遍历二叉树的方法(4种)
先序遍历(根左右),中序遍历(左根右),后序遍历(左右根),层次遍历。
如果知道先序遍历和中序遍历,可知道先序遍历的第一个数为根节点,由此确认中序遍历中该数所在的位置,该数左边的数都为根左子树下的结点,右边为右子树下的结点,
7.树的存储结构有哪些
3种,双亲表示法,孩子表示法,孩子兄弟表示法。
8.树转换成二叉树
-
将树中的所有相邻兄弟之间加一条连线
-
对树中的每个结点,只保留其与第一个孩子结点之间的连线,删去其与其他孩子结点之间的连线
-
以树的跟结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。
9.森林转换为二叉树
-
将森林中的每一棵树转换为相应的二叉树。
-
第一棵树保持不动,从第二颗树开始,依次把第二颗树的根节点作为前一棵树的右节点,直到所有的二叉树连起来形成一颗二叉树。
10.二叉树转换成树或森林
-
若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子、..........都与该结点的双亲结点用线连起来;
-
删除原二叉树中所有双亲结点与右孩子结点的连线
-
整理前两步得到的树或森林,使之结构层次分明
11.哈夫曼树编码
得到 平均长度最短的编码,左子树为0,右子树为1。
平均码长:各个频率乘以(深度-1)相加
图
1.什么是图
答:图是多对多的关系,图是由定点的有限集合和描述顶点关系的有限集合。
2.图的分类
答:(1)按边有无方向分为无向图和有向图
(2) 图按照边或弧的多少分稀疏图和稠密图
(3) 图中顶点之间有邻接点、依附的概念。无向图顶点的边数叫做度 有向图顶点分为入度和出度。
(4) 图上的边或弧带有权则称为网
(5) 若任意两顶点都是连通的,则图就是连通图,有向则称为强连通图。图中有子图,若子图极 大 连通则就是连通分量,有向的则称为强连通分量。
(6) 无向图中连通且n个顶点n-1条边称为生成树。有向图中一顶点入度为0其余顶点入度为1的叫 有向树。一个有向图由若干棵有向树构成生成森林。
(7)完全图:任意两个订点之间都有一条边相连
有向完全图:热议两个顶点之间都有方向相反的两条弧相连
(8)度:对于无向图,是与该顶点相关联的边的数目,对于有向图有入度和出度
3.图的存储结构
4种:邻接矩阵、邻接表、十字链表(针对有向图)和邻接多重表(针对无向图)
邻接矩阵:无向图的邻接矩阵是对称矩阵,所以存储时可以采用特殊矩阵的压缩存储方法如下三角矩 阵存储一半。所需空间为n(n-1)/2,而有向图的存储空间为n*n
邻接表:图的连式存储结构,和树的孩子链表示法类似。
十字链表:在三元组三个域的基础上增加down和=right分别指向同一列的下一个元素的位 置,和同一行下一个元素的位置,构成=列链表和行链表,故称为十字链表。
邻接多重表表示法: 无向图的一种存储方式。
4.图的遍历方法:
深度优先遍历(类似树的先序遍历)和广度深度遍历(类似树的层次遍历)
5.最小生成树
最小生成树就是用最小的边之和连通每一个结点。
构造法:先找出最小边的两个结点,再找除了这个边的剩余边最小的边的结点,重复操作
6.拓扑排序
在AOV网中进行拓扑排序的方法是:选择一个入度为0的顶点并输出,然后删除该顶点及所有以顶点为弧尾的弧,重复执行操作, 直到所有顶点都被输出,输出的序列就是这个AOV网的拓扑序列。
其拓扑序列为:V0 V1 V2 V3 V4 V5 V6 V7
通过拓扑排序能够得到拓扑序列的图一定是无回路的有向图,拓扑排序不是唯一的
8大排序3大查找
程序员必知8大排序3大查找(一)
C语言之三大查找算法
查找
1.什么是查找表
查找表是按某种数据结构形式存储的同一类型数据元素的集合。其数据结构形式可以是线性表,二叉树或树等。
查找表分为静态查找表(不可改变)和动态查找表(可改变)
2.什么是关键字
关键字可以标识一个数据元素。其中能唯一确定一个记录的关键字称为主关键字,反之,不能唯一地确定一个记录的关键字称为次关键字。有可能出现重复现象的不能作为主关键字,如姓名,而学号可以。
3.静态查找表的查找方法:顺序查找,折半查找,索引顺序查找
顺序查找:平均:(n+1)/2 最多(找不到)n+1
折半查找:就是二分查找,前提是大小有序排列的顺序表
步骤:(1)确定查找区间的中点位置:mid=[(low+high)/2],其中,low为起始位置, high为终止位置
(2)将位于mid位置处的数据元素的关键字与给定值key进行比较
1. key=elem[mid].key 成功
2. key<elem[mid].key 则high=mid -1
3. key>elem[mid].key 则low=mid-1
(3)重复,直到2查找成功或者low>high
#include <iostream>
using namespace std;
int bansearch(int *p, int key)
{
int low = 0,high = 7,mid=0;
while (key != p[mid])
{
mid = (low + high) / 2;
if (key > p[mid])low = mid + 1;
if (key < p[mid])high = mid - 1;
if (low > high)return 0;
}
return mid + 1;
}
int main()
{
int a[7] = { 1,3,9,4,5,10,2 };
int i, j, temp,k;
cin>>k;
//先排序 小--大
for (j = 0; j < 6; j++)
for (i = 0; i < 6; i++)
{
if (a[i] > a[i + 1]) {
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
for (i = 0; i < 7; i++)
{
cout << a[i] << " ";
}
i=bansearch(a, k);
cout << "成功,位置在: " << i;
system("Pause");
return 0;
}
4.动态查找
a.二叉排序树
看c++算法的1.重构二叉树
二叉排序树的查找:和折半查找类似
b.平衡二叉树
平衡二叉树:1.任何节点的两个子树的高度最大差别为1。2.若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
c.哈希表
哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方
https://www.cnblogs.com/s-b-b/p/6208565.html
排序
1.排序的五种重要的方法:
a.插入排序(直接插入排序,折半插入排序,希尔排序),b.交换排序(冒泡排序和快速排序),c.选择排序(直接选择排序,树形选择排序,堆排序),d.归并排序和e.基数排序
详细:https://blog.csdn.net/weixin_40535588/article/details/89341517
2.什么是排序
3.算法的稳定性
4.各种排序方式以及性能比较
:直接插入、冒泡选择
:直接选择
:快速排序
:归并排序、堆排序
:基数排序
只有直接插入、冒泡排序、归并排序和基数排序是稳定的
https://www.cnblogs.com/hokky/p/8529042.html
https://www.cnblogs.com/siqi/p/4887936.html