当前位置: 首页 > news >正文

【数据结构】哈希应用-海量数据处理

目录

1、10亿个整数里面求最大的100个

2、求大文件交集

3、查找出现次数前210的ip地址


1、10亿个整数里面求最大的100个

经典的tok问题,可以使用堆来解决

2、求大文件交集

给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?

这里的query是查询,理解为字符串即可,所以不能使用位图

分析:假设平均每个query字符串50byte,100亿个query就是5000亿byte,约等于500G(1G 约等于 10亿多Byte)
哈希表/红⿊树等数据结构肯定是⽆能为⼒的

法一:使用布隆过滤器,⼀个⽂件中的query放进布隆过滤器,另⼀个⽂件依次查找,在的就是交集。此时在交集中的query一定能被找到,但找出来的并不一定是交集,因为存在误判
法二:使用哈希切分

⾸先内存的访问速度远⼤于硬盘,⼤⽂件放到内存搞不定,那么我们可以考虑切分为小文件,再放进内存处理

因为这一个大文件的大小大约是500G,所以可以将一个大文件切分成1000个小文件,这样就可以让小文件一个是500MB。将大文件A平均切分成A1,...,A999这1000个文件,大文件B平均切分成B1,...,B999这1000个文件,此时再将A1与大文件B切分出来的1000个文件比较,如何A2,...,A999一样,时间复杂度是O(N^2),时间复杂度太高了

此时可以使用哈希切分。

先将大文件A和B里面的query映射为整数,根据映射的值放进小文件中,每次只比较一组Ai和Bi,相同的就是交集。时间复杂度是O(N)。

此时会有一个问题,就是现在并不是平均切分,所以每个小文件的大小是不确定的,如果有某一组小文件Ai和Bi之和的大小大于1G了,要如何处理呢?此时就需要就行二次切分,将过大的这一组Ai和Bi重新映射到新的小文件中。此时可以解决大部分情况,但是假如Ai有5G,其中有4G都是同一个query,这样二次切分是解决不了的,所以我们不能用Ai和Bi之和的大小来判断是否需要二次切分,因为这里面太大可能是因为重复的query造成的,而找交集并不需要重复元素,并且哈希表和红黑树都是不允许数据冗余的。所以,我们不管Ai和Bi的和是多大,直接将其往哈希表或者红黑树中放,当哈希表或者红黑树的大小大于1G了,此时再进行二次切分,因为此时一定不是由于重复的query造成的内存太大

3、查找出现次数前10的ip地址

给⼀个超过100G⼤⼩的log file, log中存着ip地址, 设计算法找到出现次数最多的ip地址?查找出现次数前10的ip地址

本题的思路跟上题完全类似,依次读取⽂件A中ip,i = HashFunc(ip)%500,ip放进Ai号⼩⽂件(这样小文件中的就是相同的ip或冲突的ip),然后依次⽤map<string, int>对每个Ai⼩⽂件统计ip次数,同时求出现次数最多的ip或者topk ip。本质是相同的ip在哈希切分过程中,⼀定进⼊的同⼀个⼩⽂件Ai,不可能出现同⼀个ip进⼊Ai和Aj的情况,所以对Ai进⾏统计次数就是准确的ip次数
注意:这里是模500,不是一定要像上一题一样模1000,上一题是为了让一个小文件大概是500MB

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL进阶-MySQL管理
  • 【极客日常】Go语言学习干货——从零单排Golang系列合集
  • SSH服务高级配置:强制使用客户端指定的用户登录
  • django学习-数据表操作
  • Linux设置临时环境变量
  • 【vulnhub】Hack the 21LTR: Scene 1 靶机
  • C语言-函数
  • k8s—ingress应用
  • 通过提示词越狱解锁学习提示词的新姿势
  • MySQL 迁移 OceanBase 的 Oracle模式中,实现自增主键的方法
  • 【网安第一章】——信息收集
  • RCE---无字母数字webshell
  • 基于php的图书管理系统 可学习使用
  • 数字孪生平台:构建智慧未来,重塑空间智能生态的钥匙
  • Python Flask 与 Node.js Express
  • (三)从jvm层面了解线程的启动和停止
  • css系列之关于字体的事
  • Django 博客开发教程 16 - 统计文章阅读量
  • FineReport中如何实现自动滚屏效果
  • Flex布局到底解决了什么问题
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL数据库运维之数据恢复
  • node 版本过低
  • Python连接Oracle
  • Python学习笔记 字符串拼接
  • Ruby 2.x 源代码分析:扩展 概述
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 成为一名优秀的Developer的书单
  • 机器学习中为什么要做归一化normalization
  • 基于webpack 的 vue 多页架构
  • 每天10道Java面试题,跟我走,offer有!
  • 如何选择开源的机器学习框架?
  • 回归生活:清理微信公众号
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​zookeeper集群配置与启动
  • # Redis 入门到精通(七)-- redis 删除策略
  • #单片机(TB6600驱动42步进电机)
  • #知识分享#笔记#学习方法
  • $ git push -u origin master 推送到远程库出错
  • (2022 CVPR) Unbiased Teacher v2
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (function(){})()的分步解析
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (solr系列:一)使用tomcat部署solr服务
  • (八)Flink Join 连接
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (十)Flink Table API 和 SQL 基本概念
  • (四)进入MySQL 【事务】
  • (算法)N皇后问题
  • (源码分析)springsecurity认证授权
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 成都线下面基会拉开序幕