zoukankan      html  css  js  c++  java
  • Algs4-2.4.30动态中位数查找

    2.4.30动态中位数查找。设计一个数据类型,支持在对数时间内插入元素,常数时间内找到中位数并在对数时间内删除中位数。提示:用一个面向最大元素的堆再用一个面向最小元素的堆。
     
    解:设初始有2N或2N+1个元素,设有一个大堆和一个小堆,
        大堆堆顶元素为max,小堆堆顶元素为min,中位数元素mid指向null,待插入堆的元素为new。
     
    1)初始化:
      先将前N个元素插入到大堆。
     
     将第N+1个元素到第2N个元素对每个元素new插入到大堆,插入时进行如下操作:
    a)IF max<=new THEN
        new插入到小堆。
      ELSEIF max>new THEN
        max插入到小堆,
        大堆中删除堆顶元素max,
        new插入到大堆。
      END IF
     
       
      如果有第2N+1个元素,那么
    b)IF max<=new<=min THEN
          mid=new
      ELSEIF max<=new>=min THEN
          mid=min
          小堆中删除min
          new插入到小堆
      ELSEIF max>=new (AND max<=min 堆已满足这个条件) THEN
          mid=max
          大堆中删除max
          new插入到大堆
      END IF
     
    2)返回中位数
      如果mid=null,返回(max+min)/2
      否则返回mid
     
    3)插入新元素new 
       插入新元素new后,要保持两个堆的元素个数相同。
       在插入新素前,两个堆的元素个数是相同的,因为初始化、插入、删除中位数 时就是保证了这一点。
       当 mid=null时,插入新元素使用(b)步的方法。
       当 mid<>null时,将mid插入到大堆,mid置为null,然后插入新元素按(a)步的方法。
     
    4)删除元素mid时
      删除元素mid后,要保持两个堆的元素个数相同。
      在删除前,两个堆的元素个数是相同的,因为初如化、插入、删除中位数 时就保证了这一点。
      当mid<>null时,将mid直为null。
      当mid=null时,mid=(max+min)/2
     
    5)附加:本文中位数定义为:当有2N个数时,排序后,中位数=(第N个数+第(N+1)个数)/2;当有2N+1个数时,排序后,中位数=第N+1个数
     
    若中位数定义:当有2N个数时,排序后,中位数=第N个 或 第N+1个数时,上述算法描述需作调整。
     
     
  • 相关阅读:
    第三章:Hadoop简介及配置Hadoop-1.2.1,hbase-0.94.13集群
    maven环境的搭建,lemon-OA办公系统的搭建
    如何打开mo文件并修改 PoEdit
    安装Elastix-2.4版本
    RabbitMQ安装
    Yum编译安装Error Downloading Packages报错
    linux:ping不通www.baidu.com
    tar命令解压缩出错
    PV、UV
    使用存储过程创建数据
  • 原文地址:https://www.cnblogs.com/longjin2018/p/11825743.html
Copyright © 2011-2022 走看看