• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qianye0905
博客园    首页    新随笔    联系   管理    订阅  订阅
5亿个数找中位数

找中位数最容易想到的方法就是,先对序列进行排序,取中位数,然而5亿个数要想全部读入内存需要将近2GB空间。

一种想法是采用外部排序的方法,在排序的过程中记录数据个数,找到中位数。首先采用hash() % 100,把数据分到100个文件中,然后对每个文件分别在内存中进行快速排序,再将100个小文件进行合并,并在合并过程中寻找中位数,时间复杂度是O(nlogn)

 

另外一种方法是,将数据按照数据空间分为0-9999999,10000000-999999999, ……大概50个部分,每一部分存入一个小文件,统计每个小文件中的元素个数,由于文件之间相对有序,可以容易得出中位数是位于哪一个文件之中,并可以得出中位数在该小文件中的排序次序,用相同的方法对小文件进行处理,当文件内容比较小的时候可以直接在内存中进行找中位数操作,对于n个随机数找k小元素的时间复杂度是O(n),所以总的时间复杂度为O(n)

 

5亿个数找不存在的元素

想法是:将这5亿个数据按照大小分为50部分,0-9999999, 10000000-99999999…并分别存入文件中,对于每一个文件,只用找出每个文件中不存在元素即可

posted on 2012-11-29 14:12  qianye0905  阅读(961)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3