当前位置: 首页 > article >正文

折半查找算法

1.在递增有序的表中,写出折半查找的递归算法。初始调用时,low=1,high=ST.lengh。

思想:先判断是否为表空;然后进行划分左右子表,判断要找的是比中间值大还是小,对应递归左或者右表。

代码:

typedef struct{
	EleType *elem;
	int length
}SSTable; 
int BinSearch(SSTable ST,int key,int low,int high){
	if(low>high) return -1;//表空 
	int mid=(low+high)/2;//取中间位置
	if(key>SSTable.elem[mid]){
		return BinSearch(ST,key,mid+1,high);//比中间位置大,右边 
	} else if (key<SSTable.elem[mid]){
		return BinSearch(ST,key,low,mid-1);//比中间位置小,左边 
	}else{
		return mid;//找到了 
	}
} 

时间复杂度O(logn);空间复杂度O(1) 

2.写一个非递归算法,该算法在按照值严格递增排序的顺序表A[1....n]中采用折半查找不小于item的最小元素。若存在这样的元素,则算法给出该最小元素中的位置,否则给出信息为0。

思想:

表中元素小于2时,结束查找。当前元素大于等于待查找元素时,都去左表找,否则都去右表找。

如果找到了item,则item右侧元素为不小于item的最小元素。否则查找失败

例子:

待查找表:5 10 15 20 25;带差找元素:7。返回high=2,元素为10。

代码:

typedef struct{
	EleType *elem;
	int length
}SSTable; 
int BinSearch(SSTable s,int key){
	int low=0,high=s.length;
	while(high-low>1){
		int mid=(low+high)/2;
		if(s.elem[mid]>=key){
			high=mid;
		}else{
			low=mid;
		}
	}
	return (s.elem[high]>=key)?high:0;
} 

时间复杂度O(logn);空间复杂度O(1) 


http://www.kler.cn/a/353361.html

相关文章:

  • 【大模型】Langchain-Chatchat-v0.3.1 的环境配置
  • 【Ubuntu 24.04】虚拟机常见问题解决
  • 2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉
  • 相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型
  • 【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码
  • SpringBoot高校学科竞赛平台:性能优化与实践
  • es简单实现文章检索功能
  • 使用Docker部署nextjs应用
  • 【JAVA毕业设计】基于Vue和SpringBoot的渔具租赁系统
  • Spring Boot在医疗B2B平台中的病历数据安全
  • 【游戏模组】极品飞车12无间风云冬季mod,冬天版本的无间风云你体验过吗
  • llama大模型中,为什么推理部分使用kv cache,而训练部分不使用kv cache
  • 网络资源模板--Android Studio 实现简易计算器App
  • DS树与二叉树(8)
  • Java语法糖
  • Linux性能调优,还可以从这些方面入手
  • Linux虚拟机安装
  • pytorch与卷积神经网络实战笔记
  • Centos7 搭建单机elasticsearch
  • 【重学 MySQL】六十四、主键约束的使用
  • STM32嵌入式移植GmSSL库
  • 利用Spring Boot构建大创项目资源规划平台
  • 医药追溯码是什么?
  • Java多线程--实现跑马小游戏