第2章 算法分析
2016-04-20 20:51
309 查看
2.4.3最大子序列和问题的解
2.欧几里得算法
定义:计算最大公因数,通过连续计算余数直到余数是0为止,最后的非零余数就是最大公因数。
代码:
#include<string> #include<vector> #include<algorithm> #include<iostream> using namespace std; //求最大子序列和算法 /* 二分查找法,复杂度nlogn*/ int maxSumRec(const vector<int>&a,int left,int right) { if (left==right) { if (a[left]>0) { return a[left]; } else { return 0; } } int center=(left+right)/2; int maxLeftSum=maxSumRec(a,left,center); int maxRightSum=maxSumRec(a,center+1,right); int maxLeftBorderSum=0,leftBorderSum=0; for (int i = center; i < left; i--) { leftBorderSum+=a[i]; if (leftBorderSum>maxLeftBorderSum) { maxLeftBorderSum=leftBorderSum; } } int maxRightBorderSum=0,RightBorderSum=0; for (int i = center; i < left; i++) { RightBorderSum+=a[i]; if (RightBorderSum>maxRightBorderSum) { maxRightBorderSum=RightBorderSum; } } return max3(maxLeftSum,maxRightSum,maxRightBorderSum+maxLeftBorderSum); } /************************************************************************/ /*线性复杂度算法*/ int maxSubSum4(const vector<int> &a) { int maxSum=0,thisSum=0; for (int i = 0; i < a.size(); ++i) { thisSum+=a[i]; if (thisSum>maxSum) { maxSum=thisSum; } else if(thisSum<0){ thisSum=0; } } }
int maxSubSum3(const vector<int> &a) { return maxSumRec(a,0,a.size()-1); } int main() { int s; cin>> s; return 0; }
2.4.4 运行时间中的对数</span>
除分治算法外,对数规律可概括为下列法则:</span>
如果一个算法将常数时间(O(1))将问题的大小削减为其一部分(通常为1/2),那么该算法就算O(logN)的。</span></span>
具有对数特点的几个例子:</span>
1.二分搜索
定义:给定一个整数X和整数A0,A1,....AN-1,后者已经预先排序并在内存中,求下标i使得Ai=X,如果X不在数据中,则返回-1.</span>
代码:
template<typename Comparable> int binarySearch(const vector<Comparable> &a,const Comparable) &x) { int low =0,high=a.size()-1; while(low<=high) { int mid=(low+high)/2; if(a[mid]<x) low=mid+1; else if(a[mid]>x) high=mid-1; else return mid; } return NOT_FOUND; }
2.欧几里得算法
定义:计算最大公因数,通过连续计算余数直到余数是0为止,最后的非零余数就是最大公因数。
代码:
long gcd(long m,long n) { while(n!=0) { long rem=m%n; m=n; n=rem; } return m; }
相关文章推荐
- PL/0 词法分析器
- spring错误汇总
- 为什么要用枚举实现Singleton--java学习笔记
- 向eclipse中导入源码教程详解
- android面试中经典的75道逻辑思维题
- Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式
- bzoj4538 [Hnoi2016]网络
- JVM的Heap Memory和Native Memory
- spring错误汇总
- RHEL7安装部署Tomcat7
- 1001 Can you solve this equation?
- PopupWindow,不消失
- splay旋转模板
- java中的事件监听是怎样实现随时监听的
- IMCP包如何区分
- java毕向东听课笔记20(基本数据类型包装类)
- uva 11572 unique snowflakes——yhx
- Codeforces Beta Round #9 (Div. 2 Only) D. How many trees? dp
- [转]Acrylic DNS Proxy 使用方法
- 正则表达式-概要