二分查找

1.二分查找的时间复杂度分析:

二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说:

一次二分剩下:n/2

两次:n/4

m次:n/(2^m)

最坏情况是排除到最后一个值之后得到结果,所以:
n/(2^m) = 1

2^m = n

所以时间复杂度为:log2(n)

 

2.二分查找的实现方法:

(1)递归

  1. int RecursiveBinSearch(int arr[], int bottom, int top, int key) {
  2. if (bottom <= top) {
  3. int mid = (bottom + top) / 2;
  4. if (arr[mid] == key) {
  5. return mid;
  6. }
  7. else if (key < arr[mid]) {
  8. return RecursiveBinSearch(arr, bottom, mid - 1, key);
  9. }
  10. else {
  11. return RecursiveBinSearch(arr, mid + 1, top, key);
  12. }
  13. }
  14. else {
  15. return -1;
  16. }
  17. }

 

(2)非递归

  1. int nonRecursiveBinSearch(int arr[], int size, int key) {
  2. int bottom = 0, top = size - 1, mid;
  3. while (bottom <= top) {
  4. mid = (bottom + top) / 2;
  5. if (arr[mid] == key) {
  6. return mid;
  7. }
  8. else if (key < arr[mid]) {
  9. top = mid - 1;
  10. }
  11. else {
  12. bottom = mid + 1;
  13. }
  14. }
  15. return -1;
  16. }

 

3.LeetCode题目:74 Search a 2D Matrix

原题地址:
https://leetcode.com/problems/search-a-2d-matrix/description/

 

题目:

 

解法:

这道题给出一个二维数组(已排序),再给定一个数,让我们确定这个数是否在这个二维数组里面。由于这个二维数组是排好序的,因此我们可以使用两次二分查找,第一次使用先定位好这个数在第几行,第二次使用确定这个数在第几列。

代码如下:

  1. class Solution {
  2. public:
  3. bool searchMatrix(vector<vector<int>>& matrix, int target) {
  4. if (matrix.size() == 0 || matrix[0].size() == 0) return false;
  5. int col = getCol(matrix, 0, matrix.size() - 1, target);
  6. if (col == -1) {
  7. return false;
  8. }
  9. else {
  10. return isExist(matrix, col, 0, matrix[col].size() - 1, target);
  11. }
  12. }
  13. int getCol(vector<vector<int>>& matrix, int first, int last, int target) {
  14. if (first > last) return -1;
  15. int mid = (first + last) / 2;
  16. if (matrix[mid][0] <= target && target <= matrix[mid][matrix[mid].size() - 1]) {
  17. return mid;
  18. }
  19. else {
  20. if (target < matrix[mid][0]) {
  21. return getCol(matrix, first, mid - 1, target);
  22. }
  23. else {
  24. return getCol(matrix, mid + 1, last, target);
  25. }
  26. }
  27. }
  28. bool isExist(vector<vector<int>>& matrix, int col, int first, int last, int target) {
  29. if (first > last) {
  30. return false;
  31. }
  32. else {
  33. int mid = (first + last) / 2;
  34. if (matrix[col][mid] == target) {
  35. return true;
  36. }
  37. else {
  38. if (matrix[col][mid] > target) {
  39. return isExist(matrix, col, first, mid - 1, target);
  40. }
  41. else {
  42. return isExist(matrix, col, mid + 1, last, target);
  43. }
  44. }
  45. }
  46. }
  47. };

 

 

后来出于好奇直接用两层循环来查找,最后所花的时间竟然和用二分查找一样,哎:

  1. class Solution {
  2. public:
  3. bool searchMatrix(vector<vector<int>>& matrix, int target) {
  4. for (int i = 0; i < matrix.size(); i++) {
  5. for (int j = 0; j < matrix[i].size(); j++) {
  6. if (matrix[i][j] == target) return true;
  7. }
  8. }
  9. return false;
  10. }
  11. };

 

版权声明:本文为fengziwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/fengziwei/p/7993118.html