算法复习

181 阅读8分钟

一、问答题

1.什么是算法?算法有哪些重要特性

 算法是对特定问题求解步骤的一种描述,是指令的有限序列。
 特性:1)输入
       2)输出
       3)有穷性
       4)确定性
       5)可行性

2.考虑下面的算法,回答下列问题,算法完成什么功能?算法的基本语句是什么?基本语句执行了多少次?算法的时间复杂性是多少?

a2161230d4fca234969d35d5cc188ec.png 1)算法实现的功能:计算从1到n的平方和;算法的基本语句是 S = S+ii;基本语句执行了n次,算法的时间复杂性是O(n);

2)算法的功能:计算i的平方,基本语句执行了n-1次,算法的时间复杂性是O(n)。*

3.试述分治法的基本思想

分治法的基本思想是将一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决子问题,然后将各个子问题的解合并得到原问题的解。

4.蛮力法的优缺点是什么?

  • 优点:具有广泛的适用性与简单性。
  • 缺点:算法效率不高。
  • 应用:选择排序,顺序查找,穷举查找也是解决组合问题的一种方法。

5.试述回溯法的基本思想及用回溯法解题的步骤。

  • 回溯法的基本思想:回溯法在问题的解空间树书中,按照深度优先策略,从根结点出发搜索解空间树。算法搜索到解空间树的任意一点时,首先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则进入该子树,继续深度优先策略搜索。
  • 基本步骤:1)针对所给问题,定义问题的解空间;2)确定易于搜索的解空间结构;3)以深度优先策略搜索解空间树,并在搜索过程中用剪枝函数避免无效搜索。

回溯法中常见哪两类典型的解空间树?分析各自的使用场合及时间复杂度。

  • 子集树 当所给问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。通常有2n个结点,需要O(2n)。
  • 排列树 当所给问题是从确定的n个元素找出满足某种性质的排列时,相应的解空间树称为排列树。O(!n)。

6.设计动态规划算法的4个步骤是什么?

  • (1)找到最优解的结构性质,并刻画其结构特征;
  • (2)递归的定义最优值;
  • (3)以自底向上的方式找出最优值;
  • (4)根据计算最优值得到的信息,构造最优解。

7.应用选择排序方法对一个记录序列进行升序排列的基本思想是什么,具体排序过程怎么做的?

  • 基本思想:第i 趟排序在无序序列ri-rn中找到值最小的记录,并和第i个记录交换作为有序序列的第一个记录。
  • 具体排序过程如下: (1)将整个记录序列划分为有序区和无序区,初始时有序区为空,无序区含有待排序的所有记录 (2)在无序区查找值最小的记录,将它与无序区的第一个记录交换,使得有序区扩展一个记录,同时无序区减少一个记录。 不断重复步骤(2),直到无序区只剩下一个记录为止。

8.比较分支限界法与回溯法的异同

  • 相同点:都是一种在解空间树中搜索问题解的算法。
  • 不同点:(1)求解目标不同;
  • (2)搜索方式不同;
  • (3)对扩展节点的扩展方式不同;
  • (4)存储空间的要求不同。

9.常见的两种分支限界法的算法框架是什么

  • *(1)队列式(FIFO)分支限界法:按照队列先进先出原则(FIFO)选取下一个节点为扩展节点。
  • *(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点当作当前扩展节点。

10.快速排序

分治策略

  • (1)划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r1 … ri-1和ri+1 … rn,前一个子序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值;

  • (2)求解子问题:分别对划分后的每一个子序列递归处理;

  • (3)合并:由于对子序列r1 … ri-1和ri+1 … rn的排序是就地进行的,所以合并不需要执行任何操作。

步骤

以第一个记录作为轴值,对待排序序列进行划分的过程为:

  • (1)初始化:取第一个记录作为基准,设置两个参数i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置,也就是本次划分的区间;
  • (2)右侧扫描过程:将基准记录与j指向的记录进行比较,如果j指向记录的关键码大,则j前移一个记录位置。重复右侧扫描过程,直到右侧的记录小(即反序),若i<j,则将基准记录与j指向的记录进行交换;
  • (3)左侧扫描过程:将基准记录与i指向的记录进行比较,如果i指向记录的关键码小,则i后移一个记录位置。重复左侧扫描过程,直到左侧的记录大(即反序),若i<j,则将基准记录与i指向的记录交换;
  • (4)重复(2)(3)步,直到i与j指向同一位置,即基准记录最终的位置。

二、算法

1.最大子段和问题(动态规划背代码

2.分数化简(欧几里得递归)背代码

3.最长公共子序列( 这个写出代码,或者画出表格图,困难😫)

image.png

*限定条件*

image.png 若相等,斜对角加一,若不等找上边和左边最大的。依次画出长度矩阵

image.png 若相等则为状态1;若不想等,看长度矩阵:左边大于等于上边为状态2;左边小于上边为状态3;

由状态矩阵找最长子序列:若状态为1,找斜对角;若状态为2,找左边;若状态为3,找上边;

image.png

**由此画出长度矩阵L以及状态矩阵S**

下面是代码

汉诺塔问题(递归)背结果

2^n-1

上楼梯(斐波那契数列)背结果

问题:
一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法?

举个例子,假设有3个台阶,则有三种走法:分别是,1-1-1, 1-2, 2-1。

很简单的一道题,学过组合数学的人很快就能想到,这是一个递推关系。假设走完k个台阶有f(k)种走法。

  • k = 1时,f(k) = 1
  • k = 2时,f(k) = 2
  • k = n时,第一步走一个台阶,剩n-1个台阶,有f(n - 1)种走法。第一步走两个台阶,剩n-2个台阶,有f(n - 2种走法。所以共有f(n - 1) + f(n - 2)种走法。于是有如下公式

image.png

快速排序(考时间复杂度)=nlogn

快速排序过程程是这样的:

  • 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。
  • 方法其实很简单: 分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列次左边和最右边。

求2000以内的合数(除了1和本身以外有其他约数)问题背代码

题目要求:找到2000内的合数,并且这个合数的所有因子(除它自己)之和等于这个合数。

杨辉三角背代码

N皇后(回溯)背代码

0/1背包(动态规划)背代码

数字塔(动态规划)

数字旋转方阵

埃及数字

素数环

图着色

桥本分数式