堆的应用之海量数据处理(红包大乱战)

应用场景:2015年春节期间,A公司的支付软件某宝和T公司某信红包大乱战。春节高峰以后,公司Leader要求后台攻城狮对后台的海量的数据进行分析。先要求分析出各地区发红包最多的前100位用户。现在知道人最多的S地区大约有100W用户,要求写一个算法实现。

分析:看到这里,问题可以简化为求很多个数据中的前100个节点,然而这很多个数据磁盘根本放不下,并且找出前100个数比较复杂,因此我们可以借助堆来实现。这样数据从磁盘里读,而内存中只有100个数据。那么到底是建大堆还是建小堆来解决呢?我们知道大堆就是父节点都大于孩子节点,小堆就是父节点都小于孩子节点,当我们找到的数大于最后一个节点时堆就应该排序一次,因此我们应该建一个小堆,根节点就是100里面最小的,用父节点与需要比较的数据进行比较,如果比根节点大,那么需要入堆进行排序,否则就不需要排序。实现代码如下:

void CreateRedPacket(vector<int>& moneys)  //创建红包数据
{
    srand(time(0));
    moneys.reserve(N);
    for (int i = 0; i < N; ++i)
    {
        moneys.push_back(rand() % 10000);
    }
    for (int j = N - K; j < N; ++j)
    {
        moneys[j] = rand() % N;
    }
}

void AdjustDown(int*a, size_t size, int root)    //向下调整
{
    int parent = root;
    int child = parent * 2 + 1;
    while (child < size)
    {
        while (child + 1 < size&&a[child + 1] > a[child])   //找出左右节点中值最大的那个
            child++;

if(a[parent] < a[child])
        {
            swap(a[parent], a[child]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
        {
            break;
        }
    }
}

void GetTopK(vector<int>& moneys)   //获取前K个数据
{
    int arrays[K] = { 0 };
    for (size_t i = 0; i < K; ++i)
    {
        arrays[i] = moneys[i];
    }

for (int i = (K- 2) / 2; i>=0; ++i)   //先建一个数据个数为K的堆
    {
        AdjustDown(arrays, K, 0);
    }

for (size_t i = K; i < N; ++i)    //把剩下的数据一一跟对顶元素比较,如果数据小于堆顶元素就赋值给堆顶元素并向下调整
    {
        if (arrays[0] < moneys[i])
        {
            arrays[0] = moneys[i];
            AdjustDown(arrays,  K, i);
        }
    }
    for (int i = 0; i < K; ++i)   //打印出前K个数据
    {
        cout << arrays[i] << "  ";
    }
    cout << endl;
}

void TestTopK()
{
    vector<int> moneys;
    CreateRedPacket(moneys);
    GetTopK(moneys);
}

时间: 2024-10-12 21:55:50

堆的应用之海量数据处理(红包大乱战)的相关文章

转 十道海量数据处理面试题与十个方法大总结

作者:July.youwang.yanxionglu. 时间:二零一一年三月二十六日本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题.有任何问题,欢迎随时交流.指正.出处:http://blog.csdn.net/v_JULY_v. 第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可以采用映射的方法,比如模1000,把整

关于海量数据处理的相关问题

看过很多面经,里面都会问到海量数据处理的问题.虽然在学校根本遇不到这样的情境,但很多方法还是需要我们去好好了解一下的,也是为了以后的工作做准备吧. 搜集了一些有关海量数据处理的问题和解答,如下: 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计. 再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文

【海量数据处理】N个数中找出最大的前K个数

N个数中找出最大的前K个数,需要用小堆实现. 分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将大数据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素. void AdjustDown(int *a, size_t root, size_t size)//下调 {//小堆 size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (child + 

海量数据处理策略之一—Hash映射 + Hash_map统计 + 堆/快速/归并排序

时间:2014.05.21 地点:基地 说明:根据July的博客等整理,感谢July的无私奉献 心情:现在都好开心呀,想着要为以后的时光好好奋斗~ --------------------------------------------------------------------------------------- 一.问题描述 海量日志数据,提取出某日访问百度次数最多的那个IP. 思路:由于数据集很大,我们的策略是先用哈希映射将海量数据集映射为适当数量的非海量数据集,这个非海量数据集的大

海量数据处理:Hash映射 + Hash_map统计 + 堆/快速/归并排序

海量日志数据,提取出某日访问百度次数最多的那个IP. 既然是海量数据处理,那么可想而知,给我们的数据那就一定是海量的. 针对这个数据的海量,我们如何着手呢?对的,无非就是分而治之/hash映射 + hash统计 + 堆/快速/归并排序,说白了,就是先映射,而后统计,最后排序: 分而治之/hash映射:针对数据太大,内存受限,只能是:把大文件化成(取模映射)小文件,即16字方针:大而化小,各个击破,缩小规模,逐个解决 hash_map统计:当大文件转化了小文件,那么我们便可以采用常规的hash_m

大数据算法---海量数据处理面试题整理

1. 海量数据处理常用数据结构 [Bloom Filter] [Bit map] [Hash] [Trie] [堆] 2. 面试题剖析 海量数据面试题的常见考点,无非就是两个,一是数据太大,无法一次性装入内存:二是数据量太大,无法单机快速处理 参考资料 https://blog.csdn.net/v_july_v/article/details/7382693 https://blog.csdn.net/v_JULY_v/article/details/6279498 原文地址:https://

海量数据处理算法总结【超详解】

1. Bloom Filter [Bloom Filter]Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在集合的快速的概率算法.Bloom Filter有可能会出现错误判断,但不会漏掉判断.也就是Bloom Filter判断元素不再集合,那肯定不在.如果判断元素存在集合中,有一定的概率判断错误.因此,Bloom Filter不适合那些“零错误”的应用场合. 而在能容忍低错误率的应用场合

海量数据处理方法

1.hashing 适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存.  这里的hashing和 hashmap是不一样的概念,这里的hash指的是hashtable,可以看例子:(比较两个字符串的包含问题) 问题实例: 1).海量日志数据,提取出某日访问百度次数最多的那个IP. IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计. 2.bitmap 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下.

海量数据处理算法

1. Bloom Filter [Bloom Filter]Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.它是一个判断元素是否存在集合的快速的概率算法.Bloom Filter有可能会出现错误判断,但不会漏掉判断.也就是Bloom Filter判断元素不再集合,那肯定不在.如果判断元素存在集合中,有一定的概率判断错误.因此,Bloom Filter不适合那些"零错误"的应用场合. 而在能容忍低错误率