go sort.Search()

news2024/11/19 1:34:48

函数

func Search(n int, f func(int) bool) int {}

函数作用

通过二分法查找,找到已经排序好的数组[0,n)中第一个使f为true的索引,如果没有找到返回n

为什么要用二分查找?
因为二分查找相比普通依次遍历而言,速度能有巨幅提升。就好比你查字典的时候,你是会从头往后一页一页的翻,还是会直接翻开中间某页,再翻开中间的中间的某页。二分查找相比于依次遍历查找而言,将时间复杂度从O(n)变为了O(log(n))

在这里插入图片描述

使用示例

下面进行了演示

func main() {
	arr := []int{1, 2, 3, 4, 5, 6, 7}
	i := sort.Search(len(arr), func(i int) bool {	// 返回 arr[0,7)中第一个满足arr[i]>5 的索引
		return arr[i] > 5
	})
	fmt.Println(i)	//i:5
}

源码分析

源码位于sort包下

func Search(n int, f func(int) bool) int {
	// Define f(-1) == false and f(n) == true.
	// Invariant: f(i-1) == false, f(j) == true.
	i, j := 0, n
	for i < j {
		h := int(uint(i+j) >> 1) // avoid overflow when computing h
		// i ≤ h < j
		if !f(h) {
			i = h + 1 // preserves f(i-1) == false
		} else {
			j = h // preserves f(j) == true
		}
	}
	// i == j, f(i-1) == false, and f(j) (= f(i)) == true  =>  answer is i.
	return i
}
for i < j {
	...
}
return i

有效索引范围为[0,n),当 i >= j 时结束

h := int(uint(i+j) >> 1)

位运算,将i、j的和转化为二进制右移(删除)一位,等价于(i+j)/ 2。h表示中间索引 i ≤ h < j
比如十进制5经过 >> 1 结果为 2。
在这里插入图片描述

if !f(h) {
		i = h + 1 // preserves f(i-1) == false
} else {
		j = h // preserves f(j) == true
}

以上面的示例为例

i = 0 ,j = 7 , h = 3

f(3) =  arr[3] > 5 = false

i = 4 

h = (i+j) / 2 = 5

f(5) = arr[5] > 5 = true

j = 5

h = 4

f(4) = arr[4] > 5 = false

i = 5,i == j return

最后返回 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1298445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

延时消息+递归导致重复消费爆炸问题

背景 公司所用消息队列为RoucketMQ&#xff0c;版本为4.x。最近公司有业务需要&#xff0c;将某个处理延迟到第二天的白天再进行。由于4.x版本队列&#xff0c;默认延时时间是按等级来延时的&#xff0c;默认有18个等级&#xff0c;如下图&#xff1a; 默认的延时等级&#xff…

我对迁移学习的一点理解(系列2)

文章目录 我对迁移学习的一点理解 我对迁移学习的一点理解 源域和目标域是相对的概念&#xff0c;指的是在迁移学习任务中涉及到的两个不同的数据集或领域。 源域&#xff08;Source Domain&#xff09;通常指的是已经进行过训练和学习的数据集&#xff0c;它被用来提取特征、…

盒马补贴量价-2021KDD

概述&#xff1a; 电商商品定价三个关键问题&#xff1a; 在只有观测数据的时候&#xff0c;怎么构建价格弹性&#xff0c;现在来看这就是一个反事实推断的问题&#xff0c;不仅是如何做的问题&#xff0c;还有如何评估的问题。长周期的规划决策问题怎么建模 & 求解&#…

基于状态机的单片机编程

前言 在设计锂离子电池充电器时&#xff0c;对于以前的根据系统状态进行判断&#xff0c;置标志位的方法&#xff0c;会显得程序臃肿&#xff0c;且架构混乱&#xff0c;变量交错复杂&#xff0c;移植困难。 所以结合实际项目&#xff0c;给出了一种基于状态机的编程方法。 …

线程上下文切换

线程上下文切换 巧妙地利用了时间片轮转的方式, CPU 给每个任务都服务一定的时间&#xff0c;然后把当前任务的状态保存下来&#xff0c;在加载下一任务的状态后&#xff0c;继续服务下一任务&#xff0c;任务的状态保存及再加载, 这段过程就叫做上下文切换。时间片轮转的方式…

对String类的操作 (超细节+演示)

[本节目标] 1.认识String类 2.了解String类的基本用法 3.熟练掌握String类的常见操作 4.认识字符串常量池 5.认识StringBuffer和StringBuilder 1.String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&…

差异计算基础知识 - 了解期末业务操作、WIP 和差异

原文地址&#xff1a;Basics of variance calculation-Understanding Period End activities, WIP and Variances | SAP Blogs 大家好&#xff0c; 这是我在成本核算方面的第六份文件&#xff0c;旨在解释期末的差异计算和相关活动。 我将引导您完成期末活动和差异计算。在本文…

Spring Cloud Gateway 网关的基础使用

1. 什么是网关&#xff1f;网关有什么用&#xff1f; 在微服务架构中&#xff0c;网关就是一个提供统一访问地址的组件&#xff0c;它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发&#xff0c;将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…

前后端数据传输格式(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上篇主要复习了HTTP以及…

解释AI决策,这10个强大的 Python 库记得收藏!

本文整理了10个常用于可解释AI的Python库&#xff0c;方便我们更好的理解AI模型的决策。 什么是XAI&#xff1f; XAI&#xff08;Explainable AI&#xff09;的目标是为模型的行为和决策提供合理的解释&#xff0c;这有助于增加信任、提供问责制和模型决策的透明度。XAI 不仅…

鸿蒙生态开发就业前景到底好不好

鸿蒙生态开发是指基于华为自主研发的操作系统鸿蒙&#xff08;HarmonyOS&#xff09;进行应用程序开发和生态建设。目前&#xff0c;鸿蒙生态开发的前景非常好&#xff0c;原因如下&#xff1a;做鸿蒙应用开发到底学习些啥&#xff1f; (qq.com) 1&#xff1a;政府支持&#x…

高德地图vue实现自定义标点热力图效果(缩放时展示不同数据)

高德地图插件引入省略。。。样式和vue基础组件省略。。。 如果每个标点没有数值&#xff0c;则可以用点聚合来实现功能下面例子&#xff0c;每个标点会有按市统计的数值&#xff0c;而且缩放一定程度时&#xff0c;需要展示按省统计的标点&#xff0c;因此需要自定义标点样式和…

Ubuntu中编译出Windows的可执行程序(.exe)

1、前言 在嵌入式开发中&#xff0c;交叉编译是很常见的情况&#xff0c;如果你把Windows电脑也看做一块高性能的开发板&#xff0c;那在Ubuntu中编译出Windows上运行的可执行程序也是很好理解的行为。 2、安装mingw64环境 sudo apt-get install mingw-w64 3、测试编译链是否安…

特权FPGA 学习笔记

存储器可用于异步时钟域的信号处理&#xff0c;双口RAM多用于交互式数据&#xff0c;FIFO多用于单向数据传输&#xff1b;以task的方式封装testbench子程序&#xff0c;以提高复用程度&#xff1b;模板中&#xff0c;vho是vhdl模板&#xff0c;veo是verilog模板&#xff1b;run…

第七届中老越三国丢包狂欢节暨2023年中老越三国(普洱)边境商品交易会新闻发布会在昆明召开

12月8日&#xff0c;第七届中老越三国丢包狂欢节暨2023年中老越三国&#xff08;普洱&#xff09;边境商品交易会新闻发布会在昆明召开。据悉&#xff0c;本届丢包节暨边交会将于2023年12月22日至26日在普洱市江城哈尼族彝族自治县举办。 发布会现场 中老越三国丢包狂欢节自200…

解决 php 连接mysql数据库时报错:Fatal error: Class ‘mysqli’ not found in问题

在使用php对mysql进行连接的过程中&#xff0c;出现了Fatal error: Uncaught Error: Class "mysqli" not found in的问题 解决方案 这个错误通常表示您的PHP代码中缺少MySQL扩展或者没有启用MySQL扩展。 我们首先确认一下PHP环境中已经安装了MySQL扩展。检查一下自己…

v4l2接收流程

内核media驱动目录结构 目录media/driver,子目录说明如下&#xff0c;主要列举本文中使用到的目录 目录功能I2C摄像头&#xff0c;解串器&#xff08;max9296/9295等&#xff09;platform控制器的驱动&#xff0c;例如mipi控制等v4l2_coreioctl 入口等media\common\videobuf2…

哈希表的几种实现方式与比较

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 哈希表概述 哈希表&#xff08;Hash Table&#xff09;是一种常用的数据结构&#xff0c;用于实现键值对的映射关系。它通过哈希函数将键映射到一个特定的索引位置&#xf…

Spring Boot 3 整合 Mybatis-Plus 实现动态数据源切换实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

银河麒麟本地软件源配置方法

软件源介绍 软件源可以理解为软件仓库&#xff0c;当需要安装软件时则会根据源配置去相应的软件源下载软件包&#xff0c;此方法的优点是可以自动解决软件包的依赖关系。常见的软件源有光盘源、硬盘源、FTP源、HTTP源&#xff0c;本文档主要介绍本地软件源的配置方法&#xff…