一道baidu海量查找题

本文介绍了一种算法,用于从上亿个浮点数中高效地查找最大的10000个数据。通过分块处理和快速排序方法,实现大规模数据筛选。实例代码提供了具体的实现步骤和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:现在有上亿个浮点数,设计算法从中找到最大的10000个数据

解题思路:

1. 一般来说,这上亿个浮点数可以放在一个文本文件中,我们把这些数据进行分块处理,比如分为10块,每块数据量相对较少,可以装入内存

2. 将1000万个数据装入内存后,按照快速排序的方法从中查找最大的10000个数据,依次处理其余的9块,都找到每一块的最大的10000个数据

3. 将这10万数据合并,从中查找最大的10000个数据

 该思路的核心算法就是从大量数据中利用快速排序查找出最大的若干个数据

算法如下:

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:在大量数据中查找最大的若干个数据
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/10/31
*/

/*
*利用快速排序的方法进行查找,首先将整个待查找的数据放入STL中的向量中,然后依据快速排序的方法
递归查找
*/
#include <iostream>
#include <vector>
#include <Iterator>
#include <algorithm>
#include <ctime>
#include <fstream>
using namespace std;

const int N=100;  //有100个数据
fstream fs;
template<class Iterator,class Type>
class SelectMaxN {
	private:
		int n;                 //选择多少个最大的数据
		vector<Type>v;         //将这些n个最大的数据保存在此向量中
		Iterator Divide(Iterator start,Iterator finish) {
			Type temp=*start;
			while(start<finish) {
				while(*finish>temp && finish>start) finish--;
				if(finish>start) *start++=*finish;
				while(*start<temp && finish>start) start++;
				if(finish>start) *finish--=*start;
			}
			*start=temp;
			return start;
		}
		void Solution(Iterator start,Iterator finish) {
			Iterator mid=Divide(start,finish-1);
			if(finish-mid==n) {   //此时最大的n个元素已经生成
				find(start,finish);
				return;
			}
			else if(finish-mid>n) {  //此时[mid,finish-1]区间中的数大于n
				Solution(mid+1,finish);
			}
			else {            //此时[mid,finish-1]区间中已经出现了最大的如干个数
				int i=0;      //用来计算从[mid,finish-1]区间中有多少个数
				Iterator it=finish-1;
				while(it>=mid) {
					v.push_back(*it--);
					i++;
				}
				n-=i;          //需要在[start,mid-1]区间中查找n-i个最大的数  
				Solution(start,mid-1);
			}
		}
		void find(Iterator start,Iterator finish) {
			int i;
			Iterator it=finish-1;
			for(i=0;i<n && it>=start;i++) {
				v.push_back(*it--);
			}
		}
	public:
		SelectMaxN(Iterator start,Iterator finish,int n) {
			if(n>finish-start) this->n=finish-start;   //n已经超过所有数据个数
			this->n=n;
			Solution(start,finish);
		}
		void show() {
			vector<Type>::iterator it;
			for(it=v.begin();it!=v.end();it++) {
				fs<<*it<<endl;
			}
		}
};

void main() {
	fs.open("e:\\log.txt");
	if(!fs) {
		cout<<"无法打开文件!"<<endl;
		fs.clear();
		fs.close();
		return;
	}
	srand(unsigned(time(0)));
	vector<int>a;
	int i;
	for(i=0;i<N;i++) {   //随机生成N个整数
		a.push_back(rand()%N);
		fs<<"第"<<i<<"个数:"<<a[i]<<endl;
	}
	fs<<endl;
	int n=10;
	SelectMaxN<vector<int>::iterator,int>aa(a.begin(),a.end(),n);
	fs<<"最大的"<<n<<"个数据是:"<<endl;
	aa.show();
	fs.clear();
	fs.close();
}


 

测试:

日志文件内容是:

第0个数:17
第1个数:78
第2个数:81
第3个数:1
第4个数:80
第5个数:8
第6个数:70
第7个数:44
第8个数:98
第9个数:70
第10个数:39
第11个数:92
第12个数:64
第13个数:82
第14个数:60
第15个数:27
第16个数:28
第17个数:18
第18个数:87
第19个数:75
第20个数:45
第21个数:95
第22个数:10
第23个数:58
第24个数:8
第25个数:36
第26个数:32
第27个数:69
第28个数:67
第29个数:83
第30个数:60
第31个数:49
第32个数:55
第33个数:51
第34个数:71
第35个数:66
第36个数:59
第37个数:31
第38个数:95
第39个数:12
第40个数:37
第41个数:90
第42个数:95
第43个数:34
第44个数:72
第45个数:39
第46个数:57
第47个数:77
第48个数:13
第49个数:22
第50个数:93
第51个数:28
第52个数:62
第53个数:44
第54个数:64
第55个数:21
第56个数:14
第57个数:39
第58个数:97
第59个数:29
第60个数:10
第61个数:14
第62个数:43
第63个数:43
第64个数:83
第65个数:52
第66个数:36
第67个数:2
第68个数:29
第69个数:30
第70个数:76
第71个数:88
第72个数:79
第73个数:90
第74个数:37
第75个数:29
第76个数:85
第77个数:1
第78个数:93
第79个数:37
第80个数:11
第81个数:37
第82个数:72
第83个数:97
第84个数:90
第85个数:7
第86个数:35
第87个数:40
第88个数:23
第89个数:47
第90个数:57
第91个数:49
第92个数:14
第93个数:70
第94个数:86
第95个数:51
第96个数:97
第97个数:39
第98个数:22
第99个数:70

最大的10个数据是:
95
95
97
97
98
97
95
93
93
92

 

基于SpringBoot+Vue的社区便民服务平台研究AI更换标第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问进行优化。5.1测试环境与工具介绍测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值