全球顶尖计算机科学家排名,中科大上榜人数全国第一

来源:今日头条

一年一度的全球顶尖计算机科学家TOP1000榜单出炉,这份由Guide2Research发布的计算机科学家排名中,中国科学技术大学以16人入选力压清华、北大、浙大等计算机科学强校,高居全国第一!

中科大张亚勤等13位本科校友和李凯等2位研究生校友和李向阳教师1位校友荣膺全球1000强计算机科学家,本科校友入选人数也是全国第一。

这一次用硬核数据再次刷新了大家对中国科学技术大学的固有认识。传统印象中,中科大是一所顶尖理科强校,但工科实力并不为人所知,其实也只是由于理科光芒太过耀眼罢了,中科大的工科依旧不俗,在泰晤士高等教育世界大学工科排名中,中科大工科位列中国内地第3,全球第29位,尤其是在新工科领域有着显著后发优势。

正是得益于中科大在基础理学和新兴工科上的优势地位,中科大培育的人工智能领域独角兽校友企业占半壁江山,比如商汤科技、寒武纪、云从科技、云知声等等,在中国高校科技独角兽孵化能力榜中,中科大凭借在AI芯片和机器视觉以及语音交互上的优势,高居中国内地第三位!

这样大家就不难理解,为何中科大校友上榜全球顶尖计算机科学家榜单人数最多,为何中科大在人工智能领域可以成为中国大学中的先行者和开拓者。

未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。

  如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”

好的,下面是一个跳表实现的玩家排行,支持快速查询玩家所在排名,并且支持不同玩家同积分按上榜时间排名。假设我们用一个玩家结构体来表示玩家信息,包含玩家ID、分数和上榜时间: ```c++ struct Player { int id; int score; time_t time; }; ``` 首先,我们需要定义跳表节点的结构体: ```c++ struct SkipNode { Player player; vector<SkipNode*> next; SkipNode(const Player& player, int level): player(player) { next.resize(level); } }; ``` 其中,`next` 是一个指向下一个节点的指针数组,长度为当前节点的层数。 接下来,我们定义一个玩家排行类: ```c++ class PlayerRanking { public: PlayerRanking(): head(new SkipNode(Player{-1, -1, 0}, MAX_LEVEL)), level(1) {} ~PlayerRanking() { SkipNode* p = head; while (p) { SkipNode* q = p; p = p->next[0]; delete q; } } void addPlayer(const Player& player) { SkipNode* p = head; vector<SkipNode*> update(MAX_LEVEL); for (int i = level - 1; i >= 0; i--) { while (p->next[i] && cmpPlayer(p->next[i]->player, player) < 0) { p = p->next[i]; } update[i] = p; } p = p->next[0]; if (p && cmpPlayer(p->player, player) == 0) { // 如果已经存在相同分数的玩家,则更新玩家信息 p->player = player; } else { // 否则插入新节点 int newLevel = randomLevel(); if (newLevel > level) { for (int i = level; i < newLevel; i++) { update[i] = head; } level = newLevel; } p = new SkipNode(player, newLevel); for (int i = 0; i < newLevel; i++) { p->next[i] = update[i]->next[i]; update[i]->next[i] = p; } } } int getPlayerRank(int playerId) { SkipNode* p = head; for (int i = level - 1; i >= 0; i--) { while (p->next[i] && p->next[i]->player.id <= playerId) { if (p->next[i]->player.id == playerId) { return getPlayerRank(p->next[i]); } p = p->next[i]; } } return -1; // 找不到对应的玩家 } private: static const int MAX_LEVEL = 16; SkipNode* head; int level; int getPlayerRank(SkipNode* node) { int rank = 0; SkipNode* p = head; for (int i = level - 1; i >= 0; i--) { while (p->next[i] && cmpPlayer(p->next[i]->player, node->player) < 0) { rank += countNodes(p->next[i]); p = p->next[i]; } } return rank + countNodes(node->next[0]) + 1; } int countNodes(SkipNode* node) { int cnt = 0; while (node) { cnt++; node = node->next[0]; } return cnt; } int cmpPlayer(const Player& p1, const Player& p2) { if (p1.score != p2.score) { return p1.score > p2.score ? 1 : -1; } else if (p1.time != p2.time) { return p1.time < p2.time ? 1 : -1; } else { return p1.id - p2.id; } } int randomLevel() { int level = 1; while (rand() % 2 == 0 && level < MAX_LEVEL) { level++; } return level; } }; ``` 在上面的实现中,我们使用了随机化的方法来决定每个节点的层数,以保证跳表高度的期望是 O(log n)。`addPlayer` 方法用于向排行中添加新玩家,如果已经存在相同分数和时间的玩家,则更新玩家信息。`getPlayerRank` 方法用于查询玩家所在排名。 在 `getPlayerRank` 方法中,我们先从跳表的最高层开始,一层一层向下查找,直到找到对应玩家的节点或者找到比该玩家分数低的节点。如果找到了对应玩家的节点,则调用 `getPlayerRank(SkipNode* node)` 方法来计算该玩家的排名。 在 `getPlayerRank(SkipNode* node)` 方法中,我们从跳表的顶层开始,一层一层向下查找,直到找到对应节点,中间经过的所有节点的数量就是该节点的排名。注意,这里的节点数量不包括该节点本身,因此最后要加上 1。 在 `cmpPlayer` 方法中,我们定义了一个比较函数,用于比较两个玩家的大小。首先比较分数,分数相同时比较上榜时间,时间相同时比较玩家ID。 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值