查找算法之折半查找

【C语言】二分查找 在有序表中,每次都取中间元素作为比较的对象。 如果给中间值与给定值相等,则查找成功,返回该元素的下标/索引; 如果中间值大于给定值,则在中间值的右半区间继续查找; 如果中间值小于给定值,则在中间值的左半区间继续查找;........................ 阅读详情

查找算法之折半查找

折半查找算法的思路
  1. 首先查找的关键字在有序的查找表内, 这是折半查找的前提.(我们假设查找表内元素升序排列)
  2. 确定查找表中的范围,一般用两个下标来表示范围: left = 0,right = length -1
  3. 利用给定的关键字和查找表中的中间位置(mid = (left+right)/2)的元素比较,若相等,则查找成功,如待查找的元素比中间的元素大,我们让查找的范围变成中间到尾端(mid+1到right),如查找元素小于中间元素,我们就在头端到中间查找(left到mid-1).
  4. 然后一直这样重复的进行,直到找到或者范围缩小为空即查找失败.
分析折半查找的时间复杂度

例子
下面我们来分析一下折半查找的平均查找长度,我们可以把折半查找过程用一棵二叉判定树来表示如下图
在这里插入图片描述
通过这样一棵数,我们可以计算出折半算法成功查找的平均查找长度
ASL = 11/6+22/6+3*3/6 = 7/3
无论查找是否成功,在有序表中查找某个关键字的过程,就是从根节点出发,走到该关键字对应节点的路径,而路径的长度就对应着查找长度.因此,折半查找的时间复杂度为O(log n)

折半查找的C语言实现
#include <stdio.h>

int search(int (*), int, int);

int main() {
int a[5] = {2,4,5,6,7};//初始化一个升序的数组;
printf("%d\n", search(a, 5, 7));//查找一个可以找到的元素;
printf("%d\n", search(a, 5, 8));
}


int search(int *data, int length, int value) {
int left = 0, right = length - 1;
while (left<=right) {
  int mid = (left+right)/2;
  if (data[mid] == value) {
      return mid;//如果找到了.咱就直接返回元素的下标;
  }
  else if (data[mid] > value) {
      right = mid-1;//如何查找元素小于中间值,更新右坐标为mid-1;
  }
  else {
      left = mid+1;
  }
}
return -1;//如果循环结束没找到,我们返回-1;
}

总结 :折半查找的思想就是不断二分,因为查找的序列有序,所以咱就根据元素与中间值的比较进行舍弃,然后更新查找区间,注意这里循环条件是直到找到或者(left>right),所以更新节点是mid+1或mid-1;不然会陷入无限循环;

二分查找法+升降数组 1095. 山脉数组中查找目标值 1095. 山脉数组中查找目标值 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。 如果不存在这样的下标 index,就请返回 -1。 何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件: 首先,A.length >= 3 其次,在 0 < i < A.le... 阅读详情

相关推荐

递归的折半查找算法

问题一:递归的折半查找算法 注意:折半查找有一个条件,数据必须是有顺序性的,不然折半查找毫无意义; 原问题:有一数组A[10],里面存放了十个整数,顺序递增。任意输入一个n(位于数组里外均可),如果n数与数组,则显示n位于数组中的位置,如果n不属于数组,则显示错误;要求用递归的方法实现折半查找; 扩展:适用于输入所有顺序递增数据实现折半查找。 实验代码如下: #include &amp;lt;stdio....

k_ys的博客 6252

【C语言】二分查找(含图解)

注:使用递归查找,值得注意的是,每次递归时,需要缩小查找的范围,也就是每次传入的左右边界发生了改变,因此入参必有。第四轮查找:搜索区域内中间元素的位置是 [(7+7)/2]=7,因此中间元素是 33,此元素就是要找的目标元素。第一轮查找:根据 27

将冲破艾迪i的博客 4万+

算法:顺序查找与折半查找

资料摘自: typedef int DataType; //顺序查找算法 //用顺序查找在n元数组list中查找与key等值的元素,返回该数组元素的下标 //若未找到,则返回-1 int SeqSearch(DataType List[], int n, DataType key) {     for(int i = 0; i     {         if(List[i

afei198409的专栏 8649

C语言:二分法查找

C语言:二分法查找

蔡欣致的个人博客 1万+

【大话数据结构C语言】52 折半查找和插值查找(按比例查找)

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 折半查找(Binary search),又称作二分查找 它的前提是线性表中的记录必须是关键码有序(通常是从小到大有序),线性表必须采用顺序存储 在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。 ...

CodeAllen嵌入式 2706

【查找算法】折半查找法

本篇文章将介绍折半查找算法。 文章目录何为折半查找?算法实现递归实现效率分析 何为折半查找? 上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上继续提高算法的效率呢? 这个时候,折半查找诞生了,它的原理是每次都将待查找的记录所在的区间缩小一半,比如: 若要在该序列中查找元素值4,折半查找是如何做到的呢? 它需要先设置两个游标,一个指向最左边,一...

。。。 3094

实现折半查找的算法

/** *    实验题目: *        实现折半查找的算法 *    实验目的: *        领会折半查找的过程和算法设计 *    实验内容: *        设计程序,输出在顺序表(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)中采用 *    折半查找方法查找关键字9的过程 * */ #include &lt;stdio.h&gt; #define MAX_...

xiezhi123456的博客 6761

《计算机网络》课程大作业- 《小区局域网的设计和规划》

8.1首先,在满足用户需求方面,通过详细的需求分析,充分考虑了居民和物业管理的不同业务需求。对于居民,无论是日常的高清视频播放、在线游戏、远程办公还是智能家居设备的连接,网络都能提供稳定的高速带宽支持。从有线网络的千兆以太网技术保障稳定的有线连接,到无线网络采用 Wi - Fi 6 技术确保无线覆盖区域的高速和低延迟,满足了居民多样化的娱乐和生活需求。对于物业管理,安防监控系统的实时数据传输、物业办公自动化系统的流畅运行以及社区信息的及时发布等业务,都有针对性的网络设计。

lisangsimida的博客 2598

查找算法2——折半查找

从小到大排列的有序序列。折半查找的算法描述如下: 将待查找元素与表中间的元素进行比较,如果两者相等,则说明查找成功;否则利用中间位置将表分成两部分,如果待查找元素小于中间位置的元素值,则继续与前一个子表的中间位置元素记性比较;否则与后一个子表的中间位置元素进行比较。不断重复上述操作,直到找到与待查找元素相等的元素,表明查找成功。如果子表为空表,表明查找失败。 【示例】 一个有序顺序表为7,1...

凌空的桨 9529

用例设计:滴滴打车从轿车到完成支付如何测?

滴滴打车全流程测试用例设计从业务场景覆盖、功能逻辑分解、异常流验证三个维度展开,系统化地构建了测试方案。首先,业务流主干场景被分解为叫车、行程中、支付结算三个阶段,每个阶段都设计了核心测试用例,包括正向和异常用例,如定位准确性、车型选择逻辑、路径偏移监控、费用实时计算、多支付方式兼容等。专项测试补充了状态机验证、资损防控测试和性能测试,确保系统在不同情况下的稳定性和安全性。测试数据策略采用等价类划分设计,实战技巧包括流量回放技术、混沌工程注入和计费沙盒验证,以提高测试的覆盖率和准确性。最终输出交付物包括流程

海姐软件测试的博客 1523

中国传媒大学计算机考研初复试经验贴

中传的计算机专业考研的话主要分为两大学院:计网学院和国重,大部分专业在计网学院。

DoKiDoK的博客 1557

python之折半查找算法

折半查找算法也叫二分查找算法。这里必须基于查找的数据是有序的,然后该算法是没有意义的。我觉得代码比较直观,所以我就直接给出代码了。 折半查找非递归算法 #折半查找非递归算法 #折半查找函数 #参数 数组 起始位置 结束位置 数据 def search(arr,start,end,data): while(start<=end): half=int((star...

Qin1999的博客 5415

数字IC后端实战:如何用ICC搞定复杂模块的floorplan与powerplan(附避坑指南)

本文深入解析数字IC后端设计中复杂模块的floorplan与powerplan实战技巧,重点介绍多边形模块边界处理、MTCMOS电源网络优化及存储器摆放陷阱规避。通过Synopsys ICC工具的具体操作示例和项目实战经验,帮助工程师高效解决设计难题,提升芯片性能与可靠性。

weixin_29213525的博客 349

查找算法:顺序查找,折半查找及递归算法

一、顺序查找 算法思想:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定的值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。 int seqsearch(seqlist r,int n,keytype k)//顺序查找算法 { /* int i; for(i=1;i<=n;i++) if(r[i].key==k) return i; return 0; */ //改进:设置监视哨的顺序查找 int i;

xiaoyeren_ITRoad的博客 2237

TC3xx芯片中断配置避坑指南:从AUTOSAR Davinci配置到SRN地址计算的完整流程

本文详细解析了英飞凌TC3xx芯片的中断配置流程,从AUTOSAR Davinci工具链到硬件调试的全链路指南。重点介绍了中断路由(IR)模块、服务请求节点(SRN)和中断控制单元(ICU)的配置技巧,帮助开发者避开常见陷阱,优化中断性能。

weixin_30628801的博客 409

Android16 RK3576修改亮度调节为线性调节

文章摘要: 本文分析了Android系统中亮度调节的非线性问题,并提供了线性化改造方案。首先通过追踪Settings和SystemUI代码,发现亮度调节使用了BrightnessUtils类中的非线性Gamma空间转换算法。然后重点修改了BrightnessUtils类,将原有的Hybrid Log Gamma(HLG)算法替换为简单的线性映射公式。最后在自定义工具窗口中实现了基于系统标准接口的亮度调节功能,通过SeekBar的0-100%百分比值线性映射到1-255的系统亮度值。改造后的亮度调节更加直观,

tzj1058756809的博客 75

经典算法之折半查找

经典算法之折半查找

weixin_68153081的博客 7367

Android日志实战——Tombstones日志分析(七)

Tombstones 一般是由 Dalvik 错误、状态监视调试器、C 层代码以及 libc 的一些问题导致的。当系统发生 Tombstone 的时候,内核(kernel)首先会上报一个严重的警告信号(signal),上层接收到之后,进程的调试工具会把进程中当时的调用栈现场保存起来,并在系统创建了 data/tombstones 目录后把异常时的进程信息写在此目录里面,开发者需要通过调用栈来分析整个调用流程来找出出问题的点。Tombstone原因分析pid 与 tid 相同,问题出在主线程。

小旭的专栏 2521

【查找算法】折半查找算法

**折半**查找,也称**二分搜索**,是一种在**有序**数组中查找某一特定元素的搜索算法。该方法是查找的范围不断缩小一半,因此查找效率较高。

丶亻氵的博客 3426

C++(Qt)软件调试---内存分析工具Heob(26)

绝对最全面最详细的Heob使用说明。(图文并茂) 绝大部分的文章都说Heob是一个内存泄漏分析工具,其实Heob只是内存泄漏分析功能比较突出,实际上Heob可以分析很多内存问题。 Heob是一个Windows下检测缓冲区溢出(野指针、空指针、内存越界、重复释放、异常捕获等)和内存泄漏的工具,集成到Qt Creator中,功能强大,简单容易上手。

mahuifa的博客 4311

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

<数据结构>折半查找算法实现

文章目录前言一、折半查找算法(采用顺序表存储结构)二、使用步骤1.代码功能实现总结 前言 提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。 提示:以下是本篇文章正文内容,下面案例可供参考 一、折半查找算法(采用顺序表存储结构) 要求:编写函数,建立有序表,采用折半查找实现某一已知的关键字的查找。(采用顺序表存储结构) 折半算法思想:设置两个指针low,high,分为上界和下界,对于初始low=0 high=n-1; 令mid=(low+high)/2

weixin_46364330的博客 8499

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

折半查找算法

//折半查找法/* * 从表列中查一个数最简单的方法是从第1个数开始顺序查找,将要找的数与表列中的   数一一比较,直到找到为止(如果表列中无此数,则应找到最后一个数,然后判定“找不到”)   但这种“顺序查找法”效率较低。如果表列中有1000个数,且要找的数恰恰是第1000个数,   则要进行1000次比较才得到结果。平均比较次数为500次。  折半查找法是效率较高的一种方法,基本思路如下:

8266

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

三种查找算法比较:折半查找(二分查找)、插值查找、斐波那契查找

此文章为介绍基于二分思想的查找算法实现及比较实验。

XIAO_yux的博客 3123
上一篇: 数据结构线性表(一)
下一篇: 数组的定义与传递
OnlyFeiger
博客等级 码龄9年 9粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值