返回

超越二分,JavaScript和Go如何解决数组常见搜索算法?

前端

在信息汪洋中,搜索是快速获取有用信息的一把利器,而在计算机程序里,数组常常作为存储数据的基本结构,因此,数组搜索算法对于程序员而言尤为重要。本文将带您领略常见数组搜索算法的魅力,以及JavaScript和Go语言对其的实现。

一、常见数组搜索算法

数组搜索算法有多种,我们着重介绍以下三种经典算法。

1. 线性搜索

线性搜索是最简单的一种搜索算法。它的原理是,从数组的第一个元素开始,逐个比较,直到找到目标元素或搜索到数组结尾。

function linearSearch(arr, target) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === target) {
      return i;
    }
  }
  return -1;
}
func linearSearch(arr []int, target int) int {
  for i, v := range arr {
    if v == target {
      return i
    }
  }
  return -1
}

2. 二分查找

二分查找是另一种常用的搜索算法。它利用数组有序的特性,通过不断地将搜索区间对半分,缩小范围,以提高搜索效率。

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (arr[mid] === target) {
      return mid;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return -1;
}
func binarySearch(arr []int, target int) int {
  left := 0
  right := len(arr) - 1

  for left <= right {
    mid := (left + right) / 2

    if arr[mid] == target {
      return mid
    } else if arr[mid] < target {
      left = mid + 1
    } else {
      right = mid - 1
    }
  }

  return -1
}

3. 插值搜索

插值搜索是一种介于线性搜索和二分查找之间的搜索算法。它通过估计目标元素在数组中的位置,直接跳到该位置进行比较,从而减少搜索次数。

function interpolationSearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const pos = left + Math.floor(((right - left) / (arr[right] - arr[left])) * (target - arr[left]));

    if (arr[pos] === target) {
      return pos;
    } else if (arr[pos] < target) {
      left = pos + 1;
    } else {
      right = pos - 1;
    }
  }

  return -1;
}
func interpolationSearch(arr []int, target int) int {
  left := 0
  right := len(arr) - 1

  for left <= right {
    pos := left + ((right-left) / (arr[right]-arr[left])) * (target - arr[left])

    if arr[pos] == target {
      return pos
    } else if arr[pos] < target {
      left = pos + 1
    } else {
      right = pos - 1
    }
  }

  return -1
}

二、算法手画步骤

1. 线性搜索

线性搜索

2. 二分查找

二分查找

3. 插值搜索

插值搜索

三、JavaScript和Go语言实现

为了让读者更加直观地理解这些搜索算法,我们以JavaScript和Go两种编程语言对它们进行了实现。

JavaScript实现:

// 线性搜索
function linearSearch(arr, target) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === target) {
      return i;
    }
  }
  return -1;
}

// 二分查找
function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (arr[mid] === target) {
      return mid;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return -1;
}

// 插值搜索
function interpolationSearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const pos = left + Math.floor(((right - left) / (arr[right] - arr[left])) * (target - arr[left]));

    if (arr[pos] === target) {
      return pos;
    } else if (arr[pos] < target) {
      left = pos + 1;
    } else {
      right = pos - 1;
    }
  }

  return -1;
}

Go语言实现:

// 线性搜索
func linearSearch(arr []int, target int) int {
  for i, v := range arr {
    if v == target {
      return i
    }
  }
  return -1
}

// 二分查找
func binarySearch(arr []int, target int) int {
  left := 0
  right := len(arr) - 1

  for left <= right {
    mid := (left + right) / 2

    if arr[mid] == target {
      return mid
    } else if arr[mid] < target {
      left = mid + 1
    } else {
      right = mid - 1
    }
  }

  return -1
}

// 插值搜索
func interpolationSearch(arr []int, target int) int {
  left := 0
  right := len(arr) - 1

  for left <= right {
    pos := left + ((right-left) / (arr[right]-arr[left])) * (target - arr[left])

    if arr[pos] == target {
      return pos
    } else if arr[pos] < target {
      left = pos + 1
    } else {
      right = pos - 1
    }
  }

  return -1
}

希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时留言。