排名算法

#include<stdio.h>

#include<iostream>
using namespace std;

struct BinaryTree
{
	int count;// 该节点的孩子总数
	int from_score;
	int to_score;
	BinaryTree* left;
	BinaryTree* right;
	BinaryTree(int from,int to,int c = 0):from_score(from),to_score(to),count(c),left(NULL),right(NULL){}
};

BinaryTree* createTree(BinaryTree*& root,int from,int to)
{
	if(from > to)return NULL;
	root = new BinaryTree(from,to);
	if(from == to)return root;
	int mid = from + ((to - from) >> 1);
	root -> left = createTree(root->left,from,mid);
	root -> right = createTree(root->right,mid+1,to);
	return root;
}

void insertNewScore(BinaryTree* root,int score)
{
	if(root == NULL)return;
	if(score >= root->from_score && score <= root->to_score)
		(root -> count) ++;
	int mid = root->from_score + ((root->to_score-root->from_score) >> 1);
	if(score <= mid)
		insertNewScore(root -> left,score);
	else
		insertNewScore(root->right,score);
}

void deleteOldScore(BinaryTree* root,int score)
{
	if(root == NULL)return;
	if(score >= root->from_score && score <= root->to_score)
		(root -> count) --;
	int mid = root->from_score + ((root->to_score-root->from_score) >> 1);
	if(score <= mid)
		deleteOldScore(root -> left,score);
	else
		deleteOldScore(root->right,score);
}

/* 更改score */
void changeScore(BinaryTree* root,int oldScore,int newScore)
{
	deleteOldScore(root,oldScore);
	insertNewScore(root,newScore);
}

void getRank(BinaryTree* root,int score,int& rank)
{
	if(root == NULL)return;
	int mid = root->from_score + ((root->to_score-root->from_score) >> 1);
	if(score > mid)getRank(root->right,score,rank);
	else if(root -> right)
	{
		rank += root -> right -> count;
		getRank(root->left,score,rank);
	}
}
int getRank(BinaryTree* root,int score)
{
	int rank = 1;
	getRank(root,score,rank);
	return rank;
}

void print(BinaryTree* root)
{
	if(root)
	{
		print(root -> left);
		cout << root -> from_score << "  " << root -> to_score << "  " << root -> count << endl;
		print(root -> right);
	}
}

int main()
{
	BinaryTree* root = NULL;
	createTree(root,1,10);//建立排名树
	int score[10] = {1,3,5,6,2,4,3,1,7,7};
	for(int i = 0;i < 10;i++)insertNewScore(root,score[i]);
	cout << "------------初始化后----------------" << endl;
	print(root);
	cout << "------------5的排名-----------------" << endl;
	cout << getRank(root,5) << endl;
	cout << "------------改变score----------------" << endl;
	changeScore(root,2,4);
	print(root);
	cout << "-------------3的排名----------------" << endl;
	cout << getRank(root,3) << endl;
}
时间: 2024-11-22 22:56:43

排名算法的相关文章

IMDB.COM排名算法(贝叶斯公式)

因为最近做万维品牌口碑的项目,需要对口碑进行一个对比,现在库中也有一部分的数据了,有很多的品牌评分居然是一样的,这是库中的真实的数据,如果我简单的按平均分进行评比,也行不太公平,因为有很多评论人数很多,但有的很少. 所以我就引用了IMDB.COM排名算法,他主要是对top250进行排名,对评分的人数有一定的限制,而我们品牌库中总不能不让相应的品牌露出.所以我就针对这个部分数据应用了贝叶斯公式. 最后的结果还是很好,能达到自己想要的效果.如果自己用平均值自己感觉都有点不好意思了. 这里跟大家分享一

黄聪:博客园的积分和排名算法探讨,积分是怎么计算的?(转)

我们先来看看现行规则,用公式表示为:-------------------------------------------------------------------BlogScore = BeRead + 10 * BeComment + 50 * CommentBlogScore:博客积分BeRead:个人博客所有随笔和文章的阅读数之和BeComment:个人博客被评论总数Comment: 个人所发表的评论总数---------------------------------------

编程之美之实时排名算法

首先来看一个实时排名算法 参考文献 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. 存储结构 首先,我们用一张用户积分表user_score来保存用户的积分信息. 表结构: 示例数据: 下面的算法会基于这个基本的表结构来进行. 算法1:简单SQL查询 首先,我们很容易想到用一条简单的SQL语句查询出积分大于该用户积分的用户数量: select 1 + count(t

啥是佩奇排名算法

佩奇排名介绍 佩奇排名是根据页面之间的链接结构计算页面的值的一种算法.下面我们通过动画来理解进行计算的具体流程. 假设一个正方形表示一个 WEB 页面,一个箭头表示一个页面之间的链接. 此图表明下面 3 页包含指向上面 1 页的链接 在佩奇排名算法中,网页指向的链接越多,页面被确定为越重要. 因此,在这里,确定首页最重要. 确定首页最重要 实际上,每个页面的重要性都是通过计算来量化的. 基本的计算方法思想 1.未链接的页面分数为 1 未链接的页面分数为 1 2.有链接的页面得分为正在链接的页面的

海量用户积分排名算法探讨

这篇可参考 http://www.cnblogs.com/weidagang2046/archive/2012/03/01/massive-user-ranking.html#!comments 问题 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. PS: 据说这是迅雷的一道面试题,不过问题本身具有很强的真实性,所以本文打算按照真实场景来考虑,而不局限于面试题的理想

海量用户积分排名算法探讨【转载】

本文内容 问题 存储结构 算法1:简单SQL查询 算法2:均匀分区设计 算法3:树形分区设计 算法4:积分排名数组 该问具体出自哪里,不是很确定,而我是在某个微信公众号上看到的~文中的内容比较有启发性的~ 问题 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. PS:据说这是迅雷的一道面试题,不过问题本身具有很强的真实性,所以本文打算按照真实场景来考虑,而不局限于面试

The Best Rank (25)(排名算法)

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algebra), and E - English. At the mean time, we encourage students by e

PageRank网页排名算法

互联网上各个网页之间的链接关系我们都可以看成是一个有向图,一个网页的重要性由链接到该网页的其他网页来投票,一个较多链入的页面会有比较高等级,反之如果一个页面没有链入或链入较少等级则低,网页的PR值越高,代表网页越重要 假设一个有A.B.C.D四个网页组成的集合,B.C.D三个页面都链入到A,则A的PR值将是B.C.D三个页面PR值的总和: PR(A)=PR(B)+PR(C)+PR(D) 继续上面的假设,B除了链接到A,还链接到C和D,C除了链接到A,还链接到B,而D只链接到A,所以在计算A的PR

百度排名规则及算法(百度内部资料)

今日一位自称百度内部人疯疯癫癫的给我上了一节百度内部的课程,那就是关于百度排名规则以及算法方面的,刚刚听的时候貌似疯癫,越到后面,越是感觉茅塞顿开,以此分享出来给大家. 要想百度给你网站排名,只有三种理由,第一你给百度钱了,第二你是百度旗下的公司或产品,第三你提供有价值的内容,提高了百度搜索的用户体验了.除去这三个理由,你别想着要百度给你排名,那么我们围绕这三种理由,展开我们的分析. 百度竞价 百度竞价主要是根据关键词出价获得排名的,对于百度竞价我了解的不是很多,大致我清楚,当你出价1元一个点击