#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.
程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
这篇博客介绍了如何解决一个大数据问题:在10亿个数字中找出最小的100万个。通过利用快速排序的划分思想,设计了一个算法,时间复杂度为O(logN),并提供了详细的代码实现。
摘要由CSDN通过智能技术生成