今天给大家带来了一本算法方向的好书:巴尔加瓦(Aditya Bhargava)老师 著,袁国忠老师译的 《算法图解:像小说一样有趣的算法入门书》,网上有没有开源版本我不知道,我就看他内容不错所以推荐给大家!小编会在文末附电子版免费下载方式。
Aditya Bhargava是谁?
软件工程师,兼具计算机科学和美术方面的教育背景,在adit.io撰写编程方面的博客
《算法图解:像小说一样有趣的算法入门书》
全书400多张示意图,生动呈现算法执行过程,展示不同算法在性能方面的优缺点
本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量。书中的前三章将帮助你打下基础,带你学习二分查找、大O表示法、两种基本的数据结构以及递归等。余下的篇幅将主要介绍应用广泛的算法,具体内容包括:面对具体问题时的解决技巧,比如,何时采用贪婪算法或动态规划;散列表的应用;图算法;Kzui近邻算法。
先看目录
再看内容
编辑切换为居中
添加图片注释,不超过 140 字(可选)
文章展示到这里就结束了,相信可以看出基本内容了吧! 如果你想获取学习或者收藏吃灰,可以关注我的公众号:Java收藏夹
防止重复
假设你负责管理一个投票站。显然,每人只能投一票,但如何避免重复投票呢?有人来投票时,你询问他的全名,并将其与已投票者名单进行比对。
如果名字在名单中,就说明这个人投过票了,因此将他拒之门外!否则,就将他的姓名加入到名单中,并让他投票。现在假设有很多人来投过了票,因此名单非常长。
每次有人来投票时,你都得浏览这个长长的名单,以确定他是否投过票。但有一种更好的办法,那就是使用散列表!
为此,首先创建一个散列表,用于记录已投票的人。
>>> voted = {}
>>> value = voted.get("tom")
如果“tom”在散列表中,函数get将返回它;否则返回None。你可使用这个函数检查来投票的人是否投过票!
代码如下
voted = {}
def check_voter(name):
if voted.get(name):
print "kick them out!"
else:
voted[name] = True
print "let them vote!"
我们来测试几次。
>>> check_voter("tom")
let them vote!
>>> check_voter("mike")
let them vote!
>>> check_voter("mike")
kick them out!
首先来投票的是Tom,上述代码打印let them vote!。接着Mike来投票,打印的也是let them vote!
然后,Mike又来投票,于是打印的就是kick them out!。
别忘了,如果你将已投票者的姓名存储在列表中,这个函数的速度终将变得非常慢,因为它必须使用简单查找搜索整个列表。但这里将它们存储在了散列表中,而散列表让你能够迅速知道来投票的人是否投过票。使用散列表来检查是否重复,速度非常快。