`
yiminghe
  • 浏览: 1460592 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数组极值问题

阅读更多

1。 最坏情况下  3n/2-2  次比较可以得到数组的最大值和最小值


 max[n/2]  min[n/2]

a[1....n]  可以 a[1]  a[2]  比较得到 max[1] min[1] ,


同理 ,可以得到  max[] min[] 的值比较次数 n/2


max[] 中得到最大值 n/2-1

min[] 中得到最小值 n/2-


则总共  n/2+n/2+n/2-1-1 比较次数

 

import javax.swing.JOptionPane;

public class two15{
  public static void main(String args[])
  {
    int a[]=new int[50];//
    int min[]=new int[25];//
    int max[]=new int[25];//
    int n=0,i=0,k=1;
    String num;
    String aa[]=new String[50];
    
    num=JOptionPane.showInputDialog("enter the total num of the array");
    
    n=Integer.parseInt(num);
    
    //单个数不进行比较
    if(n!=1){
    
    for(i=0;i<n;i++)
    {
      aa[i]=JOptionPane.showInputDialog("请输入数组的每个元素");
      
      a[i]=Integer.parseInt(aa[i]);

    }
    
    //用分治法把N个数分成2/N组 每组两个进行比较,把小的放在MIN,大的放在MAX
     //最差情况下比较N/2次
  
    for(i=1;i<(n/2)*2;i=i+2)
    {
      if(a[i-1]<=a[i])
      {
        min[k-1]=a[i-1];max[k-1]=a[i];k++;
      }
      else
      {
        min[k-1]=a[i];max[k-1]=a[i-1];k++;
      }
    }
    
    
    /*在MAX中找出最大的,在MIN中找出最小的
     *最差情况下比较2*(N/2-1)次
     */
    int maxm=max[0],minm=min[0];
    
    for(k=1;k<n/2;k++)
    {
      if(max[k]>maxm) maxm=max[k];
      if(min[k]<minm) minm=min[k];
    }
    
    if(n%2!=0)//N为奇数时,还要和最后一个数比较
    {
      if(a[n-1]>maxm) maxm=a[n-1];
      if(a[n-1]<minm) minm=a[n-1];
    }
    
    JOptionPane.showMessageDialog(null,
    "最大的数是"+maxm+"最小的数是"+minm,
    "result",JOptionPane.INFORMATION_MESSAGE);
    
}
  
  else JOptionPane.showMessageDialog(null,
    "一个数无须查找","警告!"
    ,JOptionPane.INFORMATION_MESSAGE);
    
    
  }
}
 

 

2. 得到数组的最大值次大值比较次数最多  n+log(n) -2


假设 a5 最大 ,则得到一个锦标赛树

                     a5

            a1            a5

    a1        a4         a5

a1 a2    a3 a4   a5  a6


做n/2次比较,可以得到n/2个较小的数。重复做一直到只剩下一个数,即最小值。将最小值换成负无穷,沿着最小值的比较路线走上去,可以得到次小值。
循环直到产生最小值的过程会产生一棵树,而且是完全二叉树,每次比较都会产生出一个内部结点,因此总的比较次数就是树中内结点的个数。完全二叉树最坏情况下是满二叉树,有n个叶结点,因此高为O(log(n)),
内结点个数是n-1。

等比数列求和:

1+2+4+8...+n = (1-2^(log_2_n+1)) = 2n-1
第二次沿最小数的比较路径走上去,所做的比较次数就是这棵树的高度。



一共 logn 层

则要得到 次大值  , 从最底层 ,a5 = 负无穷  ,按照原先 a5 上升的路再走一遍 ,每次上升一层,到顶层

即为次最大值

比较  logn -1 次

 

 

 

 

  • 大小: 13.7 KB
  • 大小: 13.5 KB
  • 大小: 15 KB
分享到:
评论

相关推荐

    findpeaks.zip_C++ 数组极值_C++找极值点_findpeaks c_数组极值_极值点

    c++实现获取一维数组极值点。可以通过调整阈值,改变极值点获取值

    c++获取数据极值点

    c++实现获取一维数组极值点。可以通过调整阈值,改变极值点获取值

    findExtrema:快速找到N维数组的所有极值点-matlab开发

    findExtrema.m 旨在从 N 维数组中查找极值点(最小值和最大值)。 这个实现的运行速度比http://www.mathworks.com/matlabcentral/fileexchange/12275-extrema-m-extrema2-m快得多,它使用了 Mathworks 的 Image ...

    等式极值问题maxd

    在IT领域,尤其是在算法与数据结构的学习中,解决等式极值问题是一个常见的挑战,尤其当涉及寻找给定集合中的最大d值时,即在满足条件a + b + c = d的情况下,找到最大的d。这个问题通常出现在编程竞赛、算法设计...

    PHP获取数组最大最小值例子

    总的来说,通过`max()`和`min()`函数,我们可以轻松地在PHP中处理数组的极值问题。这些函数对于数据处理和分析非常实用,尤其在需要快速找出一组数值的最高点和最低点时。了解和熟练掌握这些基本函数是每个PHP开发者...

    遗传算法求多元函数极值Matlab代码

    在极值问题中,适应度函数值越小(对于最小值问题)或越大(对于最大值问题),表示个体越优秀。 3. **选择操作**:依据适应度函数的值,按照一定的概率选择一部分个体进行繁殖,常见的有轮盘赌选择法、比例选择法...

    matlab求取二维数组极大值与极小值

    本程序使用matlab求取二维数组的极大值与极小值

    基于LabVIEW 的极值查找

    1. **随机数数组生成**:使用随机方法生成一个随机数数组,并显示其波形,以便观察极值的分布情况。 2. **极值查找**:根据极大值与极小值的定义,编写程序查找随机数数组中的所有极大值与极小值。 3. **结果显示**...

    求极值_C++_

    由于峰值元素具有局部最大性质,所以我们可以将问题转换为在有序数组中查找局部最大值。但要注意,原数组不一定有序,所以我们需要先对数组进行排序。使用快速排序或归并排序等高效排序算法,时间复杂度可以达到O(N ...

    已排序数组三分搜索法的研究

    - **优化问题:** 当面对连续函数的极值寻找问题时,三分搜索可以用于逼近最优解,特别是在函数形式复杂且不易求导的情形下。 - **计算机科学教育:** 作为经典的搜索算法之一,三分搜索被广泛用于教学,帮助学生...

    python 寻找离散序列极值点的方法

    在Python编程中,寻找离散序列的极值点是一项常见的任务,特别是在数据分析、信号处理以及图像分析等领域。...在某些特定场景下,可能需要结合其他方法,如滑动窗口或自定义算法,以处理更复杂的序列极值检测问题。

    c++获取数据极值点.7z

    在C++编程中,获取一维数组的极值点是一项常见的任务,这通常涉及到寻找数组中的最大值和最小值。这个任务可能应用于各种场景,比如数据分析、图像处理或信号处理等。下面我们将深入探讨如何使用C++来实现这一功能,...

    Chap14 14.2.2n维极值连分式法

    `Matrix.h` 文件可能定义了一个矩阵类,用于存储和操作多维数组,这是在处理n维问题时必不可少的数据结构。矩阵运算,如乘法和求逆,在解决线性和非线性优化问题时非常常见。 `Comm.h` 可能包含了通用的通信函数...

    c语言编程实例,求区间 极值 排序

    在函数优化问题中,通过不断分割区间并选择更可能包含极值的子区间,来逼近函数的最优解。这种方法在某些情况下比简单的线性搜索更有效,因为它倾向于更均衡地探索空间。 **进退求区间+黄金分割求极值点**是结合了...

    Fortran.rar_fortran 矩阵_极值 fortran_矩阵 FORTRAN_矩阵 极值

    5. **极值问题**:在优化问题中,寻找函数的极值(最大值或最小值)是关键。Fortran提供了许多算法来解决这类问题,如梯度下降法、牛顿法、共轭梯度法等。这些算法广泛应用于最优化、控制理论和机器学习等领域。 6....

    求极值_C++_源码.zip

    标题中的“求极值_C++_源码”指的是利用C++编程语言来寻找数学上的极值问题,这通常包括计算函数的最大值和最小值。在计算机科学和算法设计中,求解极值问题是一个重要的应用领域,特别是在优化、数据分析、机器学习...

    极值点搜索

    而`.mat`文件则通常用于存储MATLAB的数据结构,如矩阵或结构数组,它们可能包含了待处理的信号数据或者预处理结果。 在实际应用中,首先,我们需要对原始信号进行预处理,如滤波以去除高频噪声,这可以通过`ma.m`中...

    NOIP基础算法贪心和分治PPT学习教案.pptx

    例如,求一组数中的最大值和最小值,传统的做法是遍历数组,但通过分治法,可以将数组一分为二,分别找出两个子数组的极值,然后再比较这两个子数组的极值,从而找到整个数组的极值,这种方法在大规模数据中能有效...

    一维数组的应用课程设计.pdf

    在本课程设计中,我们将深入探讨一维数组的使用,这是一种在编程中常见的数据结构。一维数组可以被看作是一系列相同...通过这些练习,学生将更好地理解数组在实际问题中的应用,为后续更复杂的编程任务打下坚实基础。

    最大值和最小值:获取极值点的M文件是一组数据-matlab开发

    以下是一个简单的MATLAB脚本示例,用于查找一维数组中的局部极值: ```matlab function [extrema, indices] = findExtrema(x) % 计算一阶差分 dx = diff(x); % 寻找导数改变符号的点,即极值点 signChanges =...

Global site tag (gtag.js) - Google Analytics