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个数时,上述算法描述需作调整。
     
     
  • 相关阅读:
    nginx负载均衡代理配置脚本
    想查看下编译安装的nginx默认都带有哪些模块
    docker安装mysql8.0.18
    Reached target Basic System
    layer iframe的一些操作记录:
    微信JSAPI支付
    用go和python实现在图片里藏图片
    go反射优化
    go图片灰度化
    golang 创建发送邮件服务
  • 原文地址:https://www.cnblogs.com/longjin2018/p/11825743.html
Copyright © 2011-2022 走看看