
计算机算法设计和分析
文章平均质量分 87
主要是对该课程的总结
夏驰和徐策
一个喜欢打游戏的计算机专业学生;这是我的GitHub:https://github.com/XiaChiandXuce
展开
-
5.1 回溯法的算法框架
回溯法被誉为“通用的解题方法”,能够系统地搜索问题的所有解或找到问题的一个解。它是一个既具有系统性又具有跳跃性的搜索算法。在问题的解空间树中,按照深度优先策略,从根节点出发搜索解空间树。当算法搜索到解空间树的任一节点时,首先判断该节点是否包含问题的解——如果确定不包含,则跳过对以该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。子集树和排列树是解决组合问题的两个基本工具,它们各自对应于不同的问题类型。原创 2024-04-05 10:54:04 · 1578 阅读 · 0 评论 -
4-4 哈夫曼编码
哈夫曼编码(Huffman coding)是一种用于数据压缩的无损编码方法。它是由David A. Huffman在1952年提出的,被广泛应用于通信和存储领域。哈夫曼编码通过对不同符号赋予不同长度的编码,使得出现频率高的符号使用较短的编码,而出现频率低的符号使用较长的编码,以此来实现数据压缩。哈夫曼编码的关键思想是利用变长编码来表达符号,使得出现频率高的符号的编码比出现频率低的符号的编码更短,从而减少整体的编码长度。1. 统计符号的出现频率:遍历待编码的符号序列,统计每个符号出现的频率。原创 2023-06-04 20:29:48 · 5463 阅读 · 0 评论 -
4.3 最优装载
最优装载问题(Bin Packing Problem)是一个经典的组合优化问题,涉及将一组物品放入有限数量的容器中,使得所使用的容器数最少。1. 贪心策略:选择最适合的物品放入当前可用的容器中。在最优装载问题中,一种常用的贪心策略是"首次适应法"(First Fit),即将每个物品依次尝试放入已有的容器中,如果无法放入任何容器,则开启一个新的容器。2. 排序物品:按照物品的大小(体积或重量)进行非递增排序。这样可以使得较大的物品更容易放入已有的容器中。3. 初始化容器:准备一个空容器列表。原创 2023-06-04 19:18:53 · 2474 阅读 · 0 评论 -
4-2 贪心算法的基本要素
贪心选择性质是一种在算法设计中经常使用的策略。它基于这样的思想:在每一步选择中,都选择当前看起来最优的选项,而不考虑全局的最优解。这种策略通常适用于一些优化问题,其中每一步的选择都会对最终解产生影响。贪心选择性质的关键在于证明每一步的贪心选择都不会破坏最终的最优解。如果可以证明贪心选择性质成立,那么可以通过不断地做出局部最优选择来得到全局最优解。然而,需要注意的是,并非所有问题都适合使用贪心策略。在一些问题中,贪心选择可能会导致得到次优解或者根本无法得到有效解。原创 2023-06-04 17:07:10 · 3556 阅读 · 0 评论 -
4-1 活动安排问题
我的理解:贪心算法是一种常用的问题求解方法,它在每个步骤上都选择当前看起来最优的解,而不考虑整体的最优解。简单来说,贪心算法采取局部最优的决策,希望通过每个局部最优解的选择,最终得到全局最优解。贪心算法的基本思想是通过贪心选择策略,一步一步地构建解决方案,每次选择都是基于当前情况下的最优决策。它通常适用于满足最优子结构的问题,即一个问题的最优解可以通过子问题的最优解来构建。然而,需要注意的是,贪心算法并不是适用于所有问题的通用解决方案。原创 2023-06-04 16:14:43 · 2948 阅读 · 0 评论 -
3-10 0-1背包问题
0-1背包问题是动态规划中的一个经典问题,其目标是在给定背包容量和一组物品的重量和价值的情况下,选择一些物品放入背包中,使得放入的物品总重量不超过背包容量,并且使得放入的物品总价值最大化。问题的输入包括背包的容量 `C` 和 `n` 个物品的重量 `w[i]` 和价值 `v[i]`,其中 `i` 表示物品的编号,取值范围从 1 到 `n`。目标是选择一些物品放入背包中,使得它们的总重量不超过 `C`,并且总价值最大。0-1背包问题的特点是每个物品要么完整地放入背包,要么不放入,不能进行切割。原创 2023-06-04 14:21:38 · 1593 阅读 · 0 评论 -
3.9 流水作业调度问题
流水作业调度问题是动态规划中的一个经典问题,它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的目标是确定作业的最优调度顺序,以使得所有作业的完成时间最小。下面是该问题的一般描述和解决步骤:1. 问题描述: - 给定n个作业和m个工作站,每个作业有一个处理时间(ti)和一个工作站的要求(wj)。 - 每个工作站一次只能处理一个作业,且每个作业只能分配给一个工作站。 - 每个工作站在完成作业后会空闲,可以接受下一个作业。2. 动态规划解决步骤: - 定义状态:首先定义问题的状原创 2023-06-04 11:12:46 · 5657 阅读 · 11 评论 -
3.8 电路布线
这证明了电路布线问题具有最优子结构性质。3. 根据状态转移方程MNS(i, D) = max{MNS(i-1, D), MNS(i-1, T(i)) + 1},选择使得MNS(i, D)最大的连线方案。综上所述,我们得到了递归的最优子结构关系,即MNS(i+1, D')的最优解可以通过MNS(i, D')和MNS(i, T(i+1))的最优解来获得。1. 如果第i条连线不连接到接线柱D上,那么MNS(i, D)等于前i-1条连线在接线柱D上的最大不相交连线子集的大小,即MNS(i-1, D)。原创 2023-06-04 10:18:34 · 1143 阅读 · 0 评论 -
3.7 图像压缩
在动态规划中,图像压缩是指通过减少图像数据的存储空间,以实现图像文件的压缩和存储优化。动态规划在图像压缩中可以应用于两个主要方面:无损压缩和有损压缩。无损压缩是指通过压缩图像数据,使得压缩后的图像可以完全还原为原始图像,没有任何信息丢失。在无损压缩中,动态规划可以用于寻找图像中的冗余部分,并进行数据的编码和解码。例如,通过动态规划算法,可以找到图像中连续的相同像素值或者相似的像素值,并用更简洁的方式表示,从而减少存储空间的占用。原创 2023-06-03 15:56:59 · 1894 阅读 · 0 评论 -
3.6 多边形游戏
对于多边形游戏,一种特定类型的玩法,即在给定的简单多边形上进行移动、删除顶点或边,并根据规则计算得分的游戏。这类游戏可以涉及到不同的规则和目标,具体的玩法可能有所不同,但其基本思想是根据给定的操作方式,通过选择和移动顶点或边,使得得分最高。在这类游戏中,玩家需要仔细观察多边形的形状和特征,并根据规则进行决策。常见的操作可能包括选择一个顶点或边,将其移动到新的位置,或者删除它,然后重新计算得分。得分的计算方式可能与多边形的属性有关,比如边长、角度、对称性等。原创 2023-06-03 14:35:44 · 2237 阅读 · 0 评论 -
5.4 二叉树的性质和存储结构
二叉树有两种常见的存储结构:顺序存储结构和链式存储结构。1. 顺序存储结构:在顺序存储结构中,使用数组来表示二叉树的节点。按照某种规则将节点按顺序存储在数组中,通常使用完全二叉树的形式。具体的存储规则如下:- 对于节点的索引为 i,它的左子节点的索引为 2i,右子节点的索引为 2i+1。- 如果节点的索引为 i,它的父节点的索引为 i/2(整数除法)。通过这种方式,可以利用数组的连续存储特性,有效地表示二叉树的结构。原创 2023-06-03 12:13:40 · 432 阅读 · 0 评论 -
5.3 树和二叉树的抽象数据类型定义
树的抽象数据类型定义是指对树这种数据结构的一种抽象描述,其中包括了树的基本操作和性质。它定义了树作为一种数据类型所能够执行的操作,而不涉及具体的实现细节。树的抽象数据类型定义一般包括以下操作:- 创建一棵空树:创建一个空的树结构。- 销毁树:释放树所占用的内存空间。- 插入节点:向树中插入一个新节点。- 删除节点:从树中删除一个指定节点。- 遍历树:按照某种顺序访问树中的节点。- 搜索节点:在树中搜索一个指定节点。- 获取根节点:返回树的根节点。原创 2023-06-03 12:04:13 · 1798 阅读 · 0 评论 -
5.2 案例引入
大数据时代指的是在现代社会中,产生和积累的数据规模庞大、速度快、种类多样的时代。随着计算机技术的发展和互联网的普及,人们能够以更高的速度、更大的规模收集、存储和处理各种类型的数据。这些数据可以来自各个领域和来源,包括社交媒体、传感器、在线交易、医疗记录等。1. 数据规模庞大:大数据时代的数据量通常以海量甚至是万亿级别来计量,远超过传统数据处理方法所能处理的范围。原创 2023-06-03 11:12:43 · 701 阅读 · 0 评论 -
5.1 树和二叉树的定义
在计算机科学中,树是一种非线性数据结构,由节点(或称为顶点)和边组成。它是一种层次结构,具有根节点、子节点和父节点的概念。1. 根节点(Root):树的顶部节点,没有父节点,是树的起始点。2. 节点(Node):树中的元素,包含一个或多个子节点和一个父节点。3. 边(Edge):节点之间的连接线,表示节点之间的关系。4. 子节点(Children):一个节点的直接下属节点。5. 父节点(Parent):一个节点的直接上属节点。6. 叶节点(Leaf):没有子节点的节点,也称为终端节点。原创 2023-06-03 10:47:24 · 719 阅读 · 0 评论 -
3.4 最大字段和
当涉及到最大子段和问题时,可以使用动态规划算法来有效地解决。以下是最大子段和问题的动态规划算法的要点总结:1. 定义状态:我们可以使用一个一维数组 `dp` 来记录以每个位置结尾的最大子段和。`dp[i]` 表示以第 `i` 个位置结尾的最大子段和。2. 初始化状态:将 `dp[0]` 初始化为数组的第一个元素 `a[0]`。3. 状态转移:对于每个位置 `i`,我们有两种选择:- 要么将其加入之前的子段中,即 `dp[i] = dp[i-1] + a[i]`;原创 2023-06-02 20:43:32 · 1913 阅读 · 0 评论 -
3.3 最长公共子序列
我的理解:在字符串或序列中,子序列是指从原始序列中删除零个或多个元素后得到的序列,而且相对顺序保持不变。换句话说,子序列是从原始序列中选择出的元素,它们保持相对顺序,但可以跳过一些元素或者不选择任何元素。举个例子,考虑序列 "abcd",它的一些子序列包括:"a","b","c","d","ab","ac","ad","bc","bd","cd","abc","abd","acd","bcd","abcd"。注意,这些子序列可能不一定是连续的,可以跳过某些元素。原创 2023-06-01 19:25:01 · 2720 阅读 · 0 评论 -
3.2 动态规划算法的基本要素
最优子结构和重叠子问题是动态规划算法的核心要素。综上所述,这个不等式描述了递归函数 T(n) 的下界,即 T(n) 的计算代价至少是所有子问题 T(k) 和 T((n-k)+1) 计算结果之和,并加上一个常数项 1。然后我们考虑函数 T(n) 的计算过程,该过程依赖于两个子问题:T(k) 和 T((n-k)+1),其中 k 的取值范围是从 1 到 n-1。1. 根据问题的定义和最优解的定义,斐波那契数列的第 n 项 F(n) 是通过计算第 n-1 项 F(n-1) 和第 n-2 项 F(n-2) 得到的。原创 2023-06-01 15:40:18 · 2182 阅读 · 0 评论 -
3.1 矩阵连乘问题
简单的说就是括号的定义,为了区分运算顺序所以重新引入这个概念、完全加括号的矩阵连乘积是指在矩阵连乘的乘法表达式中,对每个乘法操作都显式地加上括号,以明确指定运算的顺序。例如,对于三个矩阵 A、B 和 C,完全加括号的矩阵连乘积可以表示为 ((A * B) * C) 或者 (A * (B * C))。这样的表示方法清楚地表明了乘法操作的顺序。完全加括号的矩阵连乘积通常用于避免歧义,确保在进行矩阵乘法时按照所需的顺序进行计算。这样可以避免乘法顺序不明确或引起错误结果的问题。原创 2023-05-31 21:16:48 · 4377 阅读 · 7 评论 -
2.11 循环赛日程表
1.注意实现问题(1)在使用分治策略解決问题时 ,注意检查四个条件是否满足(2)尽量保证划分出的子问题规模大致一致。平衡子问题思想(3)如果可以使用递推的方式解决问题,尽量使用递推算法(4)递归的分治算法的时间复杂性分析,要先写出其时间复杂性的递归方程,然后用主定理或递归树解方程。(5)用递归算法解决问题时,要分析出其边界条件和递归方程(过程)原创 2023-04-02 13:57:42 · 3153 阅读 · 5 评论 -
2.9 线性时间选择
本节讨论与排序问题类似的元素选择问题。元素选择问题的一般提法是:给定线性序集中n个元素和一个整数1(1≤K原创 2023-04-02 12:14:47 · 2821 阅读 · 0 评论 -
2.8 快速排序
快速排序是另一个分而治之的排序算法在继续随机化和可用版本的快速排序之前,我们将看到,这种确定性的,非随机化的快速排序的版本可能在针对性输入中具有很差的 O(果选择a印作为划分的基淮,且 al又是 alp:r中的最大元素,则 Partition 算法返回的值为。③ 合并(Merge):由于对alp:g-11和 aig+1门的排序是就地进行的,因此在 apg-1。alp:9-1]中元素不大于 alg+1:门中元素。扩展两个区域alp:门和al:门,使alp:门中元素小于或等于x,而al:门中元素大于或等于x。原创 2023-03-28 21:14:17 · 283 阅读 · 0 评论 -
2.7 合并排序
合并排序算法是用分治策咯实现对 n 个元素进行排序的算法,其基本思想是:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成要求的排好序的集合。其中,算法 Merge 合并两个排好序的数组段到一个新的数组b中,然后由 Copy将合并后的数组段再复制回数组a中。Merge 和 Copy 显然可在 O(n时间内完成,因此合并排序算法对n个元素进行排序,在最坏情况下所需的计算时间 T(n)满足[O(1)T(n) =n≤1n>1。原创 2023-03-26 13:37:28 · 335 阅读 · 0 评论 -
2.6 棋盘覆盖
格就成为该棋盘上的特殊方格,从而将原问题转化为 4个较小规模的棋盘覆盖问题。在棋盘複盖问题中,要用图2-5 所示的 4种不同形态的工 型骨牌覆盖一个给定的特殊棋。型骨牌覆盖这了个较小棋盘的会合处,如图2-6(所示,这了个子棋盘上被L型骨牌覆盖的方。是算法中的一个全局性型交量,用表示工 型骨牌的编号,其初始值为 0。在一个2*x2‘个方格组成的棋盘中,若怡有一个方格与其他方格不同,则称该方格为。特殊方格,且称该棋盘为一特殊棋盘。2*x2*的棋盘覆盖中,用到的L 型骨牌个数恰为(45-1)/3。原创 2023-03-08 01:16:42 · 227 阅读 · 0 评论 -
2.5 Strassen矩阵乘法
Strassern 短阵乘法中用了7 次对于n/2 阶矩阵乘积的递归调用和 18 次11/2 阶矩阵的加。基于计算 2x2矩阵的7 次乘法这样的方法了,或许应当研究 3x3 或 5x5 矩阵的更好算法。0(02-376),所知的矩阵乘法的最好下界仍是它的平凡下界2(n。矩阵的阶大于2时,为求2个子矩阵的积,可以继续将子矩阵分块,直到子矩阵的阶降为 2。依此算法,计算2个n阶方阵的乘积转化为计算8个n/2。除非能找到一种计算2阶方阵乘积的算法,使乘法的计算次数少于7次,计算矩阵乘积的计。原创 2023-03-08 00:50:06 · 438 阅读 · 0 评论 -
2.4 大整数乘法
通常,在分析算法的计算复杂性时,都将加法和乘法运算看作基本运算来处理,即将执行一次加法或乘法运算所需的计算时间看作一个仅取决于计算机硬件处理速度的常数。若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。设子和丫都是n 位二进制整数,现在要计算它们的乘积 XY。如果按此式计算 XY,必须进行 4 次n/2位整数的乘法 (AC、AD、BC和BD)、3次不超过2n 位的整数加法(分别对应式中的“+”),以及2次移位(分别对应式中的乘 2”和乘 212)。原创 2023-03-08 00:30:59 · 127 阅读 · 0 评论 -
2.3 二分搜索技术
第一个二分搜素算法早在 1946年就出现丁,但是第一个完全正确的二分搜索算法直到1946年才出现。如果saln/2],则只在数组a 的右半部继续搜索x。二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情況下用 O(ogn)容易看出,每执行一次算法的 while 福环,待搜索数组的大小减小一半。中元素,直至找出元素,或搜索遍整个数组后确定,不在其中。二分搜索算法的基本思想是,将n个元素分成个数大致相同的两半,取。个元素已排好序这个条件,因此在最坏情况下,顺序搜索方法需要 O(1次比较。原创 2023-03-07 13:45:09 · 541 阅读 · 0 评论 -
2.2 分治法的基本思想
分治法的基本思想是将一个规模为n的问题分解为化个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。其中,P表示问题口的规模,n0为一阙值,表示当问题口 的规模不超过 n0时,问题容易解出,不必再继续分解。adhoc(D)是该分治法中的基本子算法,用于直接解小规模的问题P。当P的规模不超过n0 时,直接用算法 adhoc(P)求解。算法 merge(y1, y2,•,yK)是该分治法中的合并子算。原创 2023-03-06 18:37:46 · 481 阅读 · 0 评论 -
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。在计算机算法设计与分析中,递归技术是十分有用的。使用递归技术往往使函数的定义和算法的描达简捷且易于理解。有些数据结构,如二叉树等,由于其本身固有的递归特性,特别适合用递归的形式来描述。有些问题,虽然其本身并没有明显的递归结构,但用递归技术来求解,可使设计出的算法简捷易懂且易于分析。下面来看几个例子。例1:例2-1 阶乘函数的实现例2:例2.2 斐波那契数列的递归实现例3:例2.3 Ackerman函数双递归实现例4:例2.4 递归原创 2023-03-02 16:06:58 · 125 阅读 · 0 评论 -
第一章 算法概述
什么是算法?算法 (Algorithm)算法是指解決问题的一种方法或一个过程。算法是若干指令的有穷序列,满足性质:(1)输入:有外部提供的量作为算法的输入。(2)输出:至少一个量作为输出。(3)确定性:组成算法的每条指令是清晰无歧义的。(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的我的理解:好熟悉的感觉~类比记忆——类比的思想。原创 2023-03-02 16:52:35 · 1658 阅读 · 0 评论