初赛(2)
排序
基数排序
-
\(O(a+n)\)
-
不基于比较(基于统计)
-
就好比说投票选举班干部
最朴素的做法就是
直接在被选人的背后放一个投票箱
然后让同学们在投票箱里投票
然后进行统计
(不用写什么小纸条也不用唱票) -
a:候选人数 n:选票个数
选择排序
-
\(O(n^2)\)
-
基于比较
-
就好比我们在打牌
你手中现在有1 9 5 1
然后你摸到了一张4
你就会从左向右进行比较,直到找到一个比4小
将位置进行交换
虽说正常人不会这么干,一般用插入排序
【真题训练】
【2018普及】以下排序算法中,不需要进行关键字比较操作的算法是()。
A.基数排序
B.冒泡排序
C.堆排序
D.直接插入排序
答案→A
冒泡排序
-
\(O(n^2)\)
-
稳定
-
从左边到右边进行扫描,取出相邻的两个数
如果说左边的数比右边的数要大
那么就把这两个相邻的数进行交换
插入排序
-
\(O(n^2)\)
-
稳定
-
就还好比我们在打牌
但是你是一个老玩家
你手中现在有1 9 5 1
然后你摸到了一张4
你就会找哪张牌比4小,然后插入到这张牌的后面
那么后面的牌就会跟着往后移动
归并排序
-
\(O(nlogn)\)
-
稳定
-
需要额外辅助空间(多开一个数组)
快速排序
-
\(O(nlogn)\) 最坏 \(O(n^2)\)
因为我们取的基准点不确定,有可能我们取的基准点会让算法复杂度降低
-
不稳定
堆排序
-
\(O(nlogn)\)
-
不稳定
稳定&不稳定:
如果有两个数相等,分别是a,b
如果在排序之前a在b的前面
在排序之后a还在b的前面
那么我们说这种排序的算法是稳定的
反之则不稳定
【真题训练】
【2019提高】排序的算法很多,若按照排序的稳定性和不稳定性分类,则()是不稳定排序
A.冒泡排序
B.直接插入排序
C.快速排序
D.归并排序
答案→C
贪心
- 需要证明,有时候不一定正确
例:哈夫曼编码:5,14,13,10
\(方法1:5*3+14*3+13*2+10=93\)
\(方法2:(5+14+13+10)*2=84\)
【真题训练】
【2019入门】新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。
方案一:每次连续跑3公里可以消耗300千卡(耗时半小时);
方案二:每次连续跑5公里可以消耗600千卡(耗时1小时)。
小胖每周周一到周四能抽出半小时跑步,周五到周日能抽出一小时跑步。
另外,教练建议小胖每周最多跑21公里,否则会损伤膝盖。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最多通过跑步消耗多少千卡?()
A. 3000
B. 2500
C. 2400
D. 2520
答案→C。优先周末跑5公里(性价比高)。然后非周末2天
二分
顺序查找效率低,要找\(N\)次
折半查找,找需要log(n)次,要求有序
【真题训练】
【2019入门】设有100个已排好序的数据元素,采用折半查找时,最大比较次数为()
A. 7
B. 10
C. 6
D. 8
答案→A。log(64)=6.log(128)=7
递推递归分治
递推
从小到大顺推
斐波那契数列 1 1 2 3 5 8 13 21
f(0)=f(1)=1
f(i)=f(i-1)+f(i-2)
分治&递归
大问题拆成小问题,递归解决
例如:归并排序,快速排序
栈
先进后出
经典示例:洗盘子
应用:卡特兰数 1 2 5 14 52 后缀表达式计算,括号匹配
【真题训练】
【2017提高,不定项】对于入栈顺序为a,b,c,d,e,f,g的序列,下列()不可能是合法的出栈序列。
A.a,b,c,d,e,f,g
B.a,d,c,b,e,g,f
C.a,d,b,c,g,f,e
D.g,f,e,d,c,b,a
答案→C。经过模拟,d出栈室友压着c的,b不可能比c先出
队列
先进先出
经典示例:排队(买东西,打饭)
多应用于广搜
入队:1 2 3 4 5
出队:1 2 3 4 5
链表
每个结点都有一个值,并且知道自己的下一个结点是什么
【真题训练】
【2019入门】链表不具有的特点是()
A. 插入删除不需要移动元素
B. 不必事先估计存储空间
C. 所需空间与线性表长度成正比
D. 可随机访问任一元素
答案→D。一个接着一个,没有连续的存储
树
N个结点
N-1条边
可能有一个根结点,有层次关系(也可能没有根结点,就是一个无根树)
所有结点之间都可以相互连通,没有环
森林:树的集合
【真题训练】
【2018提高,不定项】下列说法中,是树的性质的有()
A.无环
B.任意两个节点之间有且只有一条简单路径
C.有且只有一个简单环
D.边的数目是顶点数目减1
答案→ABD
二叉树(重点)
各种性质
高度
结点数量
叶子节点数量
下一层数量是上一层的2倍
每层的数量\(2^(i-1)\)
总数量\(2^i-1\)
完美二叉树(满二叉树)
完全二叉树:完美二叉树从右往左去掉一些叶子结点
【真题训练】
【2019入门】一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i ,则其左孩子位于下标2i处、右孩子位于下标2i+l处),则该数组的最大下标至少为()。
o
/ \
o o
/ \
o o
/ \
o o
A. 6
B. 10
C. 15
D. 12
答案→C。将其补齐为完美二叉树,一共有15个结点
二叉树的遍历
前序遍历:根,左,右
中序遍历:左,根,右
后序遍历:左,右,根
【真题训练】
【2019入门】假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为()。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGJHCFI
D. ABDEGHJFIC
答案→B。后序遍历最后一个是根
然后再中序遍历中找到根,分为左右子树,然后继续递归
表达式树
中序表达式——中序遍历
前缀表达式——前序遍历
后缀表达式——后序遍历
【真题训练】
【2018提高】表达式a*d-b*c的前缀形式是()。
A. ad*bc*-
B.-*ad*bc
C.a*d-b*c
D.-**adbc
答案→B。(建议画图模拟一下)
图
相关定义
无向图,有向图
可以带权
顶点:V
边:E
完全图:n(n-1)/2
度数:顶点连着的彼岸的条数,有向图分为入度和出度
重边:两个相同的顶点中间有多条边
自环:自己连自己
简单图:无重边自环
【真题训练】
【2019提高】G是一个非连通无向图(没有重边和自环),共有28条边,则该图至少有()个顶点。
A.10
B.9
C.11
D.8
答案→B。2个点:1条边。
3个点:1+2=3
4个点:1+2+3=6
……
7个点:21条边
8个点:1+2+……+7=28条边
但注意题目要求非连通。8个点不够
所以答案为9
存储
邻接矩阵
直接开一个二维数组
但是太大的话就不行
空间会爆炸
血的教训
邻接表
常用vector存储
可以使用比较少的空间来存储
而且速度比较快
【真题训练】
【2019提高】以下哪个结构可以用来存图()。
A.栈
B.二叉树
C.队列
D.邻接矩阵
答案→D。邻接矩阵或者邻接表(链表)
遍历
深度优先搜索(DFS)
广(宽)度优先搜索(BFS)
算法
单源最短路径:Dijkstra算法\(O(nlogn)\),SPFA 死了
全部点的最短路径:Floyd算法\(O(n^3)\)
最小生成树:Prim\(O(n^2)\)、Kruskal\(O(eloge)\)
欧拉回路:一笔画问题,最多只有两个度数为奇数的点
【真题训练】
【2019提高】以下哪些算法不属于贪心算法?()
A.Dijkstra算法
B.Floyd算法
C.Prim算法
D.Kruskal算法
答案→B。严格说是一种动态规划