大数据题目的解题技巧

目录

大数据题目的技巧总括

实例精析

     实例一

     实例二

     实例三

大数据题目的技巧总括

(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.mzph.cn/news/154067.shtml

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

相关文章

ubuntu 安装 gparted

前提环境: 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索:

Android AIDL中使用Surface问题

1.构建ITest.aidl文件 package com.xxx.xxxx;import android.view.Surface;interface IMonitorService {boolean addSurface(in Surface surface);boolean removeSurface(in Surface surface); } 2.构建时报错 3.Surface源码分析 android.view.Surface中包含两个Surface类&am…

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式,它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能,而不需要通过子类来实现。在装饰者模式中,有一个基本对象,也称为组件,…

SpringBean的配置详解 --中

目录 Bean的初始化和销毁方法配置 Bean的初始化和销毁方法配置 扩展 Bean的实例化 Bean的初始化和销毁方法配置 当lazy-init设置为true时为延迟加载,也就是当Spring容器加载的时候,不会立即创建Bean实例,等待用到时再创建Bean实例并存储到单…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战一使用鸿蒙登录组件实现客户端登录

目录 概述使用云端一体化开发模板创建项目工程创建登录入口页面集成登录SDK组件依赖登录组件SDK使用登录组件SDK 开启“手机号码”和“邮箱地址”认证方式 概述 通过本次课程,我们将学习怎么使用云端一体化开发模板来创建云开发工程,以及如何使用鸿蒙登…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代,外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验,更通过先进的技术手段,实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法,一起揭秘数字…

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…

腾讯云标准型S5云主机性能评测_CPU内存_带宽系统盘测评

腾讯云服务器CVM标准型S5实例具有稳定的计算性能,CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽,15个月313.2元、2核4G配置748.2元15个月,CPU内存配置还可以选择4核8G、8核16G等配置,公网带宽可选1M、3M、5M或10M,腾…

基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关

文章目录 前言1. RTC概念1.1 RTC的时钟信号源1.2 预分频器1.3 实时时钟与日历数据1.4 周期性自动唤醒1.5 可编程闹钟 2. RTC相关中断3. STM32CubeMX配置3.1 时钟配置3.2 引脚配置3.3 RTC配置3.3.1 模式选择3.3.2 RTC基本参数配置3.3 中断配置 4. 代码编写总结 前言 RTC的功能有…

1.0 Zookeeper 教程

分类 Zookeeper 教程 ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&…

公网环境固定域名异地远程访问内网BUG管理系统

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

浅谈 JVM GC 收集器--系列(一)

又到一年大促时刻,今天我们一起探讨下JVM垃圾回收的问题,写代码的时候想一想如何减少FullGC问题的出现,因为一旦出现频繁FullGC,短时间内没有太好的解决办法,很有可能重启后服务接着FullGC,导致服务可用率降…

【探索嵌入式虚拟化技术与应用】— 虚拟化技术深入浅出自学系列

🌈个人主页: Aileen_0v0🔥系列专栏:【探索嵌入式虚拟化技术与应用】💫个人格言:"没有罗马,那就自己创造罗马~" 目录 一、虚拟技术的发展历史 1.1传统技术的局限性: ​编辑 1.2云计算和万物互联技术的发展机遇&#x…

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进,城市道路安全问题日益凸显。市政井盖作为城市道路的一部分,承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施,补足传统管理方式的…

小型机加工工厂MES系统选型指南

随着制造业的不断发展,越来越多的企业开始关注生产过程的管理和优化。对于小型机加工工厂来说,选择一款合适的MES系统(制造执行系统)能够显著提高生产效率、降低成本、优化资源利用,从而在激烈的市场竞争中脱颖而出。 …

创建域名邮箱邮件地址的方法与步骤

如何创建域名邮箱邮件地址?使用Zoho Mail创建域名邮箱邮件地址的步骤简单易懂,操作便捷。从其他邮箱迁移到Zoho Mail的过程也相当顺畅,您可以轻松为所有员工创建具有企业邮箱域名的电子邮件地址。 步骤1:添加并验证您的域名 首先&#xff0c…

rook-ceph部署

rook是云原生存储编排器,本身不提供存储。 下载 git clone --single-branch --branch v1.11.4 https://github.com/rook/rook.git cd rook/deploy/examples 修改镜像地址images.txt operator方式部署rook kubectl apply -f crds.yaml -f common.yaml -f operator…

【计算机网络学习之路】网络基础1

文章目录 前言一. 计算机网络发展局域网和广域网 二. 网络协议三. OSI七层模型四. TCP/IP四层(五层)模型五. 计算机体系结构与网络协议栈六. 协议形式及局域网通信数据包封装与分用 七. 跨网络通信八. MAC地址与网络通信的理解结束语 前言 本系列文章是…

人工智能带来的各方面影响

近年来,人工智能(AI)技术在各个领域中的应用越来越广泛,已经开始对我们的生活方式、社会和经济结构产生深远的影响。 1.人工智能家庭化。人工智能技术使我们的生活变得更加便利和智能化。在家庭日常中,智能家居、智能…

什么是深度学习

一、深度学习的发展历程 1.1 Turing Testing (图灵测试) 图灵测试是人工智能是否真正能够成功的一个标准,“计算机科学之父”、“人工智能之父”英国数学家图灵在1950年的论文《机器会思考吗》中提出了图灵测试的概念。即把一个人和一台计算机分别放在两个隔离的房…