二分法
Posted hi3254014978
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分法相关的知识,希望对你有一定的参考价值。
1. 二分查找法代码实现:
1 // 二分查找法 2 // A[]为严格递增序列,left为二分下界,x为欲查询的数 3 // 二分区间为左闭右闭的[left, right], 传入的初值为[0, n-1] 4 int binarySearch(int A[], int left, int right, int x){ 5 int mid; 6 while (left <= right){ 7 mid = (left + right) / 2; // mid = left + (right - left) / 2; 8 if (A[mid] == x){ 9 return mid; 10 } 11 else if (A[mid] > x){ 12 right = mid - 1; 13 } 14 else if (A[mid] < x){ 15 left = mid + 1; 16 } 17 } 18 19 return -1; 20 }
2. 二分法求序列中第一个大于等于x的元素的位置L
1 // 求序列中第一个大于等于x的元素的位置L 2 // 二分上下界为左闭右闭的[left, right], 传入的初值为[0, n] 3 int lower_bound(int A[], int left, int right, int x){ 4 int mid; 5 while (left < right){ 6 mid = (left + right) / 2; 7 if (A[mid] >= x){ 8 right = mid; 9 } 10 else{ 11 left = mid + 1; 12 } 13 } 14 return left; // 返回夹出来的位置 15 }
3. 二分法求序列中第一个大于x 的元素的位置R
1 int upper_bound(int A[], int left, int right, int x){ 2 int mid; 3 while (left < right){ 4 mid = (left + right) / 2; 5 if (A[mid] > x){ 6 right = mid; 7 } 8 else{ 9 left = mid + 1; 10 } 11 } 12 return left; 13 }
4. 二分法解决“寻找有序序列第一个满足某条件的元素的位置”问题的固定模板
1 // 二分区间为左闭右闭[left, right], 初值必须能覆盖解的所有取值 2 int solve(int left, int right){ 3 int mid; 4 while (left < right){ 5 mid = (left + right) / 2; 6 if (条件成立){ 7 right = mid; 8 } 9 else{ 10 left = mid + 1; 11 } 12 } 13 14 return left; 15 }
5. 二分法求根号2的近似值
1 double calSqrt(){ 2 double left = 1, right = 2, mid; // [left, right] = [1, 2] 3 while (right - left > eps){ 4 mid = (left + right) /2; 5 if (f(mid) > 2){ 6 right = mid; 7 } 8 else{ 9 left = mid; 10 } 11 } 12 13 return mid; 14 }
6. 二分法求某个单调函数根的近似值
1 // 利用二分法求单调函数的根 2 const double eps2 = 1e-5; 3 double f(double x){ 4 return ...; // 写函数的表达式 5 } 6 7 double solve(double L, double R){ 8 double left = L, right = R, mid; 9 while (right - left > eps2){ 10 mid = (left + right) / 2; 11 if (f(mid) > 0){ 12 right = mid; 13 } 14 else{ 15 left = mid; 16 } 17 } 18 return mid; 19 }
7. 快速幂的递归写法(二分法实现)
1 // 快速幂的递归写法 2 typedef long long LL; 3 // a^b & m 4 LL binaryPow(LL a, LL b, LL m){ 5 if (b == 0) 6 return 1; 7 if (b & 1){ // 如果b为奇数 8 return a * binaryPow(a, b - 1, m) % m; 9 } 10 else{ 11 LL mu = binaryPow(a, b / 2, m); 12 return mu * mu % m; 13 } 14 }
以上是关于二分法的主要内容,如果未能解决你的问题,请参考以下文章