在排序数组中查找某个值——要想到二分法

使用二分法查找数组 - C++实现 接下来,我们可将数组的起始位置和结束位置作为参数传递给二分法函数,然后将指定的值与中间值进行比较。如果指定的值等于中间值,则返回中间值的下标;在处理大规模的数据时,我们经常需要对数组进行查找操作。二分法是一种非常高效的查找算法,它可以在已排序的数组中查找一个指定的值。总之,无论是哪种实现方式,二分法查找数组都是一种十分高效的算法,它可以避免我们对整个数组进行线性搜索,从而提高数据处理效率。现在,让我们来看看如何使用C++来实现二分法查找数组。以上代码用的是迭代法实现,还有一种用递归法实现的版本。 阅读详情

排序数组的查找问题首先考虑使用 二分法 解决,其可将遍历法的 线性级别 时间复杂度降低至 对数级别 。

题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 

思路:

!!!排序数组查找问题别一上来就是循环遍历,想想二分法!!!

观察旋转数组可以发现:[3,4,5,1,2]中称[3,4,5]为左排序数组,[1,2]为右排序数组。PS:定义左排序数组小于右排序数组,所以最小元素是右排序数组。

突破点:最小元素(称为旋转点)就在左右排序数组之间!

算法流程:

  • 循环二分: 设置 i, j 指针分别指向 numbers 数组左右两端,m=(i+j)/2 为每次二分的中点,可分为以下三种情况:
  1. 当 numbers[m] > numbers[j]时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m+1,j] 闭区间内,因此执行 i = m + 1【记住我们目的是缩小范围后的的数组都是在左右排序数组之间】;
  2. 当 numbers[m] < numbers[j] 时: m 一定在 右排序数组 中,即旋转点 x一定在[i, m] 闭区间内,因此执行 j = m【记住是m,不是m-1,因为很有可能下标m对应的值就是X】;
  3. 当 numbers[m] == numbers[j] 时: 无法判断 m 在哪个排序数组中,即无法判断旋转点 x 在 [i, m]还是 [m + 1, j] 区间中。解决方案: 执行 j = j - 1缩小判断范围 。【不能通过i=i+1来缩小判断范围,因为只能通过比较numbers[j]而不是numbers[i],本质是因为 j初始值肯定在右排序数组中; i初始值无法确定在哪个排序数组中。想想数组[1,2,3]】
  • 返回值: 当 i = j 时跳出二分循环,并返回 numbers[i] 即可。

 代码:

 if (numbers.size() == 0)
	{
		return -1;
	}

	int i = 0, j = numbers.size() - 1, m;
	while(i != j)
	{
		// 计算中间的下标
		m = ( i + j ) / 2;
		if (numbers[m] < numbers[j])
		{
			j = m;
		}
		else if (numbers[m] > numbers[j])
		{
			i = m + 1;
		}
		else
		{
			j--;
		}

	}

	return numbers[i];

 

 

1、Ka频段双极化低剖面卫通相控阵天线 设计了双馈口叠层十字缝隙耦合天线,采用“双线极化天线 +旋转馈电 + 移相控制”架构,采用双馈口的叠层十字缝隙耦合天线,并以 2 x2 阵列为主体,旋转排布实现二次圆极化,同时极化可切换,通过多层 PCB 工艺实现天线层、控制/电源层功分网终层、芯片层一体化集成,研制出 64 阵元的圆极化可切换发射天线,测试结果表明:天线工作 频段为 27.5 ~31 GHz,可实现60°扫描,法向轴比 阅读详情

相关推荐

基于单片机直流电机调速控制系统设计

*单片机设计介绍,基于单片机直流电机调速控制系统设计。

2201_75940997的博客 2781

二分法在有序数组中查找一个数

算法思想: 首先条件为有序数组,先查找中间下标的元素: (1)如果该元素等于7,则返回中间下标,查找结束; (2)如果该元素大于7,则7必然在中间元素的右边部分,则缩小范围,在右半部分查找7,再计算右半部分的中间下标,转到(1) (3)如果该元素下于7,则7必然在中间元素的左半部分,则缩小范围,在左半部分查找7,再计算左半部分的中间下标,转到(1) 优点: 对于已排好序的大数组起到效率很高地查询作...

qq_40443457的博客 3529

Ubuntu20.04复现instant-ngp,自建数据集,导出mesh

本次仅仅记录一下自己复现instant-ngp的过程,如果里面的参考有冒犯到原博主请联系我删除,本人也是nerf的小白一枚,可以一起交流学习神经辐射场,希望大家在复现instant-ngp的时候少走一些坑,情况允许下可以去复现一下npg-pl和nerfStudio,最后希望大家一起进步。看到一些博主说葵司的npg_pl也不错,而且葵司是台湾人,在youtube上也有讲解的视频。渲染的效果还是可以的,相对于源码来说还是有点模糊,我一些参数也没有设置,直接就拉进来进行渲染,速度是非常快的。

weixin_59961223的博客 9452

知识点-二分查找

什么式二分查找? 我们知道在数组中查找一个数的方式式一个一个元素进行遍历,和需要查找的值进行对比,当数组中的元素过多的时候这种挨个查找的方式效率就变得很慢。 二分查找就是在一个从小到大排序的数组中,计算出中间的数的大小,判断要找的数时在左边还是右边。这样一次可以缩小一半的查找范围,从而提高了查找效率。在下面我就用一个java小案例来实现一下二分查找。 二分查找需求 在数组array={2,1,4,3,6,5,8,7,10,9}中找到4这个数值,用二分查找法来实现。 二分查找法的实现步骤 1、定义

qq_42344213的博客 681

kali虚拟机-----破解wifi密码(WiFi渗透)

文章目录一、将无线网卡挂载到 虚拟机上二、查看是否挂载成功三、查看网卡是否支持监听模式四、检查文件监听影响并杀死影响五、开启无线监听模式六、开始监听七、开始抓包(新建一个命令窗口)八、对已连接的终端进行攻击,使它掉线重连,以此来获取数据包。(新建一个命令窗口)九、开始解密 一、将无线网卡挂载到 虚拟机上 可能出现的问题:在可移动设备处无法连接无线网卡; 解决:在虚拟机设置中将usb控制器设置成如图所示。 注意要先关闭虚拟机在设置。 二、查看是否挂载成功 使用ifconfig命令查看 三、查看网卡是

weixin_46471800的博客 1万+

Aspen Plus下载教程Aspen Plus V14 保姆级安装步骤(附安装包)

26、在WlmAdmin界面中,依次点击【Subnet Servers】、【admin】、【Add Feature】、【From a File】、【To Server and its File】。35、在产品选择页面,勾选需要安装的所有产品(重要:不要勾选【Aspen Online(Plant Data)】),然后点击【File Location】。回到桌面,点击任务栏的【开始菜单】,在【所有应用】中找到【Aspen Plus V14】软件图标,将其拖到桌面上创建快捷方式。9、这里可以更改软件的安装位置。

ps_xiaowang的博客 1万+

【刷题笔记】之二分查找(搜索插入位置。在排序数组中查找元素的第一个和最后一个位置、x的平方根、有效的完全平方数)

进行二分查找的前置条件:数组有序并且数组中无重复元素 写二分查找题的代码,需要考虑清楚边界条件,比如应该是 while(left < right) 还是 where(left

m0_58761900的博客 1511

步进电机梯形加减速算法的实现

步进电机梯形加减速算法的实现

m0_69251699的博客 1318

【C语言】带你玩转经典算法用二分法在一个有序数组中查找某个数

详细且通俗的解释了二分法即其优缺点,并通过画图的方式解释了二分法的运行过程,保证你看完一定有所收获!!!

君兮_的博客 2103

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

2301_77123899的博客 1万+

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码

加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。

三维点云技术探索 1916

Java中数组二分法查找

算法:当数组的数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序、冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止,但是如...

南 墙 1万+

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5588

java算法-二分法查找实现

java算法-二分法查找实现 什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2. 1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。...

qq_39827033的博客 5625

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js冒泡排序及二分法查找

JavaScript冒泡排序: var arr = [5,0,-56,90,12]; var flag = false;//标志位进行优化,数组本来就是有序序列的话,无需再排序 //先进行大的排序 for(var i=0;i<arr.length-1;i++){ //小的排序 for(var j=0;j<arr.

Curtain的博客 7465

深度学习工具包 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")

使用选择排序和二分法对传入的数组进行排序和查找

选择排序和二分法 使用二分法查找数组中某个值得位置是要在数组提前排好序的前提下才能使用,所以要将数组进行排序。 数组排序有冒泡排序,选择排序,插入排序等,今天我们使用选择排序对数组进行排序。 测试类代码如下图 运行结果如下图 (位置为i+1)所以位置是从1开始 选择排序代码 public class Sort13 { public void selectionSort(int[] list) ...

weixin_44822511的博客 694

二分法查找法查找key值

【问题描述】 编写程序,建立一个静态的整型一维数组a,它共有九个元素,依次是1、12、23、34、45、56、67、68、89,在该数组元素中采用二分法查找法查找key值。若找到key,则打印对应的下标,否则打印-1。 【输入形式】一个整数n,0<n<100 【输出形式】下表x或者-1 【样例输入】1 【样例输出】0 二分法: 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较, 如果当前位置arr[k]值等于key,则查找成功; 若key小于当前位置值arr[k],

Leuchten的博客 4769

二分法简单排序和查找

二分法排序算法思想简单描述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,如果小,则对前半再进行折半,否则对后半 进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上。 直接看代码。 public static void DichotomySort(int[] array)

杨友山 1万+

Java二分法在已排序数组中查找指定数

public static int binarySearch(int[] sortedArr , int target){ int start = 0; int end = sortedArr.length - 1; do{ int mid = (start + end)/2; if(target > sortedArr[mid]){ st

敏于行 3910

Java二分法查找

Java二分法查找 二分法查找(又称为折半法) 二分法基本思想是设数组中的元素从小到大有序的存放在数组中,首先将给定值key与数组中间位置上 元素的关键码(key)比较,如果相等,则检索成功。 否则,若key小,则在数组前半部分中继续进行二分法检索; 若key大,则在数组后半部分中继续进行二分法检索; 这样经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。 有二种方法可以写二...

qq_41991743的博客 2217

Java之数组排序及二分法查找

首先先介绍两种最基本的数组排序方法:冒泡法和选择法。 冒泡法排序:依次比较相邻的两个元素,如果第一个比第二个大,则交换他们两个,如此一轮比较下来会产生一个最大的数位于数组末尾,第二次比较则进行到数组长度-1个元素,以此类推。 /** * 冒泡法排序(从小到大) * @param a 需要排序的数组 * @return 排序完成后的数组 */ ...

li1376417539的博客 2497

Java 二分法查找数组元素

Java 二分法查找数组元素

weixin_49767663的博客 749

在排序数组中查找数字---二分法

面试题53:统计一个数字在排序数组中出现的次数。 解法一:二分法的变形 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if(data.empty()) return 0; int low = 0, high = data.size(...

weixin_43892514的博客 630

Leetcode题解——二分法查找排序数组中搜索数字

33. 搜索旋转排序数组 此题和剑指offer第6题本质上是一样的。 我的第一思路其实是: class Solution: def search(self, nums: List[int], target: int) -> int: for k,v in enumerate(nums): if v == target: return k return -1 但是这个题好像想考的是二分法,于.

hitzijiyingcai的博客 378

java数组之线性查找、二分法查找

介绍线性查找和二分法查找的算法逻辑并代码实现

weixin_44554794的博客 1432
上一篇: 青蛙跳台阶问题解决思路
下一篇: 设计模式概要
Quellaaa
博客等级 码龄9年 24粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值