返回
超越二分,JavaScript和Go如何解决数组常见搜索算法?
前端
2023-10-11 07:23:43
在信息汪洋中,搜索是快速获取有用信息的一把利器,而在计算机程序里,数组常常作为存储数据的基本结构,因此,数组搜索算法对于程序员而言尤为重要。本文将带您领略常见数组搜索算法的魅力,以及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
}
希望这篇文章对您有所帮助!如果您有任何问题或建议,请随时留言。