当前位置:   article > 正文

算法设计与分析

算法设计与分析

第一章        算法概述

1.算法渐进性态:当问题规模(n)趋近无穷大,称为O(n)=  表达式,取表达式的最高阶无穷大,这个就是运行时间的上界。

问题的上界

问题准确界

问题的下界

问题一:知问题复杂度,求计算机速度提升一定倍数,求同样时间内处理问题规模变为原来多少?

问题:解决某问题有三种算法,复杂性分别为1000N、10N的2次方、2的N次方,在一台机器上可处理问题的规模分别为S1、S2、S3 。若机器速度提高到原来的10倍,问在同样时间内可处理问题的大小如何?

解:设计算机原来速度为v,则提升速度后10v,

问题规模/速度=时间,利用两次处理时间相等但问题规模不同列方程。

原问题规模/原速度 = 新问题规模 / 新速度

则,1000S1 / v  = 1000n / ( 10v)

问题二:知问题复杂度,改进复杂度,求提升后,原来问题解决时间。

问题:例2:问题P的算法复杂度为T(n)=n的3次方(毫秒),现改善为T(n)=n的2次方(毫秒)。问原来运行1小时的问题实例,现在要运行多少时间?

解:设计算机速度为v,原来用时为t, 问题规模为n,新用时为t1。

问题规模/速度=时间,利用两次处理速度相等、问题规模相同列方程。

同时利用原来的用时求出问题规模n的大小。

n^3 / t = n^2 / t1

n^3 = 1 hour

n=153

t1 = t / n = 23.5

第二章        递归与分治

阶乘函数

  1. int Factorial(int n)
  2. {
  3. if(n==0) return 1;
  4. return n*Factorial(n-1);
  5. }

Fibonacci数列

无穷数列1,1,2,3,5,8,13,21,34,55,……。

  1. int fibonacci(int n)
  2. {
  3. if (n <= 1) return 1;
  4. return fibonacci(n-1)+fibonacci(n-2);
  5. }

 

 

排列问题

整数划分问题

一般递归问题会用非递归方法代替:

1. 可化为非递归方法。

2. 栈模拟。

 分治法的基本思想

分治法的设计思想:

1) 将一个难以直接解决的大问题,分割成一些规模较小的子问题;这些子问题互相独立且与原问题相同

2)递归地解子问题

3) 将各个子问题的解合并得到原问题的解

  1. Divide-and-Conquer(P)
  2. {
  3. if ( |P|<=n0) Adhoc(P);
  4. divide P into smaller subinstances P1 ,P2,... ,Pk;
  5. for (i = 1;i <= k; i++)
  6. yi=Divide-and-Conquer(Pi);
  7. return Merge( yl ,..., yk);
  8. }

算法时间复杂度

 

主方法

 

 

 

二分搜索技术

  1. int BinarySearch(Type a[ ], const Type &x,int n)
  2. {
  3. int left=0; int right=n-1;
  4. while(left<=right){
  5. int middle=(left+right)/2;
  6. if(x==a[middle])
  7. return middle;
  8. else if(x>a[middle])
  9. left=middle+1;
  10. else
  11. right=middle-1;
  12. }
  13. return -1;
  14. }

棋盘覆盖问题

 

 合并排序

  1. temlplate <class type>
  2. void MergeSort(Type a[], int left, int right)
  3. { if (1eft < right) //至少有2个元素
  4. {
  5. int i = (left + right ) /2; //取中点
  6. MergeSort(a, left, i);
  7. MergeSort(a, i+1, right);
  8. Merge(a, b, left, i, right);//从a合并到数组b
  9. copy(a, b, left, right);//复制回数组a
  10. }
  11. }

快速排序算法

  1. //将>=x的元素交换到右边区域
  2. //将<=x的元素交换到左边区域
  3. int Partition(Type a[ ],int p , int r )
  4. {
  5. int i=p;
  6. j=r+1;
  7. type x=a[p];
  8. while(true)
  9. {
  10. while(a[++i] < x&&i<r);
  11. while(a[--j] > x);
  12. if (i>=j ) break;
  13. swap(a[i],a[j]);
  14. }
  15. a[p] = a[j];
  16. a[ j] = x;
  17. return j }
  18. template <class Type>
  19. void QuickSoft(Type a[], int p, int r)
  20. {
  21. if(p<r){
  22. int q=Partition(a, p, r)
  23. QuickSort(a, p, q-1); //对左半段排序
  24. QuickSoft(a, q+1, r); //对右半段排序
  25. }
  26. }
  27. //随机选择基准点、
  28. template <class Type>
  29. void randomizedQuickSoft(Type a[], int p, int r)
  30. {
  31. if (p<r) {
  32. int q=randomizedPartition(a, p, r)
  33. randomizedQuickSort(a, p, q-1); //对左半段排序
  34. randomizedQuickSoft(a, q+1, r); //对右半段排序
  35. }
  36. }
  37. template <class Type>
  38. int randomizedPartition(Type a[], int p, int r)
  39. {
  40. int i=random( p, r)
  41. swap( a[i], a[p] )
  42. return Partition (a,p,r)
  43. }

最接近点对问题

给定平面上n个点,找其中的一对点,使得

n个点组成的所有点对中,该点对间的距离最小。

线性时间选择

大整数的乘法

 Strassen矩阵乘法

第三章        动态规划

矩阵连乘

 

最大子段和

 

  1. int MaxSum(int n, int * a)
  2. {
  3. int sum=0, b=0;
  4. for (int i=1; i<=n; i++) {
  5. if(b>0) b+=a[i];
  6. else b=a[i];
  7. if (b>sum) sum=b;
  8. }
  9. return sum
  10. } //时间和空间复杂度:O(n)

 0-1背包

最长公共子序列

最大子段和

  1. int MaxSum(int n, int * a)
  2. {
  3. int sum=0, b=0;
  4. for (int i=1; i<=n; i++) {
  5. if(b>0) b+=a[i];
  6. else b=a[i];
  7. if (b>sum) sum=b;
  8. }
  9. return sum
  10. } //时间和空间复杂度:O(n)

 流水作业调度

图像压缩

 

第四章        贪心算法

贪心算法的基本要素:

(1) 最优子结构

问题的最优解包含子问题的最优解

(2) 贪心选择性质

问题的整体最优解可以通过一系列局部最优选择达到

 

背包问题

最优装载

哈夫曼编码

哈夫曼树和哈夫曼编码_哔哩哔哩_bilibili

构成赫夫曼树的步骤:

1)从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树

2)取出根节点权值最小的两颗二叉树

3)组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和

4)再将这颗新的二叉树,以根节点的权值大小 再次排序, 不断重复 1-2-3-4 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

哈夫曼编码就是根节点到树叶的编码,左子树为0,右子树为1

 

 

第五章        回溯法

背包问题

 

图的着色:

        已知无向图G=(V,E)和m种不同的颜色,如果只允许使用这m种颜色对图G的结点着色,每个结点着一种颜色。问是否存在一种着色方案,使得图中任意相邻的两个结点都有不同的颜色。整数m称为图G的着色数。

 

 

 

 

 

 

 

 

 

 

 

第六章        分支限界法概述

 背包问题

优先级队列

优先级定义:当前价值+剩余能装的最大价值(上界函数)

分支限界法求解0/1背包问题动画演示(Implementation of 0/1 Knapsack using Branch and Bound)_哔哩哔哩_bilibili

单源最短路径

约束函数:c[i][j]<inf        dist[i]+c[i][j] <dist[j]     

优先级:节点所对应的当前路长

 装载问题

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/496501
推荐阅读
相关标签
  

闽ICP备14008679号