Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235570
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1182
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-20 23:47
个人简介

如果人生是一条隐含马尔科夫模型,那维特比算法告诉我已经偏离最优路线了,但如果起点是现在呢?

文章分类

全部博文(19)

文章存档

2020年(2)

2014年(3)

2013年(14)

分类: 大数据

2013-04-06 17:00:34

    背景:由于内存限制,长度为一亿的某类型的数组无法全部放入内存进行排序,进而无法取出前100的元素,多见于搜索排名,更恶劣的情况是这一亿条数据还分布在多台机器上

    原理与简化:遍历长度为N的数组的前K个元素构建小顶堆,对于剩余的N-K的元素:小于其根节点的过滤掉,大于根节点则替换之并heapify该小顶堆,时间复杂度近似为N*O(logK),因此只要实现一个定制版的heapify函数即可!

    关键代码如下


点击(此处)折叠或打开

  1. /**
         * 小顶堆欢迎新同学
         * @param arr 某数组,不考虑根节点,构成一小顶堆,length为K
         * @param startIndex 被替换后的根节点,应为0
         */
        public void heapify4topK(int[] arr,int startIndex){
            int n=arr.length;
            int startValue=arr[startIndex];//要沉下去的数
            int leftSon=2*startIndex+1;
            int minIndex=0;
            while (leftSon             if (leftSon==n-1||arr[leftSon]<=arr[leftSon+1]){
                    minIndex=leftSon;
                }else if(arr[leftSon]>arr[leftSon+1]){
                    minIndex=leftSon+1;
                }
                int minSon = arr[minIndex];
                if(minSon>=startValue){
                    break;
                }
                arr[startIndex]=minSon;
                startIndex=minIndex;
                leftSon=2*startIndex+1;
            }
            arr[startIndex]=startValue;
        }

阅读(5725) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

invincibleliu2013-04-14 16:20:46

"这一亿条数据还分布在多台机器上"这句话不是本人随意编的,hadoop的Reducer数量是随Partition函数指定的,仅仅能保证每个分区的key唯一,key总量以及分布状况不做任何承诺,如果对于输出的word count[1]做排序的话,该算法不失为一良策



[1]http://hadoop.apache.org/docs/stable/mapred_tutorial.html#Example%3A+WordCount+v1.0