面试遇到的算法思想题,没有敲代码,只是整理并在头脑风暴后,重新叙述自己的思路。

文章目录

  • 问题
    • 暴力法思路
    • 暴力延续(哈希思想)
    • 分治思想
  • 并行思想(后话)

问题

存在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?相关推荐

  1. 查找计算机里包含相关文字,win10系统搜索文件中包含的文字来找到该文件的详细方案...

    win10系统使用久了,好多网友反馈说关于对win10系统搜索文件中包含的文字来找到该文件设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统搜索文件中包含的文字来找到该文件进行设 ...

  2. 经典五大算法思想-------入门浅析

    算法:求解具体问题的步骤描述,代码上表现出来是解决特定问题的一组有限的指令序列. 1.分治: 算法思想:规模为n的原问题的解无法直接求出,进行问题规模缩减,划分子问题(这里子问题相互独立而且和原问题解 ...

  3. 服务器日志文件中包含堆栈跟踪,日志框架 Logback 官方手册(第三章:Configuration)...

    以下内容翻译整理自logback官方手册,地址:logback官方手册 logback 配置 将日志请求插入应用程序代码需要相当多的计划和工作.观察表明,大约有4%的代码用于日志记录.因此,即使是一个 ...

  4. hdoop面试题6 后面的面试题各公司面试题,算法数据结构相关面试题 后面没看 阿善有用...

    1.列出安装hadoop流程步骤 a) 创建hadoop账号 b) 更改ip c) 安装java 更改/etc/profile 配置环境变量 d) 修改host文件域名 e) 安装ssh 配置无密码登 ...

  5. leetcode中关于使用二分查找算法思想deal的题型

    学习了二分查找的算法思想之后,再leetcode上写了一道常见的简单面试题,现在用博客记录一下我学习刷题的笔记! leetcode 题号69:Sqrt(x)(经典的面试题) 给你一个非负整数 x ,计 ...

  6. 算法思想 - 搜索算法

    本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS. 搜索相关题目 深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此. BFS 广度优先搜索的搜索过程有点像一层一层地进行 ...

  7. JAVA工程师常用算法_算法工程师必须要知道的8种常用算法思想

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 1.1 ...

  8. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  9. 深度增强学习前沿算法思想

    作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究.  责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...

最新文章

  1. java创建对象的5种方法
  2. 清空计算机网络缓存,【缓存清理工具】缓存清理软件_电脑缓存清理软件【最新】-太平洋电脑网...
  3. vue数组刷新_Vue中数组更新后,页面没有动态刷新问题
  4. final关键字_Java面试-谈谈对final关键字的理解
  5. 全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)
  6. mysql 5.6.32 linux_centos7 下手动安装MySQL-5.6.32-1.linux_glibc2.5.x86_64.rpm-bundle
  7. java spring 多数据源_Spring多数据源解决方案
  8. 每天一个linux命令:du 与 df
  9. [NLP]自然语言的处理步骤
  10. 开源 YDB 数据库
  11. 实战CSS:模拟登录注册静态实现
  12. windows命令行包管理工具 -Scoop
  13. yolov2-coco数据集网络架构
  14. bum报文_数据中心VxLAN技术概念和原理解读
  15. WPS如何去除分割线
  16. git报用户名和密码错误
  17. Linux 服务器后台运行.jar程序
  18. 黑盒测试和白盒测试的基本原理/区别是什么?
  19. 新加坡区块链ICO公司是如何注册新加坡公司的
  20. android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!

热门文章

  1. 如何防止跨站点脚本攻击
  2. 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例
  3. 苹果icloud邮箱抓取
  4. nmap学习之路--测试版
  5. python跳台阶_递推典型算法:猴子爬山,跳台阶,爬楼梯(牛客网)、魔法深渊(快手)----Python、Java...
  6. python怎么定义一个变量自增_Python语言中的自增运算
  7. Python3:pygame模块的简单的使用(加载图片并让图片动起来)
  8. 推荐一个VS2010下的智能联想插件,比IntellSense更给力! http://bbs.itheima.com/thread-53922-1-1.html (出处: 黑马程序员IT技术论坛)
  9. Scrapy爬取伯乐在线的所有文章
  10. RabbitMQ基础篇