Leetcode 编程训练
Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Facebook、Amazon之类的这些公司,基本上是应试教育的功利主义。
我做这些题目的不是为了要去应聘这些公司,而是为了锻炼一下自己的算法和编程能力。因为我开始工作的时候基本没有这样的训练算法和编程的网站,除了大学里的“算法和数据结构”里的好些最基础最基础的知识,基本上没有什么训练。所以,当我看到有人在做这些题的时候,我也蠢蠢欲动地想去刷一下。
于是,我花了3-4个月的业余时间,我把Leetcode的154道题全部做完了。(这也是最近我没有太多的时间来写博客的原因,你可以看到我之前做的那个活动中有几个算法题来自于Leetcode)有人说我时间太多了,这里声明一下,我基本上都是利用了晚上10点以后的时间来做这些题的。
LeetCode的题大致分成两类:
1)基础算法的知识。这些题里面有大量的算法题,解这些题都是有套路的,不是用递归(深度优先DFS,广度优先BFS),就是要用动态规划(Dynamic Programming),或是拆半查找( ...
一些有意思的算法代码
Keith Schwarz是一个斯坦福大学计算机科学系的讲师。他对编程充满了热情。他的主页上他自己正在实现各种各样的有意思的算法和数据结构,http://www.keithschwarz.com/interesting/, 目前这个网页上有88个(见下面的列表),但这位大哥要干135个,你可以看看他的To-Do List。
从这个列表上,我们可以看到,他从去年7月份就在自己实现这些东西了,我把他实现的这些算法转过来,
一方面我们可以学习一下这些算法和代码,因为很多东西对我来说都比较新,我以前列举过一些经典的算法,算法和数据结构词典,还有可视化的数据结构和算法, 不过感觉都没有这个全。
另一方面我希望这个事可以影响到一些正在学习编程的人。看看别人是怎么学习编程的,希望对你有借鉴作用。
Name
Link
Date Added
Language
Description
Binomial Heap
(link)
7‑24‑2010
C++
An implem ...
可视化的数据结构和算法
还记得之前发布过的那个关于可视化排序的文章吗?在网上又看到了一个旧金山大学David Galles做的各种可视化的数据结构和基本算法的主页,网址在这里,大家可以看看。我把这个页面的目录列在下面并翻译了一下,大家可以直接点击了。
不知道国内的教育有没有相关的教学课件,至少在我大学的时候是没有的。
目录
基础
索引
排序
堆数据结构
图 算法
动态编程
其它…
基础
Stack栈: 数组实现
Stack栈: 链表实现
Queues队列: 数组实现
Queues队列: 链表实现
Lists列表: 数组实现 ( java 版演示)
Lists列表: 链表实现 ( java 版演示)
索引
Binary Search Trees 二叉检索树
AVL Trees (平衡二叉检索树)
Red-Black Trees 红黑树 ( flash 版本演示)
Open Hash Tables 开放哈希表(Closed Addressing 链地址法)
Close ...
一些有意思的文章和资源
又到了向大家介绍一些最近我在网上发现的有价值的东西的时候了。(下面的链接中很多都被墙)
以前向大家介绍过《一些重要的算法》和《算法和数据结构词典》,不过,你知道有些什么样比较奇怪的数据结构吗?wikipedia上的这个词条可以让你看看各种不同的数据结构。比如:Skip lists, Bloom filters,或是什么Dancing links。你也许会像一个以“如何学好C++”中的朋友们所说的,不削于这种所谓的“奇技淫巧”,甚至觉得这太根本不实用。其实,这些东西还是有用的,至少对你开阔思路,活动编程思维能力很有意义。
本站的关于排序的文章有很多,对于排序算法来说,其受到要排序的个数和数据的杂乱程度的影响,我们知道比较稳定的排序算法是快速排序和归并排序,归并排序对于大量的数据排序效果是非常好的,尤其是我们可以进行并行的排序。这里有一个并行归并排序的算法的源代码,你可以参考一下 – “Parallel Merge Sort”。
说到“奇技淫巧”和算法,这里有一个文章向你展示了C语言中使用位操作可能完成的各种算法,很有意思。请参看 – “The Aggregat ...
可视化的排序过程
下面是一个日本程序员制做的一个可视化的排序过程,包括了各种经典的排序算法,你可以调整速度和需要排序的个数。酷壳以前也介绍过几篇相关的文章 一个排序算法比较的网站,一个显示排序过程的Python脚本 关于各种排序算法的运行复杂度比较,请参看Wikipedia的排序算法比较。
<br />
计算机编程简史图
这个图片太经典了,本来想翻译的,后来觉得这么经典的图片可能早已被人翻译了,简单的Google一下,果然有人翻译了。那我就把英文版和中文版都转过来吧。我们可以看到,其中很大一部分人都和Unix有着不解之缘(参见《Unix传奇上篇,Unix传奇下篇》)
英文原版
中文翻译版
什么也不说了,直接上图(图片比较大,单击图片看大图)
计算机编程简史图(英文版)
计算机编程简史图(中文版)
一些重要的算法
下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)
A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
Beam Search
束搜索(beam search) 方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k 个最好的路径,仅从这k 个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70 年代中期首先被应用于人工智能领域,1976 年Lowerre 在其称为HARPY的语音识别系 ...
算法和数据结构词典
我们知道,在编程的世界里,主要就是两个事,用一定的算法去处理一定的数据。算法可以理解为业务逻辑流程,而数据自然一定是按某种结构来存放,这就是数据结构。我们知道,数据结构的修改一定会导致算法的修改,我们也知道,数据结构直接关系到了整个程序的繁简性,高效性。而算法则是关系到数据处理的时间、空间性能,以及日后的扩展和维护。这两个东西是计算机科班出生的人或是需要学习编程的人必需要注意的两件头等大事。
下面这个网站,由 Software and Systems Division, Information Technology Laboratory 创建。
http://xlinux.nist.gov/dads/
这是一个关于算法,算法技术,数据结构,系统架构等相关问题的一个词典。其中,算法包括了一些常见的算法,比如: Ackermann’s function ,一些算法问题包括了 traveling salesman(销售员出差问题) and Byzantine generals(拜占庭将军问题),还有一些关于这些问题,算法的 实现链表 以及更多的信息。而索引页包括 领域索引 和 ...
一个显示排序过程的Python脚本
之前向大家介绍过《一个排序算法比较的网站》,那个网站用动画演示了各种排序算法,并分析了各种排序算法。这里,要向大家推荐一个Python脚本,其可以把排序的过程给显示出来。
下图是“冒泡排序”的一个示例,其中:
折线表示了各个元素的位置变化。
折线的深浅表示了元素的大小。越深则越大。
同样,还有其它一些排序算法的图片:
堆排序(Heap Sort)
选择排序(Selection)
快速排序(Quick)
Shell排序
插入排序(Insertion)
你可以使用如下的Python代码来制作这些图片:(需要 Cairo图片库支持)
Python排序脚本
这个脚本参数如下:
-a 表示使用什么样的算法,取值为"quick", "heap", "selection", "insertion", "bubble", "shell"。
-n 表示要排序的数据个数。
-f 表示输入文件。
-p 表示文件前缀。
-d 表示输出顺序。
-x 图片宽度。
-y 图片高度。
-l 所有线的宽度。
-b 边界宽度。
使用示例如下:
./visualise.py ...
一个排序算法比较的网站
下面这个网站是一个非常丰富的排序算法的网站。
Sorting Algorithm Animationshttp://www.sorting-algorithms.com/
这是一个非常不错的排序算法的网站,当你打开这个网站的时候,请不要因为看到很多个图片的大红叉而鄙视它。你先点击网页上方的Problem Size,选择一个尺寸,20,30,40还是50,都行,于是你就可以看到下面整个大表中有图片显示出来了。如下所示:
其中,
列。是代表每一个排序算法,有“插入”“选择”“冒泡”“Shell”,“合并Merge”,“堆排序”,“快速排序”,“快速3排序”。单击每个一算法的链接,你可以看到这个算法的详细解释,其中包括,算法的伪代码,算法的复杂度,相关的讨论,重点,以及该算法的相关参考文档。
行。是不同的数据样本,第一个是“随机样本”,第二个是“几乎排好序的样本”,第三个是“最差的样本(反序)”,第四个是“有一些相同项的样本”。这些样本在不同的算法上都会有不同的表现。
单元格。每个单元格都是一个图片。简单的用鼠标单击一下每个图片,可以动画地演示算法整个过程。其中两个小红箭头表示 ...