大数据题目的解题技巧

news2024/11/17 21:55:04

目录

大数据题目的技巧总括

实例精析

     实例一

     实例二

     实例三

大数据题目的技巧总括

(1)哈希函数可以把数据按照种类均匀分流;

(2)布隆过滤器用于集合的建立与查询,并可以节省大量空间;

(3)一致性哈希解决数据服务器的负载管理问题;

前面这三个内容在《与哈希函数有关的结构》这篇文章中已经进行详细介绍。

与哈希函数有关的结构-CSDN博客

(4)利用并查集结构做岛问题的并行计算;

这个内容在《并查集的详解》这篇文章中已经进行详细介绍。

并查集的详解-CSDN博客

(5)位图解决某一范围上数字的出现情况,并可以节省大量空间

关于位图的内容在《与哈希函数有关的结构》这篇文章中有所介绍,这篇文章也有相关介绍

与哈希函数有关的结构-CSDN博客

(6)利用分段统计思想、并进一步节省大量空间

(7)利用堆、外排序来做多个处理单元的结果合并

         这篇文章主要介绍后面三个。

实例精析

     实例一

       32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然存在没出现过的数。可以使用最多1GB的内存,怎么找到所有未出现过的数?

       这个题目的求解可以采用位图的思想,把32位无符号整数的范围做位图对应,(位图用一个比特表示一个数出现过还是没有出现过),准备一个2^{32}的比特类型的数组,那么需要2^{32}/8的字节空间,也就是512MB,然后出现过的记录一次,很容易统计出来没有出现过的。

       [进阶]只给你3KB的内存,怎么找到一个没有出现过的数字?

       题目给了3KB的内存,先计算得出如果把3KB的内存全部变成无符号整型数组的话,可以生成长度为768的整型数组,在这里我们找到比768小的2的次方的大小,选择512长度,此时生成一个长度为512的整型数组。然后将0~2^{32}这个范围内的数平均分成512份,接着将题目所给的40亿个数字除以512得到的值为多少就放到哪一份所在的数组中,进入一个数组中对应位置的词频加1,统计所有的数字,最终在统计完毕以后,分析哪一份中存在空缺,继续在这一份中按照同样的方式进行统计,最终一定可以找到亿个没有出现过的数字。

       进而我们就找到了思路,如果题目只给了1KB内存,同样的用1KB*1024/4,然后找到不超过它的2的次方的某个数值,定义出来整型数组,然后将氛围划分进行求解。

       [进阶]只给了有限几个变量,怎么找到一个没有出现过的数字?

       将0~2^{32}这个范围进行二分,然后在每一块分析那一块存在空缺,继续二分,按照这种方式,最多二分32次,一定可以找到一个没有出现过的数字。

       对于后面进阶部分的分析采用的是分段统计的思想,在每一段进行题目的求解,进而节省空间

     实例二

       有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL.

       这个题目的解决可以根据哈希函数可以把数据按照种类均匀分流的性质,可以准备多台机器,然后将100亿个大文件分到各台机器上,或者放到多个文件中处理,然后对于每一个文件,使用哈希函数求对应的哈希值,取模得到对应的值,然后根据对应的值依次放到各个用来统计的文件中,统计完毕以后,对每一个统计文件进行处理,在统计文件中就可以中就可以找到重复的URL。

       也可以使用布隆过滤器进行操作,根据能够容许的错误率和100亿个样本量进行布隆过滤器的构建,使用布隆过滤器的位图依次开始统计每一个文件,进来过的位置描黑,后面进来的文件如果通过哈希函数求出哈希值取模以后得到的对应的位置已经描黑,那么代表是重复值,采用这种方法统计所有的重复值。

       [补充]某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天热门Top100词汇的可行办法。

       这个问题的解决采用的是堆的思想,先将全部的搜索词汇按照哈希分流的思想,求出哈希值取模放到对应的文件中,每一个文件的搜索词汇放到一个大根堆中,然后将每一个大根堆的堆顶弹出,放到一个总大根堆中,将大根堆的堆顶元素弹出,为TOP1,然后将堆顶元素原来所在的堆的堆顶元素弹出压入总大根堆,然后弹出总大根堆的堆顶元素,按照这种方式,依次打印出TOP100词汇。

     实例三

       32位无符号整数的范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB的 内存,找出所有出现了两次的数。 

       这个题目依然可以采用哈希函数分流的思想解决,假设我们使用1GB的内存,哈希表一条记录8字节,经过计算1GB内存可以装2^{10}\times 2^{10}\times 2^{10}/8条记录,那么我们就把内存分成2^{10}\times 2^{10}\times 2^{10}/8个小文件,然后对于每一个整数,计算出它的哈希值和m取模,m的值为2^{10}\times 2^{10}\times 2^{10}/8,这样就可以把每个整数放到对应的小文件中。接着再对每一个小文件进行同样的操作,哈希函数文件的划分,不断重复上述操作,就可以最终找出所有出现两次的数。

       这个题目同样可以使用位图的方法去解决,题目要求找出所有出现两次的数字,那么我们可以用两位信息表示一个数,也就是两个比特,用00表示没有出现过的数字,01表示出现过一次的数字,10表示出现过两次的数字,11表示出现两次以上的数字。这时对于整个范围的数字,需要2^{32}\times 2比特,相当于1GB的内存,实际只有40亿个整数,内存是完全够用的,然后对所有的数字使用位图进行统计,最后找出所有为10的数组即可找到所有出现两次的数。

       [补充]可以使用最多10MB的内存,怎么找到这40亿个整数的中位数?

       这个题目采用分段统计的思想,也就是将总的范围根据内存的大小分成几份,在每一份上进行分析。题目给了10MB内存,计算出10MB内存下最多可以产生的无符号整型数组的长度,数组长度最长为10\times 2^{10}\times 2^{10}/4,选择比它小的2的次方的某个数值,选择2^{20}长度的无符号整型数组,然后将0~2^{32}的范围分成2^{20}份,每一份的整型数组用来统计该数组中出现数字的词频,将题目中的40亿个数字每一个除以2^{20},根据得到的商,选择对应的整型数组进入,数组的词频加1,按照这种操作对所有的数字进行统计。需要找到中位数,一共是40个数字,中位数也就是第20亿个数字,从整型数组的0位置开始统计,找到第20个数字所在的位置,在它出现的数组位置中,根据前面位置出现的词频数,找到20亿的数字所在的位置,进而找到40亿个整数的中位数。

       当然对于这个题目所用的空间仍然可以更小,使用分段统计的思想,根据题目所给的内存大小决定划分范围的份数,是题目的核心。

     实例四

       有10GB内存的文件,每一个文件中存放着一个有符号的整数,怎么样利用5GB内存所有的文件中的数字排好序输出。

       这个题目可以按照堆的知识进行求解,根据题目所给的内存确定堆中可以存放的记录的数量,使用小根堆进行记录的统计,一个记录占用内存8字节,4字节统计key,4字节统计value。小根堆建立过程中可能还会有一些内存的消耗,假设给每一条记录16字节,那么5GB内存可以存放5\times 2^{26}条记录,我们取记录为2^{27},也就是将整个范围分成2^{27}份,然后将无符号整数的范围-2^{31}~2^{31}-1,一共2^{32}个数字除以2^{27}得到2^{5},每一份就是2^{5}个数字。此时我们从最小的范围开始统计,先将最小的范围的数字从10GB文件中进行弹出,放入小根堆进行统计,得到每一个数字和它出现的词频。然后将得到的小根堆的数字从头开始弹出,此时得到的数字是排好序的,接着对后面的范围进行同样的操作,此时只使用了5GB内存将所有的数字进行了排序。

        对于这个题目还可以采用更小的内存进行操作,使用更小的内存求出可以存放的最多的记录数量,根据给定的记录的数量,使用大根堆进行操作,对给定的文件从头开始进行扫描,根据大根堆可以存放的记录的大小放入数字,当达到给定的记录以后,继续扫描的过程中,出现的数字和大根堆里面的数字进行比较,如果发现更小的数字那么弹出大根堆的堆顶元素,然后将更小的数字放进来,按照这种操作依次进行下去,依次操作完毕以后就可以将一些数字(这些数字是较小的一些数字,按照大根堆维持了次序)排好序,接着对剩余的数字按照同样的操作进行。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1247165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git永久或者限时保存用户名及密码,解决每次拉取或者提交代码时都需要手动输入验证信息

介绍 这里以我自身项目情况为例: 依据项目要求,这边使用了 TortoiseGit进行项目的统一管理,下载了 TortoiseGit克隆项目之后,每次拉取或者提交代码,都会弹出一个提示框,要求输入用户名及密码。 解决方式 单个仓库内设置,只作用于对当前仓库 在当前项目目录文件夹下,…

vue3之echarts渐变柱状图

vue3之echarts渐变柱状图 效果&#xff1a; 核心代码&#xff1a; <template><div class"abnormal"><div class"chart" ref"chartsRef"></div></div> </template><script setup> import * as echa…

【EI会议征稿】第三届电子信息技术国际学术会议(EIT 2024)

The 3rd International Conference on Electronic Information Technology 第三届电子信息技术国际学术会议&#xff08;EIT 2024&#xff09; 电子信息工程在我国信息化产业的发展过程中举足轻重&#xff0c;且随着现代社会的发展&#xff0c;航空航天领域、制造业领域和智能…

2024年度投资策略:AI大模型和半导体国产化加速

今天分享的是AI系列深度研究报告&#xff1a;《2024年度投资策略&#xff1a;AI大模型和半导体国产化加速》。 &#xff08;报告出品方&#xff1a;东方证券&#xff09; 报告共计&#xff1a;48页 前言: 行情回顾与未来展望 电子板块涨幅转正&#xff0c;信心逐渐回归。截至…

7000家门店的盈利增长,从导购的人效提升开始

管理是艺术&#xff0c;还是科学&#xff1f; 说管理是艺术&#xff0c;是因为管理面向的是人&#xff0c;而人是动态复杂的&#xff1b;说管理是科学&#xff0c;是因为我们可以研究动态的人背后的共性需求&#xff0c;并使管理的模型、策略、工具与之契合。 在绫致时装看来…

搭建Angular并引入NG-ZORRO组件库

作者&#xff1a;baekpcyyy&#x1f41f; 1.安装node.js 注&#xff1a;安装 16.0 或更高版本的 Node.js node官网&#xff1a;https://nodejs.org/en 2.进入angular官网 https://angular.cn/guide/setup-local 新建一个文件夹 vsc打开 打开终端 1.首先安装angular手脚架…

静电放电模型中的阻容参数

依据静电放电产生原因及其对集成电路放电方式的不同&#xff0c;静电放电模型可分成以下四类模型&#xff1a;1、人体放电模型(HBM, Human-Body Model)、2、机器放电模型(MM, Machine Model)、3、器件充电模型(CDM, Charged-Device Model)、4、电场感应模型(FIM, Field-Induced…

从设计上理解JDK动态代理

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 照理说&#xff0c;动态…

【Django-DRF】md笔记第6篇:Django-DRF的视图、认证、分页和其他功能详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 DR…

win10 tensorrt源码编译onnx

直接利用官方源码&#xff0c;如下图&#xff0c;trtexec源码在TensorRT安装目录下&#xff0c;双击trtexec.sln文件&#xff0c;使用vs2019打开源码工程。 如下图&#xff0c;以yolov8为例子&#xff0c;编译成功项目之后&#xff0c;设置命令行参数&#xff1a; --onnxd:/yo…

表单邮箱密码登录 原生+Jquery实现

文章目录 效果代码邮箱验证正则表达式HTMLCSS JS 效果 正确密码为&#xff1a;123456 点击登录按钮校验。 代码 表单校验 - CodeSandbox 邮箱验证正则表达式 /(?:[a-z0-9!#$%&*/?^_{|}~-](?:\.[a-z0-9!#$%&*/?^_{|}~-])*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1…

实现HTTP服务监听,快来试试springboot服务端接口公网远程调试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 二. 内网穿透2.1 安装…

AND/选品机制算法/用户表设计

3大步骤总结 大步骤总结&#xff1a; 第一大步骤&#xff1a; 生成AND算法机制所需要的8个表 AND musics Works Pool Table(音乐作品池表) 需要创建表 所需归类 AND算法池 AND videos Works Pool Table(视频作品池表) 需要创建表 所需归类 AND算法池 AND image…

基于Halcon的空间域图像滤波

任务描述&#xff1a; 图为HALCON中附带的例图“particle”。图中为某种液体&#xff0c;里面悬浮了微小颗粒&#xff0c;请分析出液体中的颗粒。 案例分析&#xff1a; 图中存在两种类型的对象&#xff1a;大的明亮物体和亮度较低的小物体&#xff08;颗粒&#xff09;。图像…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

经典的回溯算法题leetcode全排列问题思路代码详解

目录 全排列问题 leetcode46题.全排列 leetcode47题.全排列II 对回溯算法感兴趣的朋友也可以多多支持一下我的其他文章。 回溯算法详解-CSDN博客 经典的回溯算法题leetcode组合问题整理及思路代码详解-CSDN博客 经典的回溯算法题leetcode子集问题思路代码详解-CSDN博客 …

ResizeObserver loop limit exceeded报错解决方案

前言&#xff1a; 控制台没有报错&#xff0c;但是开发Vue项目过程中一直报ResizeObserver loop limit exceeded 错&#xff0c;找到以下解决方式。在main.js文件中重写 ResizeObserver 方法。 main.js文件 &#xff08;完整版&#xff09; import { createApp } from "v…

基于element自动表格

需求是根据JSON文件生成表格&#xff0c;包含配置和自动props属性以及过滤器&#xff1b; 数据示例&#xff1a; 表格设置&#xff1a; /*** 表格表头信息* chineseToPinYin: 这是封装的根据中文汉字转换为拼音的方法* prop: 表头字段名* filter: 数据过滤器* label: 表头显示…

从零学算法400

400.给你一个整数 n &#xff0c;请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;0 解释&#xff1a;第…

Windows Python3安装salt模块失败处理

复现CVE-2020-11651时候运行CVE-2020-11651的poc时候需要salt模块 在下载时出现了错误 尝试在网上寻找解决方法&#xff1a; 1.更新 setuptools 和 wheel pip install --upgrade setuptools wheel 2. 安装Microsoft Visual C 14.0 因为salt模块包包使用了 C/C 扩展&#x…