TopN算法与排行榜

在系统中,我们经常会遇到这样的需求:将大量(比如几十万、甚至上百万)的对象进行排序,然后 只需要取出最Top的前N名作为排行榜的数据,这即是一个TopN算法。常见的解决方案有三种:

(1)直接使用List的Sort方法进行处理。

(2)使用排序二叉树进行排序,然后取出前N名。

(3)使用最大堆排序,然后取出前N名。

第一种方案的性能是最差的,后两种方案性能会好一些,但是还是不能满足我们的需求。最主要的原 因在于使用二叉树和最大堆排序时,都是对所有的对象进行排序,而不是将代价花费在我们需要的少数的 TopN上。为此,我自己实现了TopNOrderedContainer来解决这个问题。

思路是这样的,使用一个长度为N的数组,来存放最Top的N个对象,越Top的对象其在数组中的Index就 越小。这样,每次加入一个对象时,就与Index最大的那个对象比较,如果比其更Top,则交换两个对象的 位置。如果被交换的对象是数组中的最后一个对象(Index最大),则该对象会被抛弃。如此,可以保证 容器中始终保持的都是最Top的N个对象。

接下来我们看具体的实现。

如果一个对象要参与TopN排行榜,则其必须实现IOrdered接口,表明其可以被Top排序。

    /// <summary>
    /// IOrdered 参与排行榜排序的对象必须实现的接口。
    /// </summary>
    /// <typeparam name="TOrderedObj">参与排行榜排序的对象的类型 </typeparam>
    public interface IOrdered<TOrderedObj>
    {
        bool IsTopThan(TOrderedObj other);
    }

之所以使用泛型参数TOrderedObj,是为了避免派生类在实现IsTopThan方法时,需要将参数other进行 向下转换。

时间: 2024-08-01 22:02:28

TopN算法与排行榜的相关文章

请教一下, 有些软件中的几日和的算法

问题描述 最近玩股票,看到有的软件中有5日,10日涨跌幅的数据我自己试着写了一个,但是算的很慢,但是股票软件中还是即时数据,怎么那么快呢?我的算法如下//历史价格集合varlist=dal.GetModelList(dal.SerialSafeSearchkey(mo)).OrderByDescending(x=>x.PriceDateTime);System.Diagnostics.Debug.WriteLine("GetModelList时间:"+t.GetElapsedTi

百度竞价排名也是需要优化的

怎么做百度竞价排名对于很多人来说并不陌生,怎么让我们做的百度竞价排名带来更大的利益呢?我们把一件看是很简单的事情细节化,会恍然大悟发现自己原来这些细节我都没注意到.下面我就一百度竞价排名优化步骤为话题展开,具体要怎么操作呢,我们可以从下面四个方面作为参考. 第一步.把整理出来的报告数据进行分析 我们要养成每天都做次完整的数据分析,为什么呢?因为对于数据统计.处理和分析可以更好的规划好我们下一步怎么做. 第二步.关键词的删除.整理 首页我们先明白为什么要删除关键词,很多时候我们会因关键词的数量过多

link环境下制作《网盘软件》下载器启动程序如何做热门文件推荐?

问题描述 link环境下制作<网盘软件>下载器启动程序如何做热门文件推荐? link环境下制作<网盘软件>下载器启动程序如何做热门文件推荐? 解决方案 这个涉及到topn算法,参考http://wenku.baidu.com/link?url=zk9sXslX6eLxtsn58YOtCuXW1KiFww0-81l-4pokqOUGSvQEcKKIT4LlXe-qJNn_qz8Cd8Ws2XMsOVJzPeKls7JpBL9cyUlTI0BD4Z0Jtl7

FDDB 和 KITTI 之后,ImageNet 大赛中国团队再次包揽多项冠军

今日,全球最为权威的计算机视觉大赛 ImageNet ILSVRC2016(大规模图像识别竞赛)公布了算法排名结果,中国学术界和工业界团队包揽多项冠军. 今年 ILSVRC2016 分为五大部分,包括:目标检测.目标定位.视频中目标物体检测.场景分类.场景分析.中国团队的成绩如下: CUImage(商汤科技和港中文)目标检测第一 Trimps-Soushen(公安部三所)目标定位第一 CUvideo(商汤和港中文):视频中物体检测子项目第一 NUIST(南京信息工程大学):视频中的物体探测两个子

Netflix每年靠它节省10亿美元,这套个性化推荐系统是怎么回事?

2009年由Netflix发起的Netflix Prize百万美金竞赛,绝对是推荐系统领域最标致性的事件,这次比赛不但吸引了众多专业人士开始投身于推荐系统领域的研究工作,也让这项技术从学术圈真正地进入到了商业界,引发了热烈的讨论并逐渐深入到了商业的核心腹地. 当然,最受益的肯定还是Netflix公司自己,不仅大有取代Amazon成为新一代推荐引擎之王的架势,而且从商业回报本身上看也无疑取得了非常巨大的回报. 7年过去了,Netflix推荐系统的现状如何呢?ResysChina将带来最新的深度解读

百度竞价排名优化步骤

摘要: 怎么做百度竞价排名对于很多人来说并不陌生,怎么让我们做的百度竞价排名带来更大的利益呢?我们把一件看是很简单的事情细节化,会恍然大悟发现自己原来这些细节我都没注意到. 怎么做百度竞价排名对于很多人来说并不陌生,怎么让我们做的百度竞价排名带来更大的利益呢?我们把一件看是很简单的事情细节化,会恍然大悟发现自己原来这些细节我都没注意到.下面我就一百度竞价排名优化步骤为话题展开,具体要怎么操作呢,我们可以从下面四个方面作为参考. 第一步.把整理出来的报告数据进行分析 我们要养成每天都做次完整的数据

苹果商店排行榜算法揭秘 搜索引擎至关重要

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;     8月初,苹果第二次调整应用商店排名算法后,总榜排名连续10日未出现刷榜的APP,而苹果此次调整,延续了之前6月26日第一次调整算法时的策略优化,根据APP的人气进行排序,关于人气权重的构成,笔者通过如下分析,进一步揭开目前排名算法的主要结构.     1. 优先权对排名的影响 笔者选取了生活榜的前20名应用排行,根据苹果的热度排序,组成了上图的排名变化关系,

TIOBE 9 月编程语言排行榜,新 TIOBE 指数算法

截至本月,TIOBE 指数采用了一种改进的算法来计算编程语言的普及.这种新的算法主要是为了处理异常值(统计噪声)从结果中删除.以前的算法集中在每个搜索引擎的异常值的数目.如果有太多的异常值的一个搜索引擎,搜索引擎将没有资格因其"不可靠的"结果.现在个别异常值(统计噪声每搜索引擎的语言)被删除.在这种方式中,只有真正的异常值不见了,从而避免了恼人的尖峰.编程语言的位置几乎不受影响,但总的印象是,结果是更好的.例如,Scala 现在是接近顶部20,再次进入前 50,Clojure 是闯入前

协同过滤算法 R/mapreduce/spark mllib多语言实现

用户电影评分数据集下载 http://grouplens.org/datasets/movielens/ 1) Item-Based,非个性化的,每个人看到的都一样 2) User-Based,个性化的,每个人看到的不一样 对用户的行为分析得到用户的喜好后,可以根据用户的喜好计算相似用户和物品,然后可以基于相似用户或物品进行推荐.这就是协同过滤中的两个分支了,基于用户的和基于物品的协同过滤. 在计算用户之间的相似度时,是将一个用户对所有物品的偏好作为一个向量,而在计算物品之间的相似度时,是将所有