算法分析与设计基础 学习笔记 第一章
2013-03-19 21:45
696 查看
第一章用了几个不同 求 最大公约数的例子 来引入算法分析与设计的概念
这是类似于蛮力法的例子
然后是我们在中学学到的质数表求解,这个例子中要用到1~N的质数,于是引入了埃拉托色尼筛
//欧几里得算法求最大公约数 //Input: m,n 非负不全为0的非负整数 //Output: m,n 的最大公约数 int gcdEuclid(int m, int n) { int r = 0; while( 0 != n) { r = m%n; m = n; n = r; } return m; }
//欧几里得算法求最大公约数 //Input: m,n 非负不全为0的非负整数 //Output: m,n 的最大公约数 int gcdEuclid(int m, int n) { //减法版本 while(0 != n) { //交换两数 if(m < n) { m = m + n; n = m; m = m - n; } m = m - n; } }
这是类似于蛮力法的例子
//连续减法求最大公约数 //Input: m,n 非负不全为0的非负整数 //Output: m,n 的最大公约数 int gcdContiSub(int m, int n) { int t = 0; t = m < n ? m : n; while(0 != t) { if(m%t == 0) { if(n%t == 0) break; } t--; } return t; }
然后是我们在中学学到的质数表求解,这个例子中要用到1~N的质数,于是引入了埃拉托色尼筛
//质数表求解 //Input: m,n 非负不全为0的非负整数 //Output: m,n 的最大公约数 int gcdHighScool(int m, int n) { vector<int> mPrime; vector<int> nPrime; EratosthenesSiece(mPrime, m); EratosthenesSiece(nPrime, n); vector<int> mPrimeFactors; vector<int> nPrimeFactors; //进行质因数分解 int mm = m; for(int i=0; i < mPrime.size(); i++) { while(mm != mPrime[i]) { if(mm % mPrime[i] == 0) { mPrimeFactors.push_back(mPrime[i]); mm/=mPrime[i]; } else { break; } } } mPrimeFactors.push_back(mm); int nn = n; for(int i=0; i < nPrime.size(); i++) { while(nn != nPrime[i]) { if(nn % nPrime[i] == 0) { nPrimeFactors.push_back(nPrime[i]); nn/=nPrime[i]; } else { break; } } } nPrimeFactors.push_back(nn); //质数表求解最大公约数 即中学所学的解法 int i=0,j=0,r=1; int mPF = mPrimeFactors.size(); int nPF = nPrimeFactors.size(); while(true) { if(mPrimeFactors[i] == nPrimeFactors[j]) { r *= mPrimeFactors[i]; if(i == mPF - 1 && j == mPF - 1) break; if(i < mPF - 1) i++; if(j < nPF - 1) j++; }else if(mPrimeFactors[i] > nPrimeFactors[j]) { j++; if(j >= nPF) break; }else { i++; if(i >= mPF) break; } } return r; } //埃拉托色尼筛,求0-N的质数 void EratosthenesSiece(vector<int> &out, int n) { out.clear(); bool *isPrime = new bool ; memset(isPrime, true, sizeof(isPrime[0]*n)); for(int i=2; i<n; i++) { if(isPrime[i]) { for(int j=i; i*j<n; j++) { isPrime[i*j] = false; } } } for(int i=2; i < n; i++) { if(isPrime[i]) { out.push_back(i); } } delete [] isPrime; }
相关文章推荐
- 算法设计技巧与分析笔记 第一章
- 算法分析与设计学习笔记-概率算法_2
- 算法设计和复杂性理论学习笔记_2(数学基础)
- 算法分析与设计学习笔记
- 算法分析基础学习笔记
- (清华大学HTML+CSS+JavaScript入门到精通学习笔记)第一章 网页设计基础
- 算法设计技巧和分析学习笔记1 (归纳法、分治和动态规划)
- 算法分析与设计学习笔记-概率算法
- 设计模式学习笔记5——设计模式基础4--常量数据管理器
- Anandkumar:高维学习概率隐性变量模型及张量算法的设计分析
- Java之学习笔记(11)------------算法性能分析
- 20135337——信息安全设计基础第八周学习笔记
- 计算广告学习笔记1.8 广告的基础知识-ROI 分析
- 20145238《信息安全系统设计基础》第1周学习笔记
- 【算法与设计分析基础】大整数乘法int[]版+分治法求幂
- 大数据算法MOOC笔记2:大数据算法定义、分析与设计
- javascript 设计模式 学习笔记(二)--基础(call,apply)
- 系统分析与设计学习笔记之一: Introduction of SE & OOAD
- 嵌入式开发之C基础学习笔记02--第一个例子分析
- 基础算法学习笔记(一)----回溯法