【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?
面试遇到的算法思想题,没有敲代码,只是整理并在头脑风暴后,重新叙述自己的思路。
文章目录
- 问题
- 暴力法思路
- 暴力延续(哈希思想)
- 分治思想
- 并行思想(后话)
问题
存在A,B文件内各包含1000G的URL,A文件内部的URL不重复,B文件内部的URL也不重复。内存3G,问如何找到A,B文件内相同的URL?
接着面试官在代码区直接敲出了几个例子:
A:
http://asdaasd.asdasd.asd
http://asdasdczxc.zxczxc/zxczxc
......
B:
http://asdasd.com/axzczxczxc/zxczxc
http://asdaasd.asdasd.asd (找出的URL中包含这个)
问题可以抽象为:两个超大的字符串数组,找出所有相同的字符串。
(小声BB:绝对不能像我一样先傻傻地说能不能把http协议部分给压缩了…)
暴力法思路
取一个A文件内的URL,一段一段(不超内存)地遍历B文件内的URL,判断是否相同。
显然这种思路 太慢了,一次只能遍历一个字符串,而且完全忽略了题目大容量的条件。时间复杂度是O(n2)
(小声BB:然鹅这种思路就是我当时说的…)
暴力延续(哈希思想)
延续暴力法的思想:暴力法中,我们每次仅拿到一条A文件中的URL,就去遍历一趟B文件。这种感觉像什么?
平行时空A中,某年级的学生有1000名(磁盘文件),每人多1枝铅笔,在另外一个平行时空B中,该年级对应的1000名同名学生中刚好每个人少了一枝铅笔。
已知有个时空穿梭者(内存)可以帮忙送笔,由于人数太多了,他不能一次性拿完1000枝笔送过去。这时候,他每次从A时空拿1枝铅笔,然后千里迢迢地去B时空,找到并送给那名同名学生铅笔。
不难看出来,他要来回穿梭1000 * 1000 = 1000 000 趟
So?
(虽然两只手拿的少,为什么不一次性拿多几枝笔一起送呢?)
(虽然内存小了点,为什么不一次性多捎几个URL一起比较呢?)
此时聪明的时空穿梭者想到了拿个箱子装10枝铅笔,只需要每枝铅笔记录一下是谁的。
即每枝铅笔对应一个姓名,每个URL对应一个hash值。
通过哈希集合hashset来存储一部分的A文件中的URL,在遍历B时只需判断该哈希集合是否已存在原本的URL即可。由于使用了hashset,故每次可以通过O(1)的时间复杂度就可以判断哈希集合内携带的一部分的URL。
不难看出来,由于1次取10枝铅笔,在时空A取100次铅笔就OK了,他只需要来回穿梭100 * 1000 = 100 000 趟
分治思想
上面的暴力延续只是一个常数级别的优化,但是已经有一种充分利用内存并使用哈希的思想了。
每次在B时空找对应的人,时空穿梭者累了。
“为什么拿几枝笔就要在B时空年级的全部学生中送笔呢?”
“他们怎么没有班级呢?!”
“我只需要在这个班上拿笔了,就去对应的班级找人就好了!”
于是乎,他去找了对应时空的校长,要求按姓名进行分班。比如李同学就分到李班,王同学就分到王班。
这样A时空的某个人分到了张班,那么对应的B时空的人肯定也分到了张班。
当然,文件AB可没有班级之分,我们需要拆分这两个大文件成一个个对应小文件。A文件分离出a1,a2,a3,a4…B文件分离出b1,b2,b3,b4…
我们拆分的要求是:如果B文件中b2中存在一个和A同名的URL,那么必定在小文件a2中,如果在a2里面找不到,那么就必不和A同名。
方法:假设我们分成n个小文件
对于文件A内所有的 URL 求 Hash( A-URL ) % n ,根据计算结果把遍历到的 URL 存储到 a0, a1, a2, …, an-1。使用同样的方法遍历文件 B 中的 URL,分别存储到文件 b0, b1, b2, …, bn-1 中。这样处理过后,所有可能相同的 URL 都在对应的小文件中,即 a0 对应 b0, …, an-1 对应 bn-1,不对应的小文件不可能有相同的 URL。
接着遍历拆分后的每一个小文件ai,把这个小文件的所有URL 存储到一个 HashSet 集合中。然后遍历 bi 中每个 URL,看在 HashSet 集合中是否存在,如果是共同的 URL则必定存在,可以把这个 URL 保存到一个单独的文件中。
这里有一个小问题:我们怎么确保拆分后的小文件内的所有URL都能装在内存里的HashSet呢?
这就需要我们根据题目的要求进行调整拆分的文件数量n。只需要保证拆分后的每一个小文件大小容量不超过内存的容量就行。本题中,需要满足:
1000G总文件容量 / n个小文件 < 3G内存容量
即n > 334 个文件。确保每个小文件容量小于3G。这样便于让HashSet一次性存储一个A文件的所有URL。
自此,时空穿梭者 一次性带着一个班级的铅笔,去找对应班级的人分发铅笔。
最后的思维导图
并行思想(后话)
(小声BB:最近学的并行计算,可惜了回顾的时候才想起来。)
时空乱流,B时空另外一个年级的学生铅笔又传到A时空对应年级的学生那里了。
“总不能每次都让我一个人去送铅笔吧?”
“让他们自己去找自己就好了吧~”
时空穿梭者教会了A年级所有的学生时空穿梭,让每个班的学生去找B时空的对应班级的自己。
为了提高效率,在划分完了小文件后,就可以创多个线程并行去寻找对应文件是否存在URL。
当然,这里的内存本来就限定死了,那就把几个文件发给别的服务器,让别的服务器帮忙跑下。
【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?相关推荐
- 查找计算机里包含相关文字,win10系统搜索文件中包含的文字来找到该文件的详细方案...
win10系统使用久了,好多网友反馈说关于对win10系统搜索文件中包含的文字来找到该文件设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统搜索文件中包含的文字来找到该文件进行设 ...
- 经典五大算法思想-------入门浅析
算法:求解具体问题的步骤描述,代码上表现出来是解决特定问题的一组有限的指令序列. 1.分治: 算法思想:规模为n的原问题的解无法直接求出,进行问题规模缩减,划分子问题(这里子问题相互独立而且和原问题解 ...
- 服务器日志文件中包含堆栈跟踪,日志框架 Logback 官方手册(第三章:Configuration)...
以下内容翻译整理自logback官方手册,地址:logback官方手册 logback 配置 将日志请求插入应用程序代码需要相当多的计划和工作.观察表明,大约有4%的代码用于日志记录.因此,即使是一个 ...
- hdoop面试题6 后面的面试题各公司面试题,算法数据结构相关面试题 后面没看 阿善有用...
1.列出安装hadoop流程步骤 a) 创建hadoop账号 b) 更改ip c) 安装java 更改/etc/profile 配置环境变量 d) 修改host文件域名 e) 安装ssh 配置无密码登 ...
- leetcode中关于使用二分查找算法思想deal的题型
学习了二分查找的算法思想之后,再leetcode上写了一道常见的简单面试题,现在用博客记录一下我学习刷题的笔记! leetcode 题号69:Sqrt(x)(经典的面试题) 给你一个非负整数 x ,计 ...
- 算法思想 - 搜索算法
本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS. 搜索相关题目 深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此. BFS 广度优先搜索的搜索过程有点像一层一层地进行 ...
- JAVA工程师常用算法_算法工程师必须要知道的8种常用算法思想
算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 1.1 ...
- Algorithms_算法思想_递归分治
文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...
- 深度增强学习前沿算法思想
作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究. 责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...
最新文章
- java创建对象的5种方法
- 清空计算机网络缓存,【缓存清理工具】缓存清理软件_电脑缓存清理软件【最新】-太平洋电脑网...
- vue数组刷新_Vue中数组更新后,页面没有动态刷新问题
- final关键字_Java面试-谈谈对final关键字的理解
- 全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)
- mysql 5.6.32 linux_centos7 下手动安装MySQL-5.6.32-1.linux_glibc2.5.x86_64.rpm-bundle
- java spring 多数据源_Spring多数据源解决方案
- 每天一个linux命令:du 与 df
- [NLP]自然语言的处理步骤
- 开源 YDB 数据库
- 实战CSS:模拟登录注册静态实现
- windows命令行包管理工具 -Scoop
- yolov2-coco数据集网络架构
- bum报文_数据中心VxLAN技术概念和原理解读
- WPS如何去除分割线
- git报用户名和密码错误
- Linux 服务器后台运行.jar程序
- 黑盒测试和白盒测试的基本原理/区别是什么?
- 新加坡区块链ICO公司是如何注册新加坡公司的
- android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!
热门文章
- 如何防止跨站点脚本攻击
- 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例
- 苹果icloud邮箱抓取
- nmap学习之路--测试版
- python跳台阶_递推典型算法:猴子爬山,跳台阶,爬楼梯(牛客网)、魔法深渊(快手)----Python、Java...
- python怎么定义一个变量自增_Python语言中的自增运算
- Python3:pygame模块的简单的使用(加载图片并让图片动起来)
- 推荐一个VS2010下的智能联想插件,比IntellSense更给力! http://bbs.itheima.com/thread-53922-1-1.html (出处: 黑马程序员IT技术论坛)
- Scrapy爬取伯乐在线的所有文章
- RabbitMQ基础篇