程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。

#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;
/*
问题:设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
分析:看到大数据要想到:1)分组,2)位图,3)批处理。
      足以容纳说明可以一次性放入,那么问题就变成了从n个数字中寻找最小的k个数。
	  那么这个问题可以用划分来做。或者线性选择。或者分治法。
	  用划分吧:划分是快排中的划分,快速排序中通过划分可以确定一个数字排到它应该对应的位置上。
	  把枢轴放到了该放的位置上,因此如果枢轴是最小的k个数,那么就是最终结果
	  要知道,如果对于某个划分的值m,其对应划分后的A[low] = m,就是把m放到了数组中第low位,该数m
	  必定是第low小的数,如果low < k,那么说明就是要找到的值
	  我们根据枢轴返回的下标 <= k-1,那么
	  至少选择k次,每次划分的时间复杂度为O(logN),所以总的时间复杂度为O(k*logN),即O(logN)

输入:
9(数组元素个数n) 3(选择的前k个数)
4 1 8 5 3 6 7 9 2

9 5
4 1 8 5 3 4 7 9 2
输出:
1 2 3(前k个最小的元素)
1 2 3 4 4

关键:
1 划分函数中:
	//接下来选择枢轴,随机选择low~high中的某个值k,让A[low]与A[k]进行交换,然后让A[low]作为枢轴
	int k = randRange(low , high);
	//这里交换的时候要获取地址
	swap(datas.at(low) , datas.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值