大数据的查找与排序

高频面试算法——排序算法、二分查找算法、递归算法、kmp匹配算法、大数据判存算法 系列文章目录 (一)引论——为后续章节搭建一个学习平台 (二)算法分析——时间复杂度的分析法则及5个经典算法案例分析 (三)链表——ArrayList与LinkedList源码解析和应用场景以及手写实现LRU缓存淘汰算法 (四)队列——线程池中有限资源请求队列排队功能的实现原理及队列的手写实现 (五)栈——用户界面的前进跳转及回退机制如何实现及栈的手写实现 (六)Hash表——HashMap 的实现原理精讲及Hash思想在ThreadLocal与数据库索引中的应用 (七)... 阅读详情

1. 题目要求


1. 数据: sentencesFile.txt是英文语句集合文件。句子之间有字符‘\n’分割,sentencesFile.txt文件大小<=1GB, 其中最短句子长度为6个字符,最长句子长度超过1000Kbyte。

计算环境:机器内存为2GB,2个CPU。

要求:设计对于随机输入的句子X判断sentencesFile.txt内是否存在相同句子的算法。

2. 数据: sentencesFile.txt是英文语句集合文件。句子之间有字符‘\n’分割,sentencesFile.txt文件大小<=10GB, 其中最短句子长度为6个字符,最长句子长度超过1000Kbyte。

计算环境:机器内存为2GB,2个CPU。

要求:设计对于随机输入的句子X判断sentencesFile.txt内是否存在相同句子的算法。


2. 简易分析


    当文件大小为1GB的时候,这些数据可以轻易放入内存,在内存中进行处理即可。而当文件大小为10GB的时候,这些数据无法一次放入内存。但是尽管当文件大小为1GB的时候可以将它们整个放入内存,普通的内部排序方法(比如快速排序、堆排序、冒泡排序等)虽然可以实现排序的功能,但是在如此大的数据面前,效率是很低下的。所以可以选择桶作为存储单位,这样可以减少排序所需做的工作。


3. 算法介绍


3.1 桶排序


    桶排序可以利用函数的映射关系,将大量的数据分配到多个“桶”中,然后在桶内进行排序,这样的话工作量会远远小于单纯使用内部排序方法。一个合适的映射函数可以直接使桶的顺序符合题目要求,这样的话只需要在桶内进行排序即可。

    桶排序的时间主要消耗在这么几个地方:对每个句子计算映射函数,时间复杂度为o(n);对每个桶内的所有数据分别进行排序,时间复杂度有多种选择,在3.2中介绍。

    减少时间复杂度有两种方法:一种是尽量使每个桶中的数据量相差不多,另一种是增大桶的数量。

    需要注意的是,桶内的数据量很不稳定。由于txt文件是英文语句集合字符串,所以"You are"、"What is"、"I am"等出现在首位的频率比较高,而类似"aaaaa"、"qqqqq"出现在首位的频率一定很低(有很大的可能根本不会出现),但是如果对每个"aaaaa"、"aaaab"……都创建一个桶的话,势必会造成空间的浪费,26的3次方为17576,但是26的4次方就已经达到了456 976 。所以需要改进一下桶排序方案。

    所以要先统计句子的前几个字节出现的频率,再将它们进行映射并排序。老师给出的思路是3个,但是我认为如果英文句子符合词法以及语法规则的话,使用4个字节也是完全可以的(当然这只是我自己的想法)。粗略思考一下,4个连续的除aeiou之外的字母在英文单词中是很少见的,这样就可以从28的4次方(在此假设包括了单引号和空格)中减去21的4次方,还可以减去很多无意义的字母排列组合,这样估算下来我认为桶的数量可以控制在10000以内,如果将频率低的关键字合并的话,会进一步减少桶的数量。使用4个字节还可以通过增大桶的数量来减少时间复杂度(虽然代价是空间复杂度),所以我认为还可以选择统计句子前四个字节出现的频率。然后就可以通过在桶间和在桶内的方法对大数据进行排序。


3.2 桶内排序方法的选用


    需要为桶内的排序挑选一个适当的排序方法。我认为使用快速排序比较好。因为句子长度从6个字符到超过1000kb,句子本身就比较无序、随机,所以不适合选用堆排序、归并排序、插入排序、冒泡排序。待排记录的关键字只有前6位在一个明显有限的范围内,而第6位之后的关键字不能保证。而且程序对稳定性没有要求,通过以上的要求,并结合各种排序方法的优缺点,选择对桶内的数据使用快速排序的方法。此排序方法平均时间复杂度为o(nlogn),最好情况为o(nlogn),最坏情况为o(n2),是不稳定的,不适合序列局部或整体有序的情况,所以我认为在本程序的情况下快速排序是最好的选择。


3.3 使用索引


    可以对比较大的文件建立一个索引表,以加快查找速度。数据库中就使用到了索引,可以用来对数据库表中一列或多列的值进行排序,大大提升了数据库性能。

    无论主文件是否按关键字有序,索引表中的索引项总是按关键字顺序排列,这时可以使用折半查找法在索引中检索。需要注意的是,对于数据量比较大的文件,需要视情况而定使用多级索引。

    对于英文句子,可以分段建立索引。比如一级索引为前三个字节,而二级索引为第三到第十个字节。

    假设使用了三级索引。可以这样设计,比如一级索引可以依照前三个字节划分:

编号

index

0

0

1

597

2

1124

3

1806

……

 

其中某个编号(假设为编号0)又对应着如下的二级索引。因为字符串长度不等,所以此索引会对应好几种情况,比如遇到句子结尾或者直接读取磁盘文件等:

编号

index

数目

标记

0

0

1

1

1

143

3

3

2

266

2

2

3

379

0

1

……

   

其中数目为下一级索引(或磁盘文件中的剩余句子)中的数目,而标记各自有着不同的含义。0  表示句子结束;

1  4个字节,下一级索引;

2  8个字节,下一级索引;

3  读取磁盘文件。

而最后的一级索引便可以这样设计:

编号

index

指向的文件行

0

0

41299

1

1

1078

2

2

91107

3

3

63702

……

  

这样可以保证每次访问磁盘的次数为1。


4. 详细设计


4.1 思考题一


大概流程如下(图就不贴了,直接写文字):

开始->统计句子前三个字节出现的频率->映射到按顺序存放的各个桶->合并数据量较少的桶->划分为文件->分别在每个文件中排序->结束

伪码:

  1. while(!EOF) {  
  2. line = readline(file);  
  3. hash(line);  
  4. }  
  5. if(the number in some barrels are little)  
  6. merge(barrels);  
  7. for every barrel {  
  8. saveToFile(file);  
  9. quicksort(file);  
  10. }  


    首先统计句子前三个字节出现的频率。需要设计N 个按顺序排放的桶,这些桶依照前三个字节进行划分。需要注意的是在英文句子中不是任意三个连起来的字符都是有意义的(比如”aaa”,”bbb”这样就是无意义的,绝大多数情况之下也不可能出现),所以桶的数量应该不会太过庞大,并且后面还会说到,对于字节出现频率低的几个桶,完全可以把它们合并起来。

    具体做法就是遍历这些英文句子,然后对它们进行映射并且把它们按桶的顺序分割成小文件。映射之后前三个字节的顺序就已经排好了。比如遍历之后可能是这样:

编号

所代表的字节

数量

索引

0

"aba"

215

0

1

"abb"

310

215

……

   

15

"att"

871

1846

16

"atu"

109

2717

……

   

    但是关键字出现的频率很不稳定。因为句首常用词出现的频率肯定远大于生僻单词出现的频率,而且对于桶排序,在各桶中数据量差不多的情况下,效率可以得到提高。所以可以将几个数据量较少的桶(可以根据数量和索引决定)合并起来,然后再进行下面的步骤。

    比如说以下这种情况:

编号

所代表的字节

数量

索引

……

   

40

"cab"

93

17829

41

"cac"

159

17922

42

"cad"

54

18081

……

   

    由表格可以看出,40-42这三个桶内数据量比较少,所以完全可以合并到一起,它们的索引就是“cab”的索引,即为17829。

    最后可以得出类似这样的一个表格,而且也依照顺序划分为了一些小文件。其中每个编号代表一个文件,文件的内容就是以这个编号所代表的字节开头的语句集合:

编号

所代表的字节

数量

索引

0

"aba"、"abb"、"abc"

679

0

1

"abe"、"abo"、"abr"、"aca"

801

679

2

"ace"

586

1480

3

"ach"、"ack"

732

2066

4

   

……

   

    可以看出,经过合并之后,每个桶的数据量比较近似,可以进行接下来的步骤。

现在已经划分出了多个小文件,这时就可以对这些小文件分别进行排序了,在内存允许的情况下完全可以使用多线程来加快速度,因为它们互相都是独立的。上面也介绍到,对于每个桶中的数据,可以使用快速排序的方法。每个桶中的数据排好序之后,整个英文语句集合也就排好了序。比如说,可能是以下的情况:

桶0中:

A bottle of……

A boy is……

A little girl……

……

桶1中:

Abolish this……

Abolished……

……

……

    可以看到每个桶中的英文句子都是有序的,桶也是有序的,这样就算排好了顺序。如果目的只是判断某个句子在文件中是否存在,那么排好序的小文件就没有必要再写入一个大的结果文件了,可以省去一次写数据的工作。总体来说,本方法需要读两次全部的数据,写一次全部的数据。

    使用这种方法的话,如果需要查找某一个句子,可以先根据这个句子的前三个字节查找这个句子在哪个桶,然后到对应的桶中再去查找,这样可以节省很多时间。


4.2 思考题二


    当句子文件为10GB的时候,上面的方法就变的不是很合适了,开销很大。而另一个需要注意的问题是,读写磁盘与读写内存比起来,所花的时间肯定更多,所以查找时需要尽量减少读写磁盘的次数以提高程序的效率。可以把10GB大小的文件分割成好几部分(比如说分割成10份1GB大小的文件),每部分文件分别排序(使用上一题中的方法)。虽然这样可以排序成功,但是查找的时候就比较费力气。这时可以使用索引,即把位置等信息存入内存,而数据信息留在文件中,查找的时候可以先读内存,从索引中查找然后再到磁盘上查找文件中的内容即可。

    由于排序过程与思考题一比较类似,这里不再赘述。由于此题中句子文件比思考题一大了10倍,所以比思考题一多了索引的内容。

索引的设计参照3.3。

假设有一个句子:

He is responsible for the administration of justice. 

按照3.3所设计的索引,大概面貌应该是下图这个样子:

    而在索引中添加了如3.3中所述的标记后,可以保证每次访问磁盘的次数为1。


5. 总结


    对于大数据来说,最重要的是算法的选用,一个合适的算法可以省去大量的时间。本题最重要的一个方法就是“分而治之”。

    在完成这个大报告的过程中,我也了解到了针对不同的操作大数据的需求,可以有不同的方法,还了解了一些以前未曾了解过的概念。比如败者树、trie树、倒排索引、MapReduce等。大数据在当今时代变得越来越重要,以后在这方面还是需要多加了解。

大数据学习之经典数据分析算法详解 在大数据行业,懂算法的大数据工程师是非常有核心竞争力的,之前科多大数据的一位培训学员面试之后,回来和我们分享,懂得算法在面试过程中是非常加分的,即便算法的底层逻辑不是很了解,但一定要懂得具体应用,本文详解了数据分析中经典的几大算法,辅助大家更好的学习。 算法一:快速排序法 快速排序是由东尼 · 霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n) 次比较。在最坏状... 阅读详情

相关推荐

大数据分治思想:查找大文件相同两行、大文件全排序

目录1. 查找大文件相同两行2. 大文件全排序 1. 查找大文件相同两行 题目:有一个2T的文本文件,只存在2行相同的数据,请用一台256M内存的单机服务器,找出这相同的2行数据 解决步骤: 读取一条数据A,求A的hashcode,然后取模,即X = a.hashcode % 10000,X的范围为0 ~ 9999,将数据A保存到fileX文件中 按步骤1进行文件的遍历,处理剩余的每条数据。这样2T的文件被分割成10000个小文件,但相同的2行数据肯定在同一个小文件中 依次处理每个小文件,找出在一个小文件

Bulut0907 1689

大数据排序的几种方法

关于大数据排序方法的一些总结

ztkhhhhhd的博客 2万+

大数据面试二常见算法之冒泡排序,二分查找,快排,归并

一,冒泡排序 /** * 冒泡排序 时间复杂度 O(n^2) 空间复杂度 O(1) */ public class BubbleSort { public static void bubbleSort(int[] data) { System.out.println("开始排序"); int arrayLength = data.length; for (int i = 0; i < a...

qq_40233706的博客 567

(算法课大报告)大数据的查找与排序

前段时间写的,把老师留的作业写得详细了些,现在把它贴上来,有错误欢迎指正,有需要改进的地方也欢迎提出! 1. 题目要求 1. 数据: sentencesFile.txt是英文语句集合文件。句子之间有字符‘\n’分割,sentencesFile.txt文件大小 计算环境:机器内存为2GB,2个CPU。 要求:设计对于随机输入的句子X判断sentencesFile.txt内

Present 7553

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 467

004.PADS VX2.4常用快捷键及无模命令

PADS系列文章

qq_36492361的博客 4963

大数据-搜索-倒排索引

1. 概念通过一个例子来介绍倒排索引文档1:Tom lives in Guangzhou,I live in Guangzhou too文档2:He once lived in Shanghai正向索引文章ID关键词1guangzhou,i,live,tom 2he,shanghai倒排索引简单点说,倒排索引就是讲包含关键词的文章ID整理出来关键词文章IDguangzhou1   he2i1liv...

sheldonwong的专栏 494

保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)

本文提供在Ubuntu 21.04上配置USRP X410的UHD 4.1驱动与Gnuradio 3.9的详细教程,涵盖虚拟机网络设置、依赖安装、源码编译及常见问题解决方案,帮助开发者高效搭建SDR开发环境。

weixin_27869497的博客 271

大数据排序、查找方法

参考  http://bbs.chinaunix.net/thread-1264289-10-1.html                   http://yangyou230.iteye.com/blog/1315439           http://blog.youkuaiyun.com/guyulongcs/article/details/7520467 1、位图法10亿个正整数,只有其中1

mengzhong060的专栏 1831

WebRTC Qos优化杂记

本文是笔者对WebRTC Qos性能研究、优化的一些思考,希望对有兴趣的读者有一些启发。

sonysuqin的专栏 6677

通用、可复用的 AI Skill 开发基本流程

-----name:唯一标识符(建议用领域-功能格式):自然语言描述触发条件(AI 依赖此判断是否激活)tags(可选):便于分类和搜索version:支持后续迭代步骤输出物1. 定范围触发场景描述2. 写元数据name3. 填内容结构化 Markdown 文件4. 做验证可运行 + 符合规范5. 去集成放入对应 IDE 目录6. 持续维护跟进框架更新通过这套流程,你不仅可以开发(Hooks 最佳实践)(原生 WebGL 优化)(Pandas/Numpy 高效写法)

lpfasd123的博客 721

大数据量实时统计排序分页查询(并发数较小时)的几点建议

下面有几条根据卖家监控页面的优化得出的最佳实践,欢迎拍砖 大数据量实时统计排序分页查询的瓶颈不是函数(count,sum等)执行, 不是having, 也不是order by,甚至不是表join, 导致慢的原因就在于“数据量太大本身” 化整为零 就是将表划分为M份相互独立的部分,可以是分表,也可以是不分表但冗余一个取模结果字段 实际结果是不分表比分表更加灵活...

anmuxf7123的博客 975

2026 年第十六届MathorCup数学应用挑战赛题目C题中老年人群高血脂症的风险预警及干预方案优化 2026妈妈杯 详细思路、代码、模型

2026 年第十六届MathorCup数学应用挑战赛题目 C题中老年人群高血脂症的风险预警及干预方案优化 人口老龄化进程的持续加快,使得40岁及以上中老年人群成为 慢性病防控的核心群体,其中高血脂症的发病率呈逐年攀升态势, 已成为诱发冠心病、脑梗死等心脑血管疾病的重要危险因素,严重 威胁中老年群体的心血管健康与生活质量,也加重了基层医疗的慢 病管理负担。从中医体质学视角来看,体质禀赋与偏颇是疾病发生 发展的内在根基,其中痰湿体质为中老年高血脂症的高发体质类型, 该体质人群存在痰湿内蕴、脾胃运化失常、水湿代谢

YOLO 753

位图如何实现大数据排序与查找

我们有 1 千万个整数,整数的范围在 1 到 1 亿之间。如何快速查找某个整数是否在这 1 千万个整数中呢? 当然,这个问题还是可以用散列表来解决。不过,我们可以使用一种比较“特殊”的散列表,那就是位图。我们申请一个大小为 1 亿、数据类型为布尔类型(true 或者 false)的数组。我们将这 1 千万个整数作为数组下标,将对应的数组值设置成 true。比如,整数 5 对应下标为 5 的数组值设置为 true,也就是 array[5]=true。 当我们查询某个整数 K 是否在这 1 千万个整数中的时候,

Clement 419

Google Earth Engine(GEE)——使用归一化燃烧指数 (NBR) 绘制地表烧伤严重程度图

归一化燃烧指数(Normalized Burn Ratio, NBR)是一种遥感指标,用于评估野火或烧伤地面后的植被恢复情况。NBR能增强较大范围的火灾区域,如大于200公顷。它是通过比较远红外波段 (SWIR) 和近红外波段 (NIR) 的反射率来计算的。SWIR波段测量烧伤地面的反射率,NIR波段测量没有受到烧伤影响的植被的反射率。NBR的计算公式为:NBR =(NIR-SWIR)/(NIR + SWIR)。其中,NIR为近红外波段,SWIR为短波红外波段。

此星光明博客 3464

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1230

大数据排序算法总结

1、(算法课大报告)大数据的查找与排序 2、算法的力量:位运算在排序与搜索中的应用 3、大数据分析中常用的7种排序算法的视觉图 4、对大数据量进行排序--位图法 5、大数据排序的实现代码, 理论上支持几百亿没问题吧 6、大文件内数据排序问题:采用文件映射内存技术 7、堆排序 海量数据求前N大的值 8、大数据排序相关 9、【参考】给大数据量的磁盘文件排序 10、

帅性而为1号的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

24大数据 15-2 线性查找和选择排序

【代码】24大数据 15-2 线性查找和选择排序。

Michelle8023的博客 263

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

排序与查找算法全解析:原理、实现与优化

系统梳理常见排序与查找算法的原理、实现、性能分析、工程优化与AI场景应用,结合面试高频题型、实战案例、常见陷阱、工程实践与前沿发展,助力算法面试与大数据/AI工程落地。掌握主流排序与查找算法原理、实现与性能分析注重工程优化与AI/大数据场景下的应用面试与实战并重,关注常见陷阱与前沿发展持续学习新型排序/查找技术,关注未来趋势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 684

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

转:大数据排序、查找方法

一、查找 1、位图法10亿个正整数,只有其中1个数重复出现过,要在O(n)的时间里面找出这个数,内存要尽可能少(小于100M)。 (1)首先看一下10亿个正整数,正整数可以表示的范围为1到2的31次方-1。 10亿也就是1*10^9,2^31次方=2*1024*1024*1024>20亿 再想起int为32位。 再想起位图法。 位图法也就是对于出现的数,其中每1bit代表这个数,...

weixin_30765319的博客 134

在学习大数据路上的小插曲:冒泡排序和二分法查找。

后面还会陆续有关于数据结构的知识补充

Swagwxl的博客 254

数据结构实验报告----查找与排序

对于小规模、无序的数据,顺序查找和冒泡排序可能足够使用,但对于需要频繁查找或大规模数据处理的场景,折半查找、快速排序和希尔排序则是更优的选择。在本次实验中,我们深入探讨了查找和排序算法的实现与效率,通过具体的编程实践,巩固了对查找表和排序表常用存储方式的理解,并掌握了顺序查找、折半查找、冒泡排序、快速排序和希尔排序等多种算法的思想及其实现。1.基本思想:改进自插入排序,通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

DK22151的博客 1875

大数据最全【查找排序相关面试题】,2024年最新面试大数据开发系统架构

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! :param s: :param t: :return: “”" ss = list(s) tt = list(t) ss.sort() tt.sort() ret

2401_84586689的博客 757
上一篇: Google Chrome Source Code 浏览器源码(下载)
下一篇: 大数据量的算法二
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值