从一亿个数据中找出前100个最大值
方法一:
> 新建一100个红黑树节点,将输入前100个保存进去,然后全部插入红黑树T
> 遍历剩下的所有输入,对每一个输入值,如果值大于红黑树中最小值,则删除最小值节点,然后修改被删除节点的值为当前输入,然后插入红黑树。
复杂度为n*lg(m), n为输入数据条数,m为输出数据条数
方法二:将红黑树替换成最小堆,每插入一条数据,只需要运行MIN_HEAPIFY即可。
实际运行结果来看,最小堆的方法更快。
方法一代码如下,红黑树代码参考https://blog.youkuaiyun.com/v2nero/article/details/19170987
#include "stdafx.h"
#include <iostream>
#include <set>
#include <inttypes.h>
#include "rb.h"
#include <time.h>
//#define outputNum 100
//#define inputNum 100000000
int main(int arc, char *arv[])
{
if (arc != 3) {
printf("head100 input_num output_num\n");
return 1;
}
int inputNum = atoi(arv[1]);
int outputNum = atoi(arv[2]);
rb_tree_t T;
ia_rb_tree_init(&T);
rb_tree_node_t *nodes = new rb_tree_node_t[outputNum];
memset(nodes, 0, sizeof(rb_tree_node

本文探讨了两种从一亿个数据中找出前100个最大值的方法:使用红黑树和使用最小堆。通过对比,发现最小堆在实际运行中表现更优。文章提供了两种方法的代码实现,并提到了CPU运行效果。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



