最大值与最小值问题
2016-07-01 12:07
363 查看
问题描述:寻找数组中的最大值与最小值。
分析:这个问题实际中用的非常多,需要我们好好研究下。我在之前的博客中曾提到过一个线性时间选择算法用来求解TopK问题,同样的这个也可以使用那个算法,实际就是TOP1和TopN,但是由于问题的特殊性,但由于那个算法编程比较复杂,
我们可以采用更加简单的方法。这里我提供几种解法供大家参考。
解法一:线性扫描法。设置两个变量max和min用来保存最大值和最小值,开始时将第一个元素赋值給max和min,然后依次和后面的进行比较即可。这应该是最简单的方法了,大家应该都用的这种方法最多,但是这种方法,当数组很大的时候比较次数过多,
需要比较2n次。好处是查询后原数组位置不变。
解法二:分组法。我们可以将这个数组每两个分为一组,为了方便起见,把相邻的两个分为一组,然后针对每组进行比较,大数放在偶数下标处,小数放在奇数下标处,这需要比较n/2次,然后再设两个标志量max和min,对于每组在进行比较,这样需要比较
2*(n/2)次,所以该方法一共需要比较1.5n次。尤其在数据量很大的时候,该方法减少的比较次数越多。但是该方法破坏了原来数据的顺序。
解法三:在解法二的基础上进行改进,设置两个标志量max和min,针对每一组比较完后,直接把对应的数放到min和max中,这样就不需要交换次序了。整个的比较次数也为1.5n次。
总结:具体使用哪种方法,应该根据具体的环境去选择,各有利弊。
分析:这个问题实际中用的非常多,需要我们好好研究下。我在之前的博客中曾提到过一个线性时间选择算法用来求解TopK问题,同样的这个也可以使用那个算法,实际就是TOP1和TopN,但是由于问题的特殊性,但由于那个算法编程比较复杂,
我们可以采用更加简单的方法。这里我提供几种解法供大家参考。
解法一:线性扫描法。设置两个变量max和min用来保存最大值和最小值,开始时将第一个元素赋值給max和min,然后依次和后面的进行比较即可。这应该是最简单的方法了,大家应该都用的这种方法最多,但是这种方法,当数组很大的时候比较次数过多,
需要比较2n次。好处是查询后原数组位置不变。
解法二:分组法。我们可以将这个数组每两个分为一组,为了方便起见,把相邻的两个分为一组,然后针对每组进行比较,大数放在偶数下标处,小数放在奇数下标处,这需要比较n/2次,然后再设两个标志量max和min,对于每组在进行比较,这样需要比较
2*(n/2)次,所以该方法一共需要比较1.5n次。尤其在数据量很大的时候,该方法减少的比较次数越多。但是该方法破坏了原来数据的顺序。
解法三:在解法二的基础上进行改进,设置两个标志量max和min,针对每一组比较完后,直接把对应的数放到min和max中,这样就不需要交换次序了。整个的比较次数也为1.5n次。
总结:具体使用哪种方法,应该根据具体的环境去选择,各有利弊。
相关文章推荐
- Erlang中遍历取出某个位置的最大值代码
- Javascript获取数组中的最大值和最小值的方法汇总
- JavaScript如何获取数组最大值和最小值
- C#求n个数中最大值和最小值的方法
- Js获取数组最大和最小值示例代码
- java求三个数的最大值的示例分享
- C#获取数组中最大最小值的方法
- c#求两个数中最大值的方法
- python使用分治法实现求解最大值的方法
- javascript获取xml节点的最大值(实现代码)
- JavaScript学习笔记之取数组中最大值和最小值
- JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
- javascript实现查找数组中最大值方法汇总
- JS中取二维数组中最大值的方法汇总
- java算法-最大值最小值
- Python列表之元组
- java算法-最大值、最小值
- js求最小值和最大值
- 设计模式C++实现(14)——职责链模式
- OJ解题报告 2990:符号三角形