《程序员面试金典》+《算法导论》

  因为最近可能会面临一波面试,但是自己各种算法以及常见的问题的熟悉程度感觉还不够,但是由前几次的代码优化经验来看,算法优化可以说是代码优化的重中之重,算法选取恰当往往会导致运行时间呈现多个数量级的下降,一直认为算法才是人类文化的结晶。因此此周就找了一本程序员面试的书籍配合算法导论阅读。最后看了算法导论的排序与一些图算法与面试书的考题简介。


琐碎细节

  因为面试并不是单纯知识能力的体现,更是一个人综合素养的体现,面试官的印象会受到你言行举止甚至穿衣搭配的影响,前文大概就是对这些琐碎细节进行了一些交代,甚至对于合适的发邮件的时间,如何拒绝offer都进行了交代,这些还是需要注意的,花了点时间随便看了看。

技术细节

  基本上分了数组字符串处理,栈与队列,树与图,位运算,递归与动态规划进行讲解,最后还讲了一些语言方面的知识点(C,C++,JAVA),以及一些线程锁的知识。下面顺着来捋一下,顺便补充上一些算法导论上看到的知识。

1 数组与字符串

  面试书上包括链表,哈希表,普通数组,讲了一个快行指针的技巧。

  1. 算法导论上,这部分主要讲解的是字符串匹配算法,介绍了四种,最普通的,Rabin-Karp算法,利用有限自动机,最后是经典的kmp算法。应用上,此类算法可以用于提高输入法联想的响应速度包括搜索DNA序列中的特定序列衡量标准有预处理时间与匹配时间。其中KMP算法最为巧妙,将与预处理时间降低到O(m),并将实际的匹配时间控制到了O(n)。
  2. 哈希表,通过计算使得链表法散列实现的查找效率降到O(1+C),C为负载系数,使得开放查找法O(1/(1-c)),算法导论中对其进行了证明,并对如何选择合适的哈希函数提出了建议,比如除法散列法可以选择一个不接近2的整数次幂的素数作为除数,乘法散列法可以选择(sqrt(5)-1)/2产生小数部分,另外还介绍了全域散列法,并给出了一个构造方法,可惜我没学过数论,并没有看懂,也下定决心大四一定要补一些cs的基础课。实现上可以利用链表或者数组,前者更被推荐,负载系数可以大于1,通过槽位拉链处理冲突,后者负载系数已更改小于1,通过线性探测,双重散列(这里还介绍了将第二次hash仅仅产生奇数而除数为偶实现互素的小技巧)之类的方法处理冲突。

2 栈与队列

  面试书上讲了java实现队列与栈,并讲述了几道算法题目,比较有意思的是一道用一个数组实现三个栈的题目,要求三个栈是动态的即空间是动态的,想了一段时间,但是只要注意合适的搬移与压入的时候允许循环,即应当把整个数组看成前后相连的。

3 树与图

  当初学数据结构的时候就觉得这部分知识点复杂琐碎,几个树遍历的非递归算法几乎都写不出来,但是递归又总是面临爆栈的风险,借此再复习了一下。 面试书中基本就还是回顾了一些基本知识点,然后是题目,做了几道,其中一道在一棵节点数巨大的二叉树中查找子树的题目很有趣,算法思路是两个树完全相同与先序遍历与中序遍历相同等价(注意条件为树必须除根外度都为2,缺少左右孩子应该置空)否则会出现下面的情况,

  判定为相同的树,之后化为了字符串匹配问题,但是这种方法必然会占用大量的内存,因为要做遍历储存遍历结果,有时候这是难以忍受的,另一种方法是直接搜索较大的树,一旦碰到有相同的根节点则对两棵树进行匹配。

  算法导论上关于这部分就太多了,树主要讲解二叉搜索树以及其插入删除,并对其平均时间复杂度做出了证明。
更多的是关于图的讨论,图的链表表示以及邻接矩阵表示,图的两种遍历,深度优先以及广度优先。并各自对其应用做了简单介绍。

  • BFS搜索可以用来建立每个从一个节点开始到每个节点的最短路径,直觉上可以这么想,BFS是以开始节点为圆心,一圈一圈的扩展搜索的,实现上,只要牢记其中队列来保证访问的层次应该就能写出来.
  • 关于深度优先遍历,重点讲了两个时间,第一是个是第一次访问到的时间v.d,另一个是其下所有子孙访问结束后的时间d.f,其后的许多算法都基于这个时间展开。
  1. 判别节点关系,只要[v.d,v.f]这个区间与其他节点存在包含关系,则说明其中一个另一个的子孙。
  2. 进行回路检测 3 . 进行拓扑排序(有向无环图),按结束时间在链表头进行插入。
  3. 查找强连通分量。这个算法感觉十分巧妙,具体的证明花费了大量的篇章,思想上可以这么理解,首先将强连通分量塌缩成一个节点,不同的强联通分量必然只有单向边,称塌缩后的图为分量图,分量图就必然是有向无环图,之后定义塌缩点的.f与.d为强联通分量中的.f的最大值与.d的最小值,其中分量图的边与塌缩点的.f息息相关,就是边指向的塌缩点的.f一定比边发出的塌缩点.f要小,那么先遍历一遍图,那么.f最大的点一定在分量图中拓扑排序的最后一个,按.f的倒序开始DFS遍历图的转置,即G所有边转向,其必然不能跑到其他强联通分量,否则不可能为一个独立的强联通分量,以此倒退,就找到了所有的强连通分量。 最后作者提出一个问题,假如按第一次访问.f的增序直接访问图,是不是也是正确的,假如正确岂不是可以省去求图的转置的时间(一般为O(V+E)),其实不是这样的,.f与分量图的拓扑排序是一致的,但是.d不是,比如思考这样的情况,
 

  从A开始遍历,先走B,假如按上述算法,.f最小值为B,从B遍历则ABC为强连通分量,显然错误,这是因为联通分量的.f最小值1与分量图的边的走向是没有确定关系的!!!!

总结

  比较高深的图算法以及排序,动态规划还没有好好看,感觉确实是没有修过离散数学与图论,看起来有点点吃力,能看完的话会再放到一篇读书笔记里面。
  算法真的很有意思,就是有点费脑子,尤其是算法导论的证明比较晦涩,看了一周多,觉察到一个比较功利的看法,先看算法的应用,感兴趣再看实现,然后思考大体的逻辑,如果觉得很对(比如BFS做最短路径计算以及回路检测),就不必关心它的证明。,假如真的完全不理解为什么这种算法是对的(比如利用DFS找寻强连通分量),就要仔细看证明,一般顺着证明过程来就能理清其中的逻辑,还能加深理解。最后唯一不足的是时间有限没来得及写算法的实现,感觉还是要抽空写一下的。

转载于:https://www.cnblogs.com/zsl96/p/8952012.html

《程序员面试金典》+《算法导论》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. 半波对称振子方向图_第一讲 天线的方向图(下).pdf
  2. 面试了上百位性能测试后,我发现了一个令人不安的事实
  3. MySQL数据类型及后面小括号的意义
  4. centos7部署posgresql和kong总结
  5. 论文评析-Gradient Boosting Neural Networks: GrowNet,Preprint, 2021和Gradient boosting原理介绍
  6. 4号线地铁站点列表_7/4号线大连路地铁站:合租主卧家具齐全~
  7. IDM最新版软件的安装下载和使用方法
  8. distribute-list分发列表 转自 红茶三杯sina blog
  9. python for ArcGIS 绘制重庆市板块地图
  10. python改变像素点颜色_更改像素颜色Python
  11. 黑色沙漠选择服务器无响应,黑色沙漠无法连接服务器是什么原因
  12. 网盘上传文件服务器失败原因,win7系统在百度网盘上传文件一直失败的解决方法...
  13. 实验室常见的PFA制品有哪些?这些特氟龙PFA产品你认得全吗?
  14. iPhone轻松共享wifi密码给好友
  15. 微信群打卡小程序_微信打卡小程序上线,你会用吗?
  16. 第一节计算机课开场白,第一节课有趣的开场白
  17. Oracle 错误总结及问题解决 OR
  18. C语言PAT刷题 - 1027 打印沙漏
  19. unturned服务器参数修改,《Unturned》3.X.X控制台指令教程
  20. java nio io复用_java 非阻塞IO-java NIO-嗨客网

热门文章

  1. 在C#中将集合用作键
  2. c#:winform中多线程的使用
  3. 40岁的程序员还能找到工作吗_学会了Vue就能找到前端工作吗
  4. python程序异常实例_Python werkzeug.exceptions方法代码示例
  5. oracle的共享内存段,oracle共享内存段手工清理
  6. python生成json_python中如何进行json转化
  7. pytorch梯度下降函数_Pytorch学习笔记6:激活函数/单层感知机/梯度下降求最小值实例...
  8. pythonfor循环语句例子_简单的python循环知识
  9. 从0开始学习自动化测试框架cypress(一)
  10. drtek收音机使用说明_美国人拿本国收音机与中国德生PL380做对比,结果怎么样?...