测试算法阶段学习成果
针对入门的趣味书
《大话数据结构》
《算法图解》
针对Python的是《数据结构与算法:Python语言描述》
清华 邓俊辉 《数据结构(C++语言版) 第三版》
面试必刷的宝典
《剑指offer》
《编程珠玑》
《编程之美》
殿堂级经典书
《计算机程序设计艺术》
代码GITHUB地址为:< https://github.com/wangzheng0822/algo >
实战测试题(一):
假设猎聘网有10W名猎头顾问,每个猎头顾问都可以通过做任务(比如发布职位)来积累积分,然后通过积分来下载简历,如果你是猎聘网的一名工程师,如何在内存中存储这10W名猎头ID和积分信息,让他支持几个操作:
- 根据猎头的ID快速查找、删除、更新这个猎头的积分信息
- 查找积分在某个区间的猎头ID列表
- 查找积分从小到大排在第X位的猎头ID信息
- 查找按照积分从小到大排在第X位到第y位之间的猎头ID信息
相关章节:跳表、散列表、红黑树
解析:
要通过ID来查询,又要通过积分来查询,所以对于猎头这样一个对象,需要将其组织成两种数据结构,才能支持两类操作,按照ID,将猎头信息组织成散列表,这样就可以根据ID信息快速的查找、删除、更新猎头的信息,按照积分将猎头信息组织成跳表,再将跳表的每个索引结点中加入一个span字段,记录这个索引结点到下一个索引结点的包含的链表结点的个数,这样就可以利用跳表索引,快速计算出排名在某一位的猎头或者排名在某个区间的猎头列表。或者可以直接利用Redis的有序集合完成
实战测试题(二)
电商交易系统中,订单数据很大,假设分了10个库并存储在不同的机器上,在不引入复杂分库分表中间件的情况下,希望能够快速的查询金额最大的前K个订单
- 数据库中,订单表中金额字段上建有索引,可以通过select order by limit语句获取数据库中数据
- 机器可用内存有限,只有几百M剩余可用内存
相关章节
排序、堆和堆排序、堆的应用
题目解析
借助归并排序中的合并函数,从每个数据库中,通过select order by limit语句各取局部金额最大的订单,把取出来的10个订单放到优先级队列中取出最大值,就是全局金额最大的订单,然后再从这个全局金额最大的订单对应的数据库中,取出下一条订单(订单金额从大到小排序)然后放入优先级队列中,直到找到金额前K个大订单
数据库读取数据的性能是效率不高的问题,尽量减少SQL请求,每次多取一些数据,一次性不能取太多数据也不能太少数据,根据实际的硬件环境做benchmark测试找合适的
实战测试题(三)
CPU资源是有限的,任务的处理速度与线程个数并不是线性正相关,相反,过多的线程反而会导致CPU频繁切换,性能下降,线程池的大小需要综合考虑要处理任务的特点和硬件环境事先设置的,当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源,这时线程池如何处理请求?拒绝请求还是排队请求?
相关章节:队列:队列在线程池等有限资源池中的应用
题目解析
队列可以用在任何有限资源池中,用于排队请求,比如数据库连接池中,大部分资源有限的场景,没有空闲资源时候,都可以通过队列来实现请求排队
实战测试题(四)
通过IP地址来查找IP归属地,在内存中有12W条这样的IP区间与归属地的对应关系,如何快速定位IP地址的归属地?
相关章节:
二分查找
题目解析:
需要用到二分查找的变形算法,查找最后一个小于等于某个给定值的数据
实战测试题(五)
设计一个简单的海量图片存储系统,最大预期能够存储1亿张图片,并希望这个海量图片存储具有
- 存一张图片及其它的元信息,主要的元信息有:图片名称和一组tag信息,比如图片名称叫玫瑰花,tag信息是{红色,花,情人节}
- 根据关键词搜索一张图片,比如关键词是“情人节”“花”“玫瑰花”
- 避免重复插入相同的图片,不能单纯的使用图片的元信息,来对比是不是同一张图片
设计一个符合上面要求,操作高效,使用机器资源少的存储系统
相关章节:
哈希算法
题目解析:
两个功能,一是根据元信息的搜索功能,二是图片判重
第一部分,借助搜索引擎中的倒排索引结构 , 一个图片对应一组元信息,比如玫瑰花对应{红色,花,情人节},牡丹花对应{白色,花},将这个图片与元信息之间的关系,倒置过来建立索引,“花”对应{玫瑰花,牡丹花},“红色”对应{玫瑰花},“白色”对应{牡丹花},“情人节”对应{玫瑰花},当搜索“情人节 花”的时候拿两个搜索关键词分别在倒排索引中查找,“花”找到了{玫瑰花 牡丹花},“情人节”查找到了{玫瑰花},两个关键词对应的 结果取交集就是结果,第二部分关于图片判重,基于图片本身来判重,可以用哈希算法,对图片内容取哈希值,对哈希值建立散列表,通过哈希值以及散列表快速判断图片是否存在
实战测试题(六) ***
散列表的查询效率跟散列函数、装载因子、散列冲突有关系,如果散列表中有10W个数据,退化后的散列表查询的效率下降了10W倍,如果之前运行100次查询只需要0.1S,现在需要1W秒,可能因为查询操作消耗大量CPU或者线程资源导致系统无法响应其他请求,从而达到拒绝服务攻击(DoS)的目的,这是散列表碰撞攻击的基本原理
如何设计一个可以应对各种异常情况的工业级散列表,来避免在散列冲突的情况下,散列表性能的急剧下降,并能抵抗散列膨胀攻击?
相关章节:
散列表
题目解析:
散列表是最常用的数据结构
初学者:
- 自行分析专栏中大部分数据结构和算法时间、空间复杂度
- 自己实现动态数组、栈、队列
- 轻松写出经典链表题目代码,比如链表反转、求中间节点等 ***
- 轻松写出斐波那契、求阶乘、归并、快排、二叉树遍历、求高度、八皇后、背包、DFS递归代码
- 写各种排序算法、二分查找及其变体
- 实现一个拉链发解决冲突的散列表
- 实现二叉树的三种遍历算法、按层遍历、求高度 ***
- 实现堆、堆排序、掌握堆的三种应用(优先级队列、TOP k、中位数)
- 图的三种表示方法(邻接矩阵、邻接表、逆邻接表)
- 实现广度优先、深度优先搜索算法
- 实现BF算法、RK算法
- 实现一个位图结构
- 贪心、分治、回溯、动态规划,实现Leetcode Medium难度的题目
列、TOP k、中位数)
- 图的三种表示方法(邻接矩阵、邻接表、逆邻接表)
- 实现广度优先、深度优先搜索算法
- 实现BF算法、RK算法
- 实现一个位图结构
- 贪心、分治、回溯、动态规划,实现Leetcode Medium难度的题目