Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260345
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-04-12 19:46:57

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

问题分析:我们知道,对1000W个数据很难具体用一个排序来全部排出来所有元素,然后找出最大的100个
所以想到最适合处理海量数据的堆来实现,现在用最大堆还是最小堆?我们会理所当然的想,要找最大的100个应该是用大堆。不过,堆是一个近似有序的序列,最大堆的特点是顶端元素为最大数,但不能保证最小元素会是哪个叶子结点,从而无法比较到底有没有比数列元素中最小的大的元素存在。所以我们要用最小堆。

具体实现方法如下:

  1. // 创建红包数据
  2. void CreateRedPacket(vector<int>& moneys)
  3. {
  4.     srand(time(0));
  5.     moneys.reserve(N);
  6.     for (int i = 0; i < N; ++i)
  7.     {
  8.         moneys.push_back(rand()%10000);
  9.     }

  10.     for(int j = N - K; j < N; ++j)
  11.     {
  12.         moneys[j] = rand() % N;
  13.     }
  14. }

  15. void AdjustDown(int* a, size_t size, int root)
  16. {
  17.     int child = root*2+1;
  18.     while (child < size)
  19.     {
  20.         if (child+1 <size && a[child+1] < a[child])
  21.         {
  22.             ++child;
  23.         }

  24.         if (a[child] < a[root])
  25.         {
  26.             swap(a[child], a[root]);
  27.             root = child;
  28.             child = 2*root+1;
  29.         }
  30.         else
  31.         {
  32.             break;
  33.         }
  34.     }
  35. }

  36. void GetTopK(vector<int>& moneys)
  37. {
  38.     int arrays[K] = {};
  39.     for (size_t i = 0; i < K; ++i)
  40.     {
  41.         arrays[i] = moneys[i];
  42.     }

  43.     // 建小堆
  44.     for(int i = (K-2)/2; i >= 0; --i)
  45.     {
  46.         AdjustDown(arrays, K, i);
  47.     }

  48.     for (size_t i = K; i < N; ++i)
  49.     {
  50.         if (arrays[0] < moneys[i])
  51.         {
  52.             arrays[0] = moneys[i];
  53.             AdjustDown(arrays, K, 0);
  54.         }
  55.     }

  56.     for (int i = 0; i < K; ++i)
  57.     {
  58.         cout<<arrays[i]<<" ";
  59.     }

  60.     cout<<endl;
  61. }

  62. void TestTopK()
  63. {
  64.     vector<int> moneys;
  65.     CreateRedPacket(moneys);
  66.     GetTopK(moneys);
  67. }
阅读(1107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~