数据结构与算法分析再读之引论和算法分析
来源:互联网 发布:linux 退出 编辑:程序博客网 时间:2024/06/01 09:18
本章由两个问题引开,并证明了一些算法基础的数学公式。
1. 两个问题
a. 求N个数中的前K个最大值问题。从全部排序法,到维持一个K个元素的数组方法,再到2叉堆法,一步一步说明算法重要性。
b. 字谜问题。
2. 数学公式
指数问题,对数问题,级数和问题。
3. 一些数学证明方法
a.数学归纳法。 两要素:基准情形成立,当n=N成立时,n=N+1也成立,得证。
b.递归方法。两要素:停止条件,不断推进
4. 大O表示法
单循环为O(N),嵌套两层为O(N2),分治2分为logN. 斐波拉契为(5/3)N次方
例子:最大子序列最大和问题的求解。
穷举法,穷举所有数列,2分法还有一个用技巧的O(N)算法。代码如下:
#include <stdio.h>int maxSubSeqence(const int A[],unsigned int n){ int i,j,k=0; int sum,maxsum=0; for(i=0;i<n;i++) for(j=i;j<n;j++) { sum =0; for(k=i;k<=j;k++) sum = sum + A[k]; if (sum>maxsum) maxsum = sum ; } return maxsum;}int maxSubSeqence2(const int A[],unsigned int n){ int i,j,k=0; int sum,maxsum=0; for(i=0;i<n;i++) { sum =0; for(j=i;j<n;j++) { sum = sum + A[j]; if (sum>maxsum) maxsum = sum ; } } return maxsum;}int maxSubSeqence3(const int A[],int begin, int end){ if (begin==end) { if (A[begin]>0) return A[begin]; else return 0; } int middle =(begin+end)/2; int leftsum,rightsum; leftsum = maxSubSeqence3(A,begin,middle); rightsum = maxSubSeqence3(A,middle+1,end); int maxleftbordersum=0,maxrightbordersum=0, bordersum=0; int i; for(i = middle+1;i<=end; i++) { bordersum = bordersum+ A[i]; if (bordersum>maxrightbordersum) maxrightbordersum = bordersum; } bordersum =0; for(i = middle;i>=begin; i--) { bordersum = bordersum+ A[i]; if (bordersum>maxleftbordersum) maxleftbordersum = bordersum; } int max = leftsum; if (max<rightsum) max =rightsum; if (max<maxleftbordersum+maxrightbordersum) max =maxleftbordersum+maxrightbordersum; return max;}int maxSubSeqence4(const int A[],int n){ int i=0,max =0; int sum=0; for (i=0;i<n;i++) { sum=sum+A[i]; if(sum>max) max= sum; if(sum<0) sum =0; } return max;}int main(){ int A[] = {1,-3, 9,2,1, -10,6,-7,8} ; int maxsum = maxSubSeqence(A,sizeof(A)/sizeof(int)); printf("maxsum=%d\n",maxsum); int maxsum2 = maxSubSeqence2(A,sizeof(A)/sizeof(int)); printf("maxsum2=%d\n",maxsum2); int maxsum3 = maxSubSeqence3(A,0,sizeof(A)/sizeof(int)-1); printf("maxsum3=%d\n",maxsum3); int maxsum4 = maxSubSeqence4(A,sizeof(A)/sizeof(int)); printf("maxsum4=%d\n",maxsum4); return 0;}
logN的算法欧几里得求解最大公约数:
#include <stdio.h>int gcd(int m, int n){ while(n>0) { int rem = m%n; m = n; n = rem; } return m;}int main(){ int m = 1345, n = 9745; printf("gcd = %d\n", gcd(m,n));}~
求x的N次方运算:
#include <stdio.h>int power(int x,int n){ if (n==0) return 1; if (n==1) return x; if (n%2==0) return power(x*x,n/2); else return power(x*x,(n-1)/2)* x;}int main(){ int m = power(2,10); printf("power 2,10=%d\n", m);}
0 0
- 数据结构与算法分析再读之引论和算法分析
- 《数据结构与算法分析--c语言描述》之第一章:引论
- ReviewForJob(1)数据结构与算法分析引论
- 数据结构与算法分析 | 01 | 引论
- 数据结构和算法分析(一) 引论
- 《数据结构与算法分析》引论:选择问题实现
- 数据结构与算法分析(读书笔记):1.引论
- 1:数据结构与算法分析(c语言描述)引论(1)
- 读书笔记:数据结构与算法分析(java语言描述)——引论
- 数据结构与算法分析(第3版)练习题-第1章-引论
- 数据结构算法与分析
- 数据结构与算法分析
- 数据结构与算法分析
- 数据结构与算法分析
- 数据结构与算法分析
- 数据结构与算法分析
- 数据结构与算法分析
- 数据结构与算法分析
- 【Unity】工具类
- 动态改变python的搜索路径
- Qt 无边框、透明、可移动、的个性窗体
- 对大盘的一些看法
- solr源码导入eclipse
- 数据结构与算法分析再读之引论和算法分析
- Scala使用withFilter减少中间数据产生
- 那些我们解过的bug之换状态栏没有sim卡的图标
- 关系型数据库管理系统
- Codeforces 612 D. The Union of k-Segments (非递归线段树+离散化)
- 正则表达式:Pattern类与Matcher类详解
- 自动化系统往后的模样
- js创建一个新的节点(不断补充)
- HDU1455Sticks(dfs剪枝)