找出第二小元素(算法导论第三版9.1-1题)

找出第二小元素(算法导论第三版9.1-1题)

时间复杂度Θ(n)
比较次数n+⌈lgn⌉−2次

思路:将元素每次分成2部分,第一部分和第二部分元素成对比较。最终获得最小的元素,记录那些和最小元素比较后的失败的元素,第二小元素就在其中。
原理:第二小元素只有和最小元素比才会失败,其他元素和其比都它都能胜出。所以,第二小元素一定在那些和最小元素比较后失败的元素中。第二小元素一定能和最小元素比较,因为除了和最小元素比以外它都能胜出。

int find_second_smallest_element(int *array,int length){vector<int> new_win;vector<int> old_win;for (int i = 0; i < length; ++i) {old_win.push_back(i);}vector<vector<int>> loss(length);int current_length = length;int remainder ;int win_index,loss_index;while (current_length>1){remainder = current_length % 2;if(remainder!=0){new_win.push_back(old_win[current_length / 2]);}for (int i = 0; i < current_length/2; ++i){if(array[old_win[i]]<=array[old_win[current_length-i-1]]){win_index = old_win[i];loss_index = old_win[current_length-i-1];}else{win_index = old_win[current_length-i-1];loss_index = old_win[i];}new_win.push_back(win_index);loss[win_index].push_back(loss_index);}current_length = new_win.size();old_win.clear();for (int i = 0; i < new_win.size(); ++i) {old_win.push_back(new_win[i]);}new_win.clear();}int second_smallest = loss[win_index][0];for (int i = 1; i < loss[win_index].size(); ++i) {if(array[loss[win_index][i]] < array[second_smallest]){second_smallest =  loss[win_index][i];}}return array[second_smallest];
}

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

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

相关文章

Kubernetes:通过自动化节省IT预算的4种方法

导语大多数CIO和IT领导者都熟悉反复执行的任务“事半功倍”。在许多组织中&#xff0c;这都是现实&#xff0c;在各种其他因素&#xff08;例如宏观经济状况&#xff09;的影响下&#xff0c;这种趋势往往会起伏不定。正文有时&#xff0c;“用更少的钱做更多的事”可能会更准确…

找出最大值和最小值(算法导论第三版9.1-2)

找出最大值和最小值 &#xff08;算法导论第三版9.1-2) 在最坏的情况下&#xff0c;比较次数下界是⌈3n/2⌉−2 void find_maximum_and_minimum_element(int *array,int length,int &max,int &min){int remainder length % 2;int start_index 0;if(remainder){//奇…

《Unit Testing》1.4. 成功的测试套件拥有哪些属性?

什么造就了成功的测试套件如果测量测试套件的质量&#xff1f;唯一可行的办法就是对测试套件里每一个测试进行单独的评估。你不需要一次性把它们都评估完。你可以逐步的进行评估成功的测试套件拥有以下属性&#xff1a;集成到开发周期中只针对代码库中最重要的部分它以最低的成…

找出数组中第i小元素(时间复杂度Θ(n)--最坏情况为线性的选择算法

找出数组中第i小元素 期望时间复杂度&#xff1a;Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select(int *array,int start,int end,int index){if(start end)return array[start];int middle randomized_partition(array,start,end);int position middle - start…

C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

一&#xff1a;背景1. 讲故事.NET 5 终于在 6月25日 发布了第六个预览版&#xff0c;随之而来的是更多的新特性加入到了 C# 9 Preview 中&#xff0c;这个系列也可以继续往下写了&#xff0c;废话不多说&#xff0c;今天来看一下 Top-level programs 和 Extending Partial Meth…

4位BCD计数器设计

状态转换: 输出函数: 4位BCD计数器设计:

[Mvp.Blazor] 集成Ids4,实现统一授权认证

&#xff08;又一个客户端集成了IdentityServer4&#xff09;还是很开心的&#xff0c;目前已经有六个开源项目都集成到了Ids4认证中心了。1、Blazor系列文章回顾书接上文&#xff0c;关于Blazor学习呢&#xff0c;我也发了几篇文章了&#xff0c;我一般写东西都喜欢偏实战&…

重学ASP.NET Core 中的标记帮助程序

标记帮助程序是什么标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素。 例如&#xff0c;内置的 ImageTagHelper 可以将版本号追加到图片名称。 每当图片发生变化时&#xff0c;服务器都会为图像生成一个新的唯一版本号&#xff0c;因此客户端总能获得…

小型数字系统---运动码表设计

运动码表设计中码表控制器是最难的&#xff0c;所以主要介绍如何设计码表控制器。 我们先给这个时序电路设计状态以及编码 先设计状态转换函数 首先画出状态图: (其中我们让其一到000状态就立马变为001状态&#xff0c;110状态存储完数据立马变成100状态) 根据状态图&#…

用 aforge.net 小试一下验证码识别

今天来小玩一下 aforge.net 套用官方的话就是一个专门为开发者和研究者基于C#框架设计的&#xff0c;这个框架提供了不同的类库和关于类库的资源&#xff0c;还有很多应用程序例子&#xff0c;包括计算机视觉与人工智能&#xff0c;图像处理&#xff0c;神经网络&#xff0c;遗…

国标转区位码电路设计及汉字显示

区位码国际码-2020H&#xff0c;由于采用加法器实现&#xff0c;因此用补码形式进行表示&#xff0c;区位码 国际码FFFF-2020H0001H国际码dfe0。 从网上找下机内码转化的软件&#xff0c;将一段自选文字输入该软件&#xff0c;进行十六进制的机内码转化。由于一个汉字是由四个十…

【WPF】DataGrid多表头的样式设计

需求在使用WPF开发时&#xff0c;使用DataGrid列表显示数据时&#xff0c;有些字段可以进行分组显示&#xff0c;用于更好的表达它们之间存在的某种关系&#xff0c;因此就考虑到要对DataGrid的表头进行扩展&#xff0c;可以显示多行表头&#xff0c;让这些有关联的字段内容显示…

异步清零和同步置数/清零的区别

同步&#xff0c;异步是对于时钟而言的。 同步指的是&#xff0c;状态的变化需要等待时钟有效沿来触发&#xff0c;所有动作同时跟随这个时钟变化&#xff0c;而异步时&#xff0c;状态变化不依赖与时钟。 异步清零说的是&#xff0c;你需要对一个计数器在满足某种条件时想要…

如何使用ABP进行软件开发之基础概览

ABP框架简述1&#xff09;简介在.NET众多的技术框架中&#xff0c;ABP框架&#xff08;本系列中指aspnetboilerplate项目&#xff09;以其独特的魅力吸引了一群优秀开发者广泛的使用。在该框架的赋能之下&#xff0c;开发者可根据需求通过官方网站【https://aspnetboilerplate.…

模2加法,模2减法,模2除法

十进制的除法&#xff0c;大家都会做&#xff1a;列个竖式&#xff0c;商&#xff0c;写在上面&#xff0c;上个几&#xff0c;再用被除数减去积&#xff0c;求得余数…。 二进制的除法&#xff0c;和十进制的计算方法相同&#xff0c;也要列出个竖式计算。 二进制的除法&…

《Unit Testing》2.1 伦敦学派如何做隔离

针对单元测试的定义&#xff0c;主要有两种看法&#xff1a;经典学派。经典学派之所以经典&#xff0c;是因为这原本就是人们做单元测试和测试驱动开发的方式伦敦学派。伦敦学派扎根于伦敦的编程社区。单元测试的定义单元测试有很多定义&#xff0c;但是所有的定义都有三个重要…