Binary Search and Euclid Algorithm
2017-12-29 14:18
399 查看
#include<iostream>
using namespace std;
/*
Performs the standard binary search using two comparisons per level.
Returns index where item is found or -1 if not found.
*/
const int NOT_FOUND = -1;
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; //found
}
}
return NOT_FOUND;
}
/*
Euclid's Algorithm
Euclid's Algorithm for computing the greatest common divisor
*/
long long gcd(long long m, long long n)
{
while (n != 0)
{
long long rem = m%n;
m = n;
n = rem;
}
return m;
}
欧几里得算法的思想
欧几里得算法的思想基于辗转相除法的原理,辗转相除法是欧几里得算法的核心思想,欧几里得算法说白了其实就是辗转相除法的计算机算法的事项而已。如果gcd(a,b)来表示a和b的最大公约数,那么根据辗转相除法的原理,有gcd(a,b)=gcd(b,a mod(b)),其中mod()表示模运算,并且不妨让a》b这样方便模运算。
辗转相除法的正确性gcd(a,b)=gcd(b,a mod(b))的证明:
第一步:令c为a和b的最大公约数,数学符号表示为c=gcd(a,b)。因为任何俩个实数的最大公约数的最大公约数c一定是存在的,也就是说必然存在俩个数k1,k2使得a=k1*c,b=k2*c
第二步:a mod(b)等价于存在整数r,k3使得余数r=a-k3*b;
r=a-k3*b=k1*c-k3*k2*c=(k1-k3*k2)c;
显然,a和b的余数r是最大公因数c的倍数。
using namespace std;
/*
Performs the standard binary search using two comparisons per level.
Returns index where item is found or -1 if not found.
*/
const int NOT_FOUND = -1;
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; //found
}
}
return NOT_FOUND;
}
/*
Euclid's Algorithm
Euclid's Algorithm for computing the greatest common divisor
*/
long long gcd(long long m, long long n)
{
while (n != 0)
{
long long rem = m%n;
m = n;
n = rem;
}
return m;
}
欧几里得算法的思想
欧几里得算法的思想基于辗转相除法的原理,辗转相除法是欧几里得算法的核心思想,欧几里得算法说白了其实就是辗转相除法的计算机算法的事项而已。如果gcd(a,b)来表示a和b的最大公约数,那么根据辗转相除法的原理,有gcd(a,b)=gcd(b,a mod(b)),其中mod()表示模运算,并且不妨让a》b这样方便模运算。
辗转相除法的正确性gcd(a,b)=gcd(b,a mod(b))的证明:
第一步:令c为a和b的最大公约数,数学符号表示为c=gcd(a,b)。因为任何俩个实数的最大公约数的最大公约数c一定是存在的,也就是说必然存在俩个数k1,k2使得a=k1*c,b=k2*c
第二步:a mod(b)等价于存在整数r,k3使得余数r=a-k3*b;
r=a-k3*b=k1*c-k3*k2*c=(k1-k3*k2)c;
显然,a和b的余数r是最大公因数c的倍数。
相关文章推荐
- algorithm 1.4.22 Binary search with only addition and subtraction
- 减治法——二分查找算法(Decrease and Conquer by a Factor - Binary Search Algorithm)
- Algorithm: Binary Tree(2) -- Special Trees (BST and Balanced Tree)
- Algorithm: Binary Tree(2) -- Special Trees (BST and Balanced Tree)
- algorithm-binary_search
- [Algorithms] Binary Search Algorithm using TypeScript
- LeeCode Search in a Big Sorted Array java solution use binary search algorithm
- 【DataStructure&AlgorithmInJava】Ch02-OrderArray w binarySearch
- 中序遍历二叉排序树:BinarySearchTree:Create a tree and InorderTree
- Convert Sorted Array to Binary Search Tree and Merge Two Sorted Lists
- Binary search with addition and subtraction
- Binary search tree system and method
- leetcode find-minimum-in-rotated-sorted-array java solution use binary search algorithm
- Binary search algorithm in C source code
- What is the difference between a binary tree, a binary search tree, a B tree and a B+ tree?
- BinarySearchAlgorithm
- Kmeans based indexing and Asymmetric Distance Computation for ANN search (Binary Local Feature):...
- PAT Advanced Level 1043. Is It a Binary Search Tree (25)(Java and C++)
- Binary Search Algorithm
- binary search algorithm