目录

前言

一、算法概述

算法与程序

算法复杂度分析

NP完全理论

二、递归与分治策略

递归(自顶向下)

分治策略(自顶向下)

三、动态规划(自底向上)

0-1背包问题:给定n种物品和一背包。物体i的重量是wi,其价值为vi,背包的容量为c。如何选择人装入背包的物品,使得装入背包中的物品的总价值最大

四、贪心算法(自顶向下)

背包问题:有n种物品,每种物品只有一个,第i种物品的重量为​编辑,价值为​编辑,背包的容量为W,物品可以分割。如何放置物品,使得背包的物品价值最大?算法复杂度:O(nlogn)

最优装载问题:

五、回溯法

总结


前言

期末到啦,对自己复习进行一个梳理和总结

主要是基于《计算机算法设计和分析》第5 版的前五章,算法概述、递归与分治策略、动态规划、贪心算法、回溯法。


一、算法概述


  • 算法与程序

  1. ​​​​用计算机求解问题的步骤: 1、问题分析    2、数学模型建立     3、算法设计与选择     4、算法指标     5、算法分析      6、算法实现      7、程序调试     8、结果整理文档编制
  2. 算法定义: 由若干条指令组成的有穷序列(解决问题的一种方法或一个过程)
  3. 算法的三要素: 1、操作      2、控制结构       3、数据结构
  4. 算法具有以下5个属性:
  • 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
  • 确定性:算法中每一条指令必须有确切的含义。
  • 不存在二义性。只有一个入口和一个出口  可行性:一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
  • 输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
  • 输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。

     5.算法设计的质量指标:

  • 正确性:算法应满足具体问题的需求;
  • 可读性:算法应该好读,以有利于读者对程序的理解;
  • 健壮性:算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
  • 效率与存储量需求:效率指的是算法执行的时间;
  • 存储量需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。
  • 算法复杂度分析

  • 在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型。

3个基本计算模型是:随机存取机RAM(Random Access Machine);随机存取存储程序机RASP(Random Access Stored Program Machine);图灵机(Turing Machine)

  • 衡量算法好坏的标准——时间复杂度高低。
  • 可操作性最好且最有实际价值的是最坏情况下的时间复杂性。

学习算法不得不会的数学知识(突破学习算法的瓶颈)_卖寂寞的小男孩的博客-CSDN博客_证明n^3+3n=Θ(n^3-n^2)零.前言这是算法设计与分析的第二讲,我们知道算法的设计是与数学分不开的,一个人的算法水平的下限是对模型掌握的多少,上限就是他的数学水平(我们算法大佬说的),那么就有人说了,我的数学水平也不高啊,怎么学好算法?数学水平不高有问题吗?没有问题。看了这篇文章,搞定算法分析的数学基础。1.计算复杂性函数的阶1.增长的阶1.增长率描述算法效率的方法:增长率而我们引入阶的概念,就是为了研究算法的增长率,注意不是描述执行的时间。因为一个算法执行的时间不仅与算法本身有关,还和其他因素有关(比如硬件性https://blog.csdn.net/qq_51492202/article/details/120152795

主定理(重点)PS:抱上面的博主大大的图,真的讲解的很详细!

  • 大Ω符号用来描述增长率的下限,下限的阶越低,结果就越有价值。
  • NP完全理论

  • P(Polynomial问题):也即是多项式复杂程度的问题。
  • NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。
  • NPC(NP Complete)问题,这种问题只有把解域里面的所有可能都穷举了之后才能得出答案,这样的问题是NP里面最难的问题,这种问题就是NPC问题。

二、递归与分治策略

  • 递归(自顶向下)

  • 分治策略(自顶向下)

  1. 分治法的基本思想是: 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
  2. 分治法所能解决的问题一般具有以下几个特征(重点):  

PS:其实就是基本思想而已

      (1)该问题的规模缩小到一定的程度就可以容易地解决;

(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质

(3)利用该问题分解出的子问题的解可以合并为该问题的解;

(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

  3.分治法的基本步骤:  分治法在每一层递归上都有三个步骤:  

      (1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

(2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;

(3)合并:将各个子问题的解合并为原问题的解。

二分搜索:二分搜索是一种在有序数组中查找特定元素的搜索算法,它使用二分法来查找特定的目标值,在每一步中将搜索空间减少一半,从而使搜索更有效率。

               时间复杂度:log(n)

例题:给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。 据此容易设计出二分搜索算法:

//二分搜索算法
tempalte<class Type>
int BinarySearch(Type a[],const Type& x,int l,int r)
{while(l<=r){int m=((l+r)/2):if(x==a[m])return m;if(x<a[m])r=m-1;else l=m+1;}return -1;
}

快速排序:性能取决于划分的对称性

template <class Type>
void QuickSort(Type a[], int p, int r)
{if (p < r){int q = Partition(a, p, r) ; QuickSort(a, p, q - 1); // 对左半端排序QuickSort(a, q + 1, r); // 对右半段排序}
}int Partition(Type a[], int p, int r)
{int i = p, j = r + 1;Type x = a[p]; // 将小于x的元素交换到左边区域,将大于x的元素交换到右边区域while (true){while (a[++i] < x && i < r);while (a[--j] > x);if (i >= j)break;Swap(a[i], a[j]);}a[p] = a[j];a[j] = x;return j;
}

合并排序:(基本思想)将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成要求的排好序的集合。时间复杂度:O(nlogn)

template <class Type>
void MergeSort(Type a[], int left, int right)
{if (left < right){int i = (left + right) / 2;MergeSort(a, left, i);MergeSort(a, i + 1, right);Merge(a, b, left, i, right); // 合并到数组bCopy(a, b, left, right);     // 复制到数组a}
}

三、动态规划(自底向上)

  1. 动态规划的基本思想是:动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 动态规划的实质是分治思想和解决冗余。
  2. 动态规划法的关键:对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。
  3. 动态规划算法的基本要素

(1)最优子结构:指使用动态规划算法解决问题时,每个子问题的最优解所构成的整体解。

  • 最优子结构性质:指大问题的最优解包含子问题的最优解。
  • 可用动态规划求解的显著特征是:具有最优子结构性质。

  • 例题:请说明动态规划方法为什么需要最优子结构性质
  • 答: 最优子结构性质是指大问题的最优解包含子问题的最优解。 动态规划方法是自底向上计算各个子问题的最优解,即先计算子问题的最优解,然后再利用子问题的最优解构造大问题的最优解,因此需要最优子结构。

(2)重叠子问题:动态规划算法的重叠子问题是指当求解一个大型复杂的问题时,将其分解成若干个较小的子问题,这些子问题之间会有重叠的部分,而动态规划算法可以有效地解决这类重叠子问题。

    4.设计动态规划算法的基本步骤:

       ①问题具有最优子结构性质;

②构造最优值的递归关系表达式;

③最优值的算法描述;

④构造最优解;

  5.最优化原理:

  • “最优化原理”用数学化的语言来描述:假设为了解决某一优化问题,需要依次作出n个决策D1,D2,…,Dn,如若这个决策序列是最优的,对于任何一个整数k,1 < k < n,不论前面k个决策是怎样的,以后的最优决策只取决于由前面决策所确定的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。 

最大子段和:

int MaxSum(int n, int a[])
{int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j]  for(int j=1; j<=n; j++) {if (b>0) b+= a[j] ;  else b=a[j]; ; //一旦某个区段和为负,则从下一个位置累和  if(b>sum) sum=b;   }  return sum;
} 

0-1背包问题:给定n种物品和一背包。物体i的重量是wi,其价值为vi,背包的容量为c。如何选择人装入背包的物品,使得装入背包中的物品的总价值最大

动态规划——0/1背包问题(全网最细+图文解析)_01背包动态规划_偷偷敲代码的青花瓷的博客-CSDN博客01背包你真的掌握了吗?进来带你10分钟秒杀https://blog.csdn.net/Biteht/article/details/124651895【动态规划】01背包问题(通俗易懂,超基础讲解)_Yngz_Miao的博客-CSDN博客_动态规划01背包问题问题描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8i(物品编号)1234w(体积)2345v(价值)3456总...https://blog.csdn.net/qq_38410730/article/details/81667885

// 0-1背包问题template <class Type>void Knapsack(Type v, int w, int c, int n, Type **m){int jMax = min(w[n] - 1, c);for (int j = 0; j <= jMax; j++)m[n][j] = 0;for (int j = w[n]; j <= c; j++)m[n][j] = v[n];for (int i = n - 1; i > 1; i--){jMax = min(w[i] - 1, c);for (int j = 0; j <= jMax; j++)m[i][j] = m[i + 1][j];for (int j = w[i]; j <= c; j++)m[i][j] = max(m[i + 1][j], m[i + 1][j - x[i]] + v[i]);}m[1][c] = m[2][c];if (c >= w[1])m[1][c] = max(m[1][c], m[2][c - w[1]] + v[1]);}template <class Type>void Traceback(Type * *m, int w, int c, int n, int x){for (int i = 1; i < n; i++){if (m[i][c] == m[i + 1][c])x[i] = 0;else{x[i] = 1;c -= w[i];}x[n] = (m[n][c]) ? 1 : 0;}}

四、贪心算法(自顶向下)

  1. 贪心算法的基本思想是:贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
  2. 贪心算法的基本要素
  • 贪心选择性质:指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
  • 动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

    对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。


  • 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
  • 问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

3.贪心算法的实现过程

  • 贪心算法的核心问题是选择能产生问题最优解的最优度量标准,即贪心策略。
  • 所谓贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值的一种解题方法,其具体的实现
  • 过程如下:

(1)应用同一规则,将原问题变为一个相似的但规模更小的子问题。

(2)从问题的某一初始解出发:

while (能朝给定目标前进一步)

求出可行解的一个解元素

(3)由所有解元素组合成问题的一个可行

背包问题:有n种物品,每种物品只有一个,第i种物品的重量为,价值为,背包的容量为W,物品可以分割。如何放置物品,使得背包的物品价值最大?算法复杂度:O(nlogn)

贪心选择策略:选择单位重量价值最大的物品装入背包。在选择过程中需要将物品按照单位重量价值递减的顺序进行排序,以此取前面单位重量价值最大的物品。

​
void Knapsack(int n,float M,float v[],float w[],float x[])
{  Sort(n,v,w);  int i;  for (i=1;i<=n;i++) x[i]=0;  float c=M;  for (i=1;i<=n;i++) {if (w[i]>c) break; x[i]=1; c - =w[i];  }  if (i<=n) x[i]=c/w[i];
} ​

最优装载问题:

贪心选择策略:采用重量最轻者先装。算法复杂度:O(nlogn)

// 最优装载
template <class Type>
void Loading(int x[], Type w[], Type c, int n)
{int *t = new int[n + 1];sort(w, t, n);for (int i = 1; i <= n; i++)x[i] = 0;for (int i = 1; i <= n && w[t[i]] <= c; i++){x[t[i]] = 1;c -= w[t[i]];}
}

哈夫曼编码:(左小右大、左0右1)

例题:考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中 的频数之比为 20:10:6:4:44:16。

要求: (1)(4 分)简述使用哈夫曼算法构造最优编码的基本步骤;

(2)(5 分)构造对应的哈夫曼树,并据此给出a,b,c,d,e,f 的一种最优编码。

解:

(1)哈夫曼算法是构造最优编码树的贪心算法。其基本思想是,首先所 有字符对应n 棵树构成的森林,每棵树只有一个结点,根权为对应字符的频率。然后,重复下列过程n-1 次:将森林中的根权最小的两棵树进行合并产生一个新树,该新树根的两个子树分别是参与合并的两棵子树,根权为两个子树根权之和。

(2)略

哈夫曼编码详解——图解真能看了秒懂_Young_IT的博客-CSDN博客_哈夫曼编码简单例题详解直接上题目:已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:(2分)A. 00, 1011, 01, 1010, 11, 100B. 00, 100, 110, 000, 0010, 01C. 10, 1011, 11, 001D. 0011, 10, 11, 0010, 01, 000https://blog.csdn.net/Young_IT/article/details/106730343

Dijkstra算法: 

例题:对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的贪心策略和算法的基本思想,并简要分析算法的时间复杂度。

答:  TE={(3,4), (2,3),(1,5),(4,6)(4,5)}

贪心策略是每次都在连接两个不同连通分量的边中选权值最小的边。

基本思想:首先将图中所有顶点都放到生成树中,然后每次都在连接两个不同连通分量的边中选权值最小的边,将其放入生成树中,直到生成树中有n-1条边。

时间复杂度为:O(eloge)

Dijkstra算法详解(完美图解、趣学算法)_wjyGrit的博客-CSDN博客_dijkstra算法过程图解Dijkstra算法详解Dijkstra算法设计Dijkstra算法简介Dijkstra算法的基本思想Dijkstra贪心策略完美图解伪代码详解完整代码算法解析及优化拓展使用优先队列的完整代码相关题的题解写在最后的话Dijkstra算法设计Dijkstra算法简介Dijkstra算法是解决**单源最短路径**问题的**贪心算法**它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径直到求出从源点到其他各个顶点的最短路径。Dijkstra算法的基本思想首先假定源点为u,顶点集合https://blog.csdn.net/qq_45776662/article/details/107177424最短路径(Dijkstra算法和Floyd算法)_法苏ovo的博客-CSDN博客_最短路径最短路径​在图中,不可避免要解决的一个问题就是计算两点之间的最短路径,对于图结构来说,两个点之间不一定只有一条路径,那么如何才能找出最短的那一条就是图中最短路径问题。最短路径问题在实际生活中应用十分广泛。接下来主要介绍两种较为常用的最短路径算法—DijkstraDijkstraDijkstra算法和FloydFloydFloyd算法。文章目录最短路径迪杰斯特拉DijkstraDijkstraDijkstra算法FloydFloydFloyd算法最小生成树与最短路径的区别​首先需要对最短路径问题进行https://blog.csdn.net/weixin_44267007/article/details/119770562最小生成树:

最小生成树详细讲解(Prime算法+Kruskalsuanfa)_Fated-2的博客-CSDN博客_prime算法最小生成树生成树 一个连通图(如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径))的生成树是该连通图的一个极小连同子图,它含有图中全部顶点,和构成一棵树的(n-1)条边.如果在一棵生成树上添加任何一条边,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第二条路径.一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边,但是...https://blog.csdn.net/qq_41181772/article/details/89357461

证明贪心算法的最优解:

例题: 分别用贪心算法、动态规划法、回溯法设计0-1背包问题。要求:说明所使用的算法策略;写出算法实现的主要步骤;分析算法的时间。

答:

(1)贪心算法 O(nlog(n))

  • 首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。
  • 具体算法可描述如下:
void Knapsack(int n, float M, float v[], float w[], float x[])
{Sort(n, v, w);int i;for (i = 1; i <= n; i++)x[i] = 0;float c = M;for (i = 1; i <= n; i++){if (w[i] > c)break;x[i] = 1;c -= w[i];}if (i <= n)x[i] = c / w[i];
}

(2)动态规划法 O(nc) m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下。

void KnapSack(int v[], int w[], int c, int n, int m[][11])
{int jMax = min(w[n] - 1, c);for (j = 0; j <= jMax; j++) /*m(n,j)=0 0=<j<w[n]*/m[n][j] = 0;for (j = w[n]; j <= c; j++) /*m(n,j)=v[n] j>=w[n]*/m[n][j] = v[n];for (i = n - 1; i > 1; i--){int jMax = min(w[i] - 1, c);for (j = 0; j <= jMax; j++) /*m(i,j)=m(i+1,j) 0=<j<w[i]*/m[i][j] = m[i + 1][j];for (j = w[i]; j <= c; j++) /*m(n,j)=v[n] j>=w[n]*/m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);}m[1][c] = m[2][c];if (c >= w[1])m[1][c] = max(m[1][c], m[2][c - w[1]] + v[1]);
}

(3)回溯法 O(2n)   cw:当前重量   cp:当前价值   bestp:当前最优值

void backtrack(int i) // 回溯法 i初值1
{if (i > n) // 到达叶结点{bestp = cp;return;}if (cw + w[i] <= c) // 搜索左子树{cw += w[i];cp += p[i];backtrack(i + 1);cw -= w[i];cp -= p[i];}if (Bound(i + 1) > bestp) // 搜索右子树  backtrack(i+1);  }

五、回溯法

  1. 回溯法的基本思想是:以深度优先方式系统搜索问题的算法。带有系统性和跳跃性的搜索算法。
  • (简单描述)把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。
  • (详细描述)回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
  • 基本思想类同于:图的深度优先搜索、二叉树的后序遍历

  • (拓展)分支限界法:广度优先搜索

    思想类同于:图的广度优先、二叉树的层序遍历

  • 回溯法求问题的一个解时,只要搜索到问题的一个解就可结束。
  • 在遍历的同时检查一些条件,当遍历某分支的时候,若发现条件不满足,则退回到根节点进入下一个分支的遍历,这就是“回溯”这个词的来源。而根据条件有选择的遍历,叫做剪枝或分枝定界。

     2.回溯法的解题步骤

  • ① 针对所给问题,定义问题的解空间;
  • ② 确定易于搜索的解空间结构;
  • ③ 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

     3.剪枝函数

  • 约束函数:在扩展结点处剪去不满足约束条件的子树。
  • 限界函数:剪去得不到最优解的子树。

     4.问题的解空间:问题的解空间至少包含问题的一个(最优)解。

  • 问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。
  • 解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。

回溯法基本知识_WWWWW~~的博客-CSDN博客_回溯法一、回溯法概述回溯法和分枝限界法都是基于搜索的算法,是对枚举法的改进,避免无效的搜索。回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”(即回退),尝试别的路径。 回溯法有“通用解题法”之称。 它适合于解一些组合数较大的最优化问题。二、问题的解空间1、解空间概念一个问题可能解的表示方式和它相应的解释隐含了解空间及其大小。比如:0/1背包问题可能解的表示为一个向量{x1, x2, …, xn},其中xi={0,1}则当n=3时https://blog.csdn.net/wmy01234/article/details/106070249/

  • 子集树:所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间成为子集树。

 例:0-1背包问题,从所给重量、价值不同的物品中挑选几个物品放入背包,使得在满足背包不超重的情况下,背包内物品价值最大。它的解空间就是一个典型的子集树。

  • 排列树:所给的问题是确定n个元素满足某种性质的排列时,相应的解空间就是排列树。

       例:旅行售货员问题,一个售货员把几个城市旅行一遍,要求走的路程最小。它的解就是几个城市的排列,解空间就是排列树。


总结

1.分治法与动态规划法

  • 相同点: 将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
  • 不同点:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。

2.动态规划算法与贪心算法的异同

  • 共同点: 都需要最优子结构性质, 都用来求有优化问题。
  • 不同点:
  • (1)动态规划:每一步作一个选择—依赖于子问题的解。

贪心方法:每一步作一个选择—不依赖于子问题的解。

  • (2)动态规划方法的条件:子问题的重叠性质。

可用贪心方法的条件:最优子结构性质;贪心选择性质。

  • (3)动态规划:自底向上求解;

贪心方法: 自顶向下求解。

  • 可用贪心法时,动态规划方法可能不适用;  可用动态规划方法时,贪心法可能不适用。

以上就是对于期末考试的知识点的梳理,后面会继续查漏补缺,改建完善。

这也是我写的第一篇博客,撒花花~~

写了好几天,终于大致写完了。还有好多细节在后面学习的过程中继续补充吧!

通过这次写博客,自己对这几项算法思想也有了基础了解。开心~~

总想把所有内容整理到一篇博客里,便于一站式学习(强迫症的苦恼)

如果我写的东西对你有帮助的话,奖励我一个大拇指呗(闪烁着期待的大眼睛

算法分析与设计期末总结(安徽大学)相关推荐

  1. NJUPT算法分析与设计期末考试202.12.1

    NJUPT算法分析与设计期末考试2021.11.24 判断 简答 1.算法是什么?算法的时间复杂度是什么?衡量的原则,标准,工具 2.分支限界法扩展活节点的方式有哪两种,有什么差别? 3.回溯法搜索子 ...

  2. 算法分析与设计期末总结

    这是我的算法分析与设计课程自己总结的一些知识点,应该不太全,记录一下 算法的特征: 输入,输出,确定性,有穷性,可行性 基本数据结构: 线性,树结构,图结构,集合   递归与分治 1.递归法 使用递归 ...

  3. 用c语言验证装载问题 回溯法,《算法分析与设计》期末考试复习题纲(完整版)...

    <算法分析与设计>期末复习题 一.选择题 1. 算法必须具备输入.输出和( D )等4个特性. A.可行性和安全 性 B .确定性和易读性 C.有穷性和安全 性 D .有穷性和确定性 2. ...

  4. 西电算法分析与设计核心考点汇总(期末真题,教材算法导论)

    文章目录 前言 一.历年考题 1.1 判断题 1.2 单选题 1.3 复杂度计算 1.4 分治 1.5 算法设计(01背包,最短路径) 1.6 最大子数组问题 1.7 算法设计(最长回文串) 二.核心 ...

  5. 一周搞定期末考系列之《算法分析与设计》

    转眼就到了期末复习算法的时候了 真的是一点都不慌啊 算法分析与设计这门课,由于是一门选修课,而且我对算法分析没有过多的热爱,所以没有对这门课程进行全方位的深度的学习与复习,但是我相信,将下列算法的全部 ...

  6. 南邮《算法分析与设计A》2018-2019学年第一学期期末考试回忆

    2019.1.8 13:30-15:20 <算法分析与设计A>考试 刚考完,回忆一下题目. 先总结一下:感觉难度完全不是自己想象的那样,没时间检查,好多不确定不会做.主要还是自己复习的不好 ...

  7. 非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文

    非计算机专业算法分析与设计教学改革论文 [摘要]算法分析与设计不仅是计算机专业的核心课程,同时也是与计算机有关的非计算机专业的专业课.本人针对非计算机专业学生在学习过程中存在的若干问题,就教学内容.教 ...

  8. 程振波 算法设计与分析_算法分析与设计之动态规划

    动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用 ...

  9. 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东

    算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...

最新文章

  1. 精讲深度学习RNN三大核心点,三分钟掌握循环神经网络
  2. wordpress媒体库上传含中文的文件名后,标题被重新编码。
  3. FPGA基于双端口RAM的乒乓操作
  4. Python os.walk() 方法遍历文件目录
  5. python自学网站推荐-有哪些值得推荐的Python学习网站?
  6. require js define 函数
  7. MySQL数据库-笔记01【数据库概念、数据库安装、终端操作数据库】
  8. python爬虫入门 - 代码、案例集合
  9. COOKIE和Session的原理及异同
  10. 中国顶级程序员有多牛?一个弄哭韩国,一个堪称阿里“扫地僧”
  11. 工作流引擎厂商有哪些_国内主要工作流厂商分析
  12. (亲测)躺着破解IDM下载权限,治疗不用破解补丁的强迫症们
  13. Android 插件化框架replugin replugin-host-library 源码解析
  14. 六、阻塞队列与源码分析(上)
  15. 主机扫描、端口扫描、系统扫描、漏洞扫描
  16. IE6浏览器不支持固定定位(position:fixed)解决方案
  17. http.Request
  18. pta 哥尼斯堡的“七桥问题”
  19. Java物联网项目中,运行SPringBoot脚手架,运行失败问题
  20. 机器人流程自动化 - RPA

热门文章

  1. 【python练手】yaml文件里存储元组类型tuple
  2. outlook 发邮件时换行符号如何设置
  3. 表单提交前ajax验证,在Ajax提交之前进行jQuery表单验证
  4. C/C++中关于 引用 的功能和使用
  5. 服务器有哪些虚拟主机软件,虚拟主机管理系统有哪些
  6. 博杰声学测试软件,半消声室设计
  7. 用C语言实现三子棋(含思路+完整代码)
  8. 从键盘输入两个整数,计算其乘积
  9. 创建同义词文本维护同义词
  10. 安科瑞BR系列罗氏线圈变送器,对电网中的交流大电流进行实时测量,采用真有效值和线性补偿技术,将其隔离变换为标准的直流信号输出