您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法分析c++:算法分析

2017-11-07 16:09 295 查看

最大子序列和问题

//相比于其他三种算法,这种算法剔除了多余的循环部分,
//运行时间是明显缩减的,但其正确性却不是那么明显,
//需要正式的正确性证明。
#include <vector>
int maxSubSum(const std::vector<int> &a) {
int maxSum = 0;
int thisSum = 0;
for (int j = 0; j < a.size(); j++) {
//代码的精髓部分就在于此,若a[j]小于零,
//那它就无法作为子序列的起点,而一旦thisSum小于零,
//它自然也无法成为子序列的前缀子序列,遍历后我们不会
//漏掉最优解;
thisSum += a[j];
if (thisSum > maxSum) {
maxSum = thisSum;
}
else if (thisSum < 0) {
thisSum = 0;
}
}
return maxSum;
}


二分搜索(binary search)

给定一个整数X,和整数A0,A1,A2,…,An-1,后者已经预先排序并在内存中,求下标i是的X=Ai,如果X

不在序列中,返回i=-1.

#include <vector>

int binarySearch(const std::vector<int> &a, const int x) {
int low = 0;
int 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 -1;
}


欧几里得算法

计算两个整数的最大公因数(The greatest common factor)

long gcd(long m, long n) {
while (n != 0) {
long rem = m%n; //若m<n,则第一次实现mn交换
m = n;
n = rem;
}
return m;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法分析 c++
相关文章推荐