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个数时,上述算法描述需作调整。
     
     
  • 相关阅读:
    有赞移动Crash平台建设
    软件测试创新之路
    手把手教你用Python实现智能推荐算法
    接口测试--参数实现MD5加密签名规则
    重置一发LCT模板
    LOJ #2131. 「NOI2015」寿司晚宴
    LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
    2019牛客暑期多校训练营(第九场)
    20190815模拟赛
    zhengrui集训笔记2
  • 原文地址:https://www.cnblogs.com/longjin2018/p/11825743.html
Copyright © 2011-2022 走看看