选第二大元素python(分治)
给定n个元素,找出元素中的第二大元素。该问题如果用线性扫描的方法的话,
首先找出最大值,比较n-1次
然后从n-1个元素中找出最大值,比较n-2次
下面考虑设计一个选第二大元素的分治算法
1.将n个元素从中间一分为二
2.递归两个子问题,分别求出两个子问题的最大值,同时将被淘汰的较小元素记录在较大元素的列表中。在最大值的淘汰元素列表中找第二大元素。
实现
用字典存储被较大元素淘汰的元素,每个元素的key是给定的n个元素,value是一个列表,包括所有被该元素淘汰的元素
1.首先定义一个find_max()函数,实现第一阶段的操作:接收n个元素的列表a_list,要查找的问题的边界left和right。输出n个元素的最大值,同时将被淘汰的元素插入到字典相应key的value中
def find_max(arr,left,right):global dicif left>=right:return arr[left]mid=(left+right)//2left_max=find_max(arr,left,mid)right_max=find_max(arr,mid+1,right)if left_max>right_max:dic[left_max].append(right_max)return left_maxelse:dic[right_max].append(left_max)return right_max
2.定义find_max函数:接收最大值淘汰的元素列表,顺序查找列表中的最大值,即为n个元素的第二大元素
def find_second(n_max):n=len(n_max)second_max=n_max[0]for i in range(1,n):if n_max[i]>second_max:second_max=n_max[i]return second_maxarr=[6,12,3,7,2,18,90,87,54,23]
n=len(arr)
dic={}
for i in range(n):dic.update([(a_list[i],[])])#初始化字典列表
first_max=find_max(a_list,0,n-1)
second_max=find_second(dic[first_max])
print(dic[first_max])
print(second_max)
选第二大元素python(分治)相关推荐
- 选第二大算法(锦标赛算法)
算法描述 算法:FINDSECOND 输入:n个数的数组a[0...n-1] 输出:数组中的第二大的数second 算法思路 在选最大选最小算法中,我们将数组中的数两两分组进行比较,然后在较大的一组中 ...
- 求解第二大元素——锦标赛算法(Tournament Algorithm)
问题 给定一个长度为的数组,请用比较次数小于的算法求出数组中的第二大元素. 求解 看到题目中的比较次数小于就知道不能先用一次循环找出最大元素,接着利用最大元素再一次循环找到第二大元素. 那么,应该怎么 ...
- 【锦标赛算法】找第二大元素FindSecond()
考虑找第二大元素,会想到调用两次Findmax()算法函数(推导可以参考上篇文章).先用Findmax()算法找出最大值,然后从L中删除max,再调用Findmax()找出剩下元素中的最大元素,就是输 ...
- 求数组第二大元素 和 字符串拷贝的实现
int main() {int a[] = {5,100,32,45,21,67,32,68,41,99,13,71};//首先默认第一个成员和第二个成员就是最大和第二大int max = 0; // ...
- 取出数组第一大和第二大元素
[php] view plaincopy # 取出数组最大的元素 function getMax( $arr ){ if( !is_array($arr) ){ exit('参数必须是数组'); } ...
- Python 面试题:输入一个数组,输出该数组的第二大的数字
问题: 输入一个数组,输出该数组的第二大的数字,并且编写相关的测试用例 注意: 1.如果list含有非int, float元素需要remove 2.如果list有重复的最大元素,需要自己处理,内置的l ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
- python返回列表中最大和第二大的元素
设计一个函数返回传入的列表中最大和第二大的元素的值. 测试输入:[1,2,3,4,5,6] 预期输出:(5,6) 测试输入:[11,2,30,4,55,6] 预期输出:(30,55) 要求不破坏原来的 ...
- python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...
本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...
最新文章
- EXTJS实现的WEBQQ可以传文件了哈
- 线程池中keepAliveTime的理解
- ubuntu下安装zabbix
- java线程之线程通信控制
- matlab计算系统过渡过程时间,MATLAB在电机拖动拖动系统过渡过程分析中的应用
- java class教程_深入理解Java Class文件格式(七)
- [转载] 七龙珠第一部——第029话 冒险再度开始
- Go Revel - Filters(过滤器链)
- Contest 7.21(贪心专练)
- 图书管理系统sql语句
- 手把手教你学51单片机
- 高数 | 常用求极限方法总结
- 电脑怎么设置扬声器播放麦克风的声音
- java 中文分词转拼音_如何实现拼音与汉字的互相转换
- VM虚拟机安装及使用
- APPInventor网络数据库浏览器(TinyWebDB查询API)
- L1正则项-稀疏性-特征选择
- 如何实现 JS 运行时的 Inspector 能力
- 从全球最大同性交友网站抄了一份不一样的2048小游戏
- 正则表达式-包含数字和字母的组合
热门文章
- 讨教大学|聊聊可靠性工程师的就业前景怎么样?
- 商城模板网站html5手机端_玩转手机网站建设,选择模板还是不选择模板呢?
- one body.one heart.一个人,一颗心
- 总结一下sun 公司自己的 JAX-WS WebService 用法
- e1载波的数据速率是_电力公司常用抄表方案 电力载波抄表系统
- VMWare虚拟机桥接模式下设置静态IP实现上网
- Linux Shell脚本 Linux C程序 获取指定的范围内 or 系统可用端口
- 路与远方:从方舟开源,说到中国软件行业的生态未来
- CAD入门基本操作命令
- LVS简介及LVS-NAT负载均衡群集的搭建(要像记得回家的路一样记得理想和远方)