golang二分查找算法实现

这篇具有很好参考价值的文章主要介绍了golang二分查找算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

项目中使用到有序数组查找特定元素,简单记录下Golang中二分查找算法。


二分查找算法简介

二分查找算法是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将查找范围缩小一半,来快速定位目标元素是否存在。该算法要求数组是有序的,这是因为有序数组的特性允许我们在每一步中排除掉一半的元素。

以下是二分查找的基本步骤:

  1. 初始化: 确定数组的初始搜索范围,通常是整个数组。设定lowhigh分别为搜索范围的最低和最高索引。

  2. 中间元素: 计算中间元素的索引,即mid = (low + high) / 2

  3. 比较: 将目标值与中间元素进行比较。

    • 如果目标值等于中间元素,搜索成功,返回中间元素的索引。
    • 如果目标值小于中间元素,说明目标值可能在左半部分,更新high = mid - 1
    • 如果目标值大于中间元素,说明目标值可能在右半部分,更新low = mid + 1
  4. 循环: 重复上述步骤,直到搜索范围缩小到无法再分割,即low > high。此时,如果目标值存在,返回其索引;否则,返回-1表示目标值不存在。

二分查找的时间复杂度是O(log n),其中n是数组的大小。由于每一步都能将搜索范围减半,因此它在大型有序数组中的性能非常高效。这使得二分查找成为一种常用的查找算法。

请注意,二分查找要求数组是有序的,因此在使用之前需要确保数组有序。

二分查找算法简单实现

package main

import "fmt"

// 二分查找函数
func binarySearch(arr []int, target int) int {
	low, high := 0, len(arr)-1

	for low <= high {
		mid := (low + high) / 2

		if arr[mid] == target {
			return mid // 找到目标值,返回索引
		} else if arr[mid] < target {
			low = mid + 1 // 目标值在右半部分,缩小搜索范围
		} else {
			high = mid - 1 // 目标值在左半部分,缩小搜索范围
		}
	}

	return -1 // 目标值不存在
}

func main() {
	// 示例数组,必须是已排序的数组
	arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	// 要查找的目标值
	target := 7

	// 调用二分查找算法
	index := binarySearch(arr, target)

	if index != -1 {
		fmt.Printf("目标值 %d 在数组中的索引是 %d\n", target, index)
	} else {
		fmt.Printf("目标值 %d 不存在于数组中\n", target)
	}
}

在这个例子中,binarySearch函数接受一个已排序的数组和目标值作为参数,然后使用二分查找算法找到目标值的索引。如果找到目标值,返回其索引;如果找不到,返回-1。在main函数中,我们提供了一个已排序的数组和要查找的目标值,然后调用binarySearch函数进行查找。

二分查找算法进阶使用

二分查找算法在进阶使用时,可以通过一些变体或特殊情况的处理来满足更复杂的需求。以下是一些二分查找算法的进阶使用场景和技巧:

1. 查找第一个或最后一个等于目标值的元素:

在有序数组中,如果存在重复元素,可以通过稍作修改,使二分查找找到第一个等于目标值或最后一个等于目标值的元素。例如,找到数组中第一个等于目标值的索引:

func firstOccurrence(arr []int, target int) int {
    low, high := 0, len(arr)-1
    result := -1

    for low <= high {
        mid := (low + high) / 2

        if arr[mid] == target {
            result = mid     // 记录当前找到的索引
            high = mid - 1   // 继续在左半部分查找
        } else if arr[mid] < target {
            low = mid + 1    // 目标值在右半部分,缩小搜索范围
        } else {
            high = mid - 1   // 目标值在左半部分,缩小搜索范围
        }
    }

    return result
}

2. 查找第一个大于或等于目标值的元素:

如果需要找到数组中第一个大于或等于目标值的元素,可以进行相应的调整:

func firstGreaterOrEqual(arr []int, target int) int {
    low, high := 0, len(arr)-1
    result := -1

    for low <= high {
        mid := (low + high) / 2

        if arr[mid] >= target {
            result = mid     // 记录当前找到的索引
            high = mid - 1   // 继续在左半部分查找
        } else {
            low = mid + 1    // 目标值在右半部分,缩小搜索范围
        }
    }

    return result
}

3. 查找最后一个小于或等于目标值的元素:

类似地,如果需要找到数组中最后一个小于或等于目标值的元素:

func lastLessOrEqual(arr []int, target int) int {
    low, high := 0, len(arr)-1
    result := -1

    for low <= high {
        mid := (low + high) / 2

        if arr[mid] <= target {
            result = mid     // 记录当前找到的索引
            low = mid + 1    // 继续在右半部分查找
        } else {
            high = mid - 1   // 目标值在左半部分,缩小搜索范围
        }
    }

    return result
}

4. 查找循环有序数组中的元素:

如果数组是循环有序的,可以先找到旋转点,然后分别在两个有序部分中进行二分查找。

这些进阶使用场景展示了如何通过适当的调整,使得二分查找算法适用于更多的情况。在实际应用中,根据具体问题的要求,可以进一步定制二分查找算法的逻辑。文章来源地址https://www.toymoban.com/news/detail-824515.html

到了这里,关于golang二分查找算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二分查找(C语言实现)

    二分查找的前提: 一个整形有序数组中 查找具体某个数 以下以数组元素为偶数个做例   二分查找(折半查找)的思想:对于已按排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐

    2024年02月11日
    浏览(54)
  • 【C语言】二分查找的实现

    前言 在我们日常生活中,经常会遇到查找一样东西的情景,比如在一个班的学生成绩中找到xx分对应的人 我们可以尝试用c语言程序解决这类查找问题 我们可以很容易写出这样的代码 这里数组arr中只有十个元素,那如果有100个,1000个,100000000…000个呢? 考虑最坏的情况,我

    2024年02月07日
    浏览(31)
  • java实现二分查找算法

    递归实现: public static int binarySearchRecursive(int[] arr, int target) {     return binarySearchRecursive(arr, target, 0, arr.length - 1); }   private static int binarySearchRecursive(int[] arr, int target, int low, int high) {     if (low high) {         return -1; // 没有找到目标元素     }          int mid = (low + high) / 2

    2024年04月09日
    浏览(44)
  • 二分查找算法讲解及其C++代码实现

    二分查找算法是一种常用的查找算法,也被称为折半查找。它可以在有序的数组或列表中快速查找需要的元素。 算法描述: 首先确定数组的中间位置mid=(left+right)/2; 然后将要查找的值key与中间位置的值进行比较; 如果key等于中间位置的值,则查找成功,返回mid; 如果key小

    2024年02月01日
    浏览(44)
  • 【数据结构与算法】python实现二分查找

    二分查找 又称折半查找,它是一种效率较高的查找方法 原理:首先,假设表中元素是按升序排列,将表中间位置记录的与查找比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的大于查找,则

    2024年02月05日
    浏览(40)
  • C语言:写一个函数,实现一个整型有序数组的二分查找

    写一个 函数 ,实现一个 整型有序数组 的 二分查找 ,找出 要找的数字 在 数组中对应的下标 。                       =========================================================================                         (一)自定义函数部分:                  (1). 参数: int arr[]

    2024年02月08日
    浏览(49)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(80)
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    在生活中,我们往往会遇到在数组中查找某个确定的元素的时候,通常我们会选择使用暴力解法,这样虽然简单,但是时间复杂度是O(N),时间效率比较低。那么是否有方法可以使得在具有二段性的数组中找某一特定的元素的时间复杂度低于0(N)呢?答案是肯定的,当我们可以

    2024年02月11日
    浏览(52)
  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(84)
  • 【算法系列 | 8】深入解析查找算法之—二分查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一下查找算法的二分查找 查找算法是很常见的一类问题,主

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包