一道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

 

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值