查找

128 阅读3分钟

二分查找:

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

应用场景: 首先,二分查找依赖的是顺序表结构,简单点说就是数组。 其次,二分查找针对的是有序数据。 再次,数据量太小不适合二分查找。 最后,数据量太大也不适合二分查找。(二分查找的底层需要依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。)

function bSearch(nums, value) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high){
    let mid = low + ((high - low) >> 1);
    if (nums[mid] < value){
      low = mid + 1;
    } else if (nums[mid] > value){
      high = mid - 1;
    } else {
      return mid;
    }
  }
  return  - 1;
}

python:

def binary_search(arr, target):
    n = len(arr)
    start = 0
    end = n - 1
    while start <= end:
        mid = (start + end) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    return -1


t = [3,12,33,40,70,90]
a = binary_search(t, 40)
print(a)

查找第一个等于给定值的元素

function bSearch(nums, value) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high){
    let mid = low + ((high - low) >> 1);
    if (nums[mid] < value){
      low = mid + 1;
    } else if (nums[mid] > value){
      high = mid - 1;
    } else {
      if (mid == 0 || nums[mid - 1] !== value){
        return mid
      } else {
        high = mid - 1;
      }
    }
  }
  return  - 1;
}

python:

def binary_first_search(arr, target):
    n = len(arr)
    start = 0
    end = n - 1
    while start <= end:
        mid = (start + end) // 2
        if arr[mid] == target:
            if mid > 0 and arr[mid-1] == target:
                end = mid
            else:
                return mid
        elif arr[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    return -1


t = [3,12,40,40, 40,70,90]
a = binary_first_search(t, 40)
print(a)

查找最后一个等于给定值的元素

function bSearch(nums, value) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high){
    let mid = low + ((high - low) >> 1);
    if (nums[mid] < value){
      low = mid + 1;
    } else if (nums[mid] > value){
      high = mid - 1;
    } else {
      if (mid == nums.length - 1 || nums[mid + 1] !== value){
        return mid
      } else {
        low = mid + 1;
      }
    }
  }
  return  - 1;
}

python:

def binary_last_search(arr, target):
    n = len(arr)
    start = 0
    end = n - 1
    while start <= end:
        mid = (start + end) // 2
        if arr[mid] == target:
            if mid < n-1 and arr[mid+1] == target:
                start = mid+1
            else:
                return mid
        elif arr[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    return -1


t = [3,12,40,40, 40,70,90]
a = binary_last_search(t, 40)
print(a)

查找第一个大于等于给定值的元素

function bSearch(nums, value) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high){
    let mid = low + ((high - low) >> 1);
    if (nums[mid] >= value){
      if (mid == 0 || nums[mid - 1] < value){
        return mid;
      }
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  return  - 1;
}

python:

def binary_fist_big_search(arr, target):
    n = len(arr)
    start = 0
    end = n - 1
    while start <= end:
        mid = (start + end) // 2
        if arr[mid] <= target:
            start = mid + 1
        else:
            if mid > 0 and arr[mid-1] > target:
                end = mid - 1
            else:
                return mid
    return -1


t = [3,12,40,40, 40,70,90]
a = binary_fist_big_search(t, 40)
print(a)

查找最后一个大于等于给定值的元素


function bSearch(nums, value) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high){
    let mid = low + ((high - low) >> 1);
    if (nums[mid] > value){
      high = mid - 1;
    } else {
      if (mid == nums.length || nums[mid + 1] > value){
        return mid;
      }
      low = mid + 1;
    }
  }
  return  - 1;
}

python:

def binary_last_big_search(arr, target):
    n = len(arr)
    start = 0
    end = n - 1
    while start <= end:
        mid = (start + end) // 2
        if arr[mid] <= target:
            start = mid + 1
        else:
            if mid < n-1 and arr[mid+1] > target:
                start = mid + 1
            else:
                return mid
    return -1


t = [3,12,40,40, 40,70,90]
a = binary_last_big_search(t, 40)
print(a)