初赛(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。严格说是一种动态规划

posted @ 2021-08-15 22:09  晨曦时雨  阅读(466)  评论(0编辑  收藏  举报
-->