
算法系列
文章平均质量分 87
介绍各种有意思的算法,用最通俗的语言和最具可读性的代码,揭示每个算法的本质,让算法不再神秘,让每个程序员爱上算法。
王晓华-吹泡泡的小猫
20+ 软件领域从业经验,关注软件开发团队能力提升和敏捷开发,目前全职从事软件相关的培训、授课和咨询
展开
-
把《算法的乐趣》随书源码放在GitHub上了
最近发现某源代码付费的网站上还有人摆出了本书的随书代码,本来是免费发布的东西,却有人想凭这个发点小财。还有就是总有人问这书的源代码在哪里,可是书的《前言》明明就有下载的链接啊,读者可以到图灵社区下载本书的随书源码。后来我终于知道原因了,原来网上有本书的电子版下载,只是这个电子版去掉了前言部分,直接从第一章开始,很多下载这个版本的电子版的读者不知道代码的下载地址。只要你读了我的书,我就希望这书对...原创 2018-11-28 23:01:35 · 5004 阅读 · 16 评论 -
《算法的乐趣》终于出版了
经过一年多的编写和准备,《算法的乐趣》终于出版了,4月中旬开始可以在京东、当当等网店购买,实体书店上架可能会慢一点。感谢图灵社区的各位老师的辛勤耕耘,也感谢《啊哈!算法》作者纪磊先生(啊哈磊),LinkedIn高级主任分析师王益先生,极光推送首席科学家黄鑫先生(飞林沙)为本书热情作序并给予充分的肯定。序一读《算法的乐趣》的乐趣超出了我的预料。说到算法,大部分计算机专业的同学的第一反应估计是MIT出原创 2015-04-22 23:23:33 · 18984 阅读 · 34 评论 -
算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法)
二、扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。 对矢量多边形区域填充,算法核心还是求交。《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算原创 2024-10-10 16:38:47 · 1490 阅读 · 0 评论 -
算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷。我用Winamp播放音乐(AOL已经在2013年12月20日停止了Winamp的支持),最早吸引我的原因就是播放界面上那个跳动的频谱,如图(1)所示。我一直想搞清楚这个实现原理是什么,直到我知道有离散傅立叶变换这个东西存原创 2024-10-10 16:34:46 · 1012 阅读 · 0 评论 -
算法系列之二十二:离散傅立叶变换之听声音识别电话号码
利用离散傅立叶变换,将电话拨号音从时域信号转换成频域信号,然后通过频率分析找出对应的双音频频率组合,从而确定是哪个按键的拨号音原创 2013-12-09 00:43:55 · 26383 阅读 · 33 评论 -
算法系列之二十一:实验数据与曲线拟合
曲线拟合(Curve Fitting)的数学定义是指用连续曲线近似地刻画或比拟平面上一组离散点所表示的坐标之间的函数关系,是一种用解析表达式逼近离散数据的方法。曲线拟合通俗的说法就是“拉曲线”,也就是将现有数据透过数学方法来代入一条数学方程式的表示方法。科学和工程遇到的很多问题,往往只能通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,如果能够找到一个连续的函数(也就是曲线)或者更加密集的离散方程,使得实验数据与方程的曲线能够在最大程度上近似吻合,就可以根据曲线方程对数据进行数学计算,对实验结果进行原创 2013-10-16 22:17:15 · 114929 阅读 · 21 评论 -
算法系列之二十:计算中国农历(二)
(接上篇) 所谓的“天文算法”,就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄经)差为0的那一瞬间。能够计算任意时刻行星位置的一套理论就被称为星历表,比较著名的星历表有美国国家航空航天局下属的喷气推进实验室发布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞士星原创 2013-07-15 23:36:56 · 44463 阅读 · 25 评论 -
算法系列之二十:计算中国农历(一)
世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类:阳历--以天文年作为日历的主要周期,例如:中国公历(格里历)阴历--以天文月作为日历的主要周期,例如:伊斯兰历阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农历我国古人很早就开始关注天象,定昼夜交替为“日”,月轮盈亏为“月”,寒暑交替为“年”,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历原创 2013-07-01 00:18:50 · 84237 阅读 · 45 评论 -
算法系列之十九:用天文方法计算日月合朔(新月)
中国农历的朔望月是农历历法的基础,而朔望月又是严格以日月合朔发生的那一天作为月首,因此日月合朔时间的计算是制定农历历法的关键。本文将介绍ELP-2000/82月球运行理论,以及如何用ELP-2000/82月球运行理论计算日月合朔时间。 要计算日月合朔时间,首先要对日月合朔这一天文现象进行数学定义。朔望月是在地球上观察到的月相周期,平均长度约等于29.53059日,而恒星月(天文月)是原创 2012-11-25 22:56:41 · 36306 阅读 · 15 评论 -
算法系列之十八:用天文方法计算二十四节气(下)
【接上篇】 经过上述计算转换得到坐标值是理论值,或者说是天体的几何位置,但是FK5系统是一个目视系统,也就是说体现的是人眼睛观察效果(光学位置),这就需要根据地球的物理环境、大气环境等信息做进一步的修正,使其和人类从地球上观察星体的观测结果一致。 首先需要进行章动修正。章动是指地球沿自转轴的指向绕黄道极缓慢旋转过程中,由于地球上物质分布不均匀性和月球及其它行星的摄动力原创 2012-09-04 23:20:27 · 28218 阅读 · 35 评论 -
算法系列之十八:用天文方法计算二十四节气(上)
二十四节气在中国古代历法中扮演着非常重要的角色,本文将介绍二十四节气的基本知识,以及如何使用VSOP82/87行星运行理论计算二十四节气发生的准确时间。 中国古代历法都是以月亮运行规律为主,严格按照朔望月长度定义月,但是由于朔望月长度和地球回归年长度无法协调,会导致农历季节和天气的实际冷暖无法对应,因此聪明的古人将月亮运行规律和太阳运行规律相结合制定了中国农历的历法规则。在这种特殊的原创 2012-08-26 22:59:31 · 55807 阅读 · 39 评论 -
算法系列之十七:日历生成算法-中国公历(格里历)(下)
【接上篇】 上述计算星期的方法虽然步骤简单,但是每次都要计算两个日期的时间差,不是非常方便。如果能够有一个公式可以直接根据日期计算出对应的星期岂不是更好?幸运的是,这样的公式是存在的。此类公式的推导原理仍然是通过两个日期的时间差来计算星期,只是通过选择一个特殊的日期来简化公式的推导。这个所谓的特殊日期指的是某一年的12月31日这天刚好是星期日这种情况。选择这样的日子有两个好处,一个原创 2012-08-02 22:55:11 · 22497 阅读 · 19 评论 -
算法系列之十七:日历生成算法-中国公历(格里历)(上)
日历在我们的生活中扮演着十分重要的角色,上班、上学、约会都离不开日历。每年新年开始,人们都要更换新的日历,你想知道未来一年的这么多天是怎么被确定下来的吗?为什么去年的国庆节是星期五而今年的国庆节是星期三?那就来研究一下日历算法吧。本文将介绍日历的编排规则,确定某日是星期几的计算方法,以及如何在计算机上打印某一年的年历。 要研究日历算法,首先要知道日历的编排规则,也就是历法。所谓历法,原创 2012-07-15 23:08:58 · 30878 阅读 · 34 评论 -
算法系列之十六:使用穷举法解猜结果游戏
一、 引言 穷举是解决问题的一种常用思路,当对一个问题无从下手的时候,可以考虑在问题域允许的范围内将所有可能的结果穷举出来,然后根据正确结果的判断规则对这些结果逐个验证,从而找出正确的结果。采用穷举的方法求解问题的答案比较适合计算机做,对这种体力活它们没有怨言,本文就以常见的两个猜结果的题目为例,介绍一下如何通过计算机程序解决此类问题,顺便介绍一下穷举法常见的算法结构和实现方式。原创 2012-05-27 23:01:37 · 13373 阅读 · 12 评论 -
算法系列之十五:循环和递归在算法中的应用
一、递归和循环的关系1、 递归的定义 顺序执行、循环和跳转是冯·诺依曼计算机体系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世界。递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构。因为递归方法会直接或间接调用自身算法,因此是一种比迭原创 2012-05-20 23:11:36 · 20196 阅读 · 17 评论 -
算法系列之十四:狼、羊、菜和农夫过河问题
题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。 这个题目考察人的快速逻辑运算和短期记忆力。分析一下,在狼-》羊-》菜这个食物链条中,“羊”处在关键位置,解决问题的指导思想就是将“羊”与“狼”和“菜”原创 2012-05-13 22:56:56 · 118108 阅读 · 27 评论 -
算法系列之十三:椭圆的生成算法
椭圆和直线、圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图形学软件中最常见的生成算法之一。在平面解析几何中,椭圆的方程可以描述为(x – x0)2 / a2+ (y – y0)2 / b2 = 1,其中(x0, y0)是圆心坐标,a和b是椭圆的长短轴,特别的,当(x0, y0)就是坐标中心点时,椭圆方程可以简化为x2 / a2 + y2 / b2 = 1。在计算机图形学原创 2012-04-24 23:38:18 · 49263 阅读 · 8 评论 -
算法系列之十二:多边形区域填充算法--几种边标志填充算法
四、边界标志填充算法 在光栅显示平面上,多边形是封闭的,它是用某一边界色围成的一个闭合区域,填充是逐行进行的,即用扫描线逐行对多边形求交,在交点对之间填充。边界标志填充算法就是在逐行处理时,利用边界或边界颜色作为标志来进行填充的。准确地说,边界标志填充算法不是指某种具体的填充算法,而是一类利用扫描线连贯性思想的填充算法的总称。这类算法有很多种,本篇就介绍几种。 首先介绍原创 2012-04-16 22:20:51 · 30816 阅读 · 15 评论 -
算法系列之十二:多边形区域填充算法--改进的扫描线填充算法
三、改进的扫描线填充算法 扫描线填充算法的原理和实现都很简单,但是因为要同时维护“活动边表(AET)”和“新边表(NET)”,对存储空间的要求比较高。这两张表的部分内容是重复的,而且“新边表”在很多情况下都是一张稀疏表,如果能对其进行改进,避免出现两张表,就可以节省存储空间,同时省去从“边表”生成“新边表”的开销,同时也省去了用“新边表”维护“活动边表”的开销,基于这个原则可以对原始原创 2012-03-25 21:45:31 · 19996 阅读 · 6 评论 -
算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法)
二、扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。 对矢量多边形区域填充,算法核心还是求交。《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算原创 2012-03-19 14:57:34 · 92225 阅读 · 28 评论 -
算法系列之十二:多边形区域填充算法--扫描线种子填充算法
1.3扫描线种子填充算法 1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而且效率不高。为了减少算法中的递归调用,节省栈空间的使用,人们提出了很多改进算法,其中一种就是扫描线种子填充算法。扫描线种子填充算法不再采用递归的方式处理“4-联通”和“8-联通”的相邻点,而是通过沿水平扫描线填充像素段,一段一段地来处理“4-联原创 2012-03-11 23:47:04 · 53685 阅读 · 26 评论 -
算法系列之十二:多边形区域填充算法--递归种子填充算法
平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充)。区域填充中最常用的是多边形填色,本文中我们就讨论几种多边形区域填充算法。一、种子填充算法(Seed Filling) 如果要填充的区域是以图像元数据方式给出的,通常使用种子填充算法(Seed F原创 2012-03-06 00:10:00 · 68552 阅读 · 15 评论 -
算法系列之十一:圆生成算法
输入您的搜索字词 提交搜索表单 在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,原创 2012-02-12 21:45:51 · 48320 阅读 · 35 评论 -
算法系列之十:直线生成算法
在欧氏几何空间中,平面方程就是一个三元一次方程,直线就是两个非平行平面的交线,所以直线方程就是两个三元一次方程组联立。但是在平面解析几何中,直线的方程就简单的多了。平面几何中直线方程有多种形式,一般式直线方程可用于描述所有直线: Ax+By+C = 0 (A、B不同时为0) 当知道直线上一点坐标(X0,Y0)和直线的斜率K存在时,可以用点斜式方程: Y-Y0 = K(X – X0) (当K不存在原创 2012-01-08 23:41:01 · 31241 阅读 · 13 评论 -
算法系列之九:计算几何与图形学有关的几种常用算法(二)
3.6 用矢量的叉积判断直线段是否有交 矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,也是体现速度和稳定性的重要标志,高效并且稳定的求交算法是任何一个CAD软件都必需要重点关注的。求交包含两层概念,一个是判断是否相交,另一个是求出交点。直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交。 常规的代数原创 2011-12-25 23:04:39 · 25931 阅读 · 12 评论 -
算法系列之九:计算几何与图形学有关的几种常用算法(一)
我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是收获很多,特别是丢弃了多年的数学又重新回到了脑袋中,算是最大的收获吧。尽管已经毕业多年了,但是每次回顾这些算法的代码,都觉得内心十分澎湃,如果换成现在的我,恐怕再也不会有动力去做这些事情了。原创 2011-12-18 23:13:29 · 52251 阅读 · 36 评论 -
算法系列之八:RLE行程长度压缩算法
RLE(Run Length Encoding)行程长度压缩算法(也称游程长度压缩算法),是最早出现、也是最简单的无损数据压缩算法。RLE算法的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于第一种情况,对连续的重复数据块进行压缩,压缩方法就是用一个表示块数的属性加上一个数据块代表原来连续的若干块数据。对于第二种情况,RLE算法有两种处理方法,一种原创 2011-12-12 00:33:02 · 29481 阅读 · 20 评论 -
算法系列之七:爱因斯坦的思考题(下)
CheckGroupRelation()函数需要根据当前组group的位置进行适当的处理,如果当前组是第一个组或最后一个组,则group的相邻组只有一个,就是最靠近group的组,其它情况下group的相邻组都是两个。CheckGroupRelation()函数的实现如下:162 bool CheckGroupRelation(GROUP *groups, int groupIdx, ITEM_T原创 2011-12-05 22:37:38 · 10315 阅读 · 1 评论 -
算法系列之七:爱因斯坦的思考题(上)
这是一个很有趣的逻辑推理题,传说是爱因斯坦提出来的,他宣称世界上只有2%的人能解出这个题目,传说不一定属实,但是这个推理题还是很有意思的。题目是这样的,据说有五个不同颜色的房间排成一排,每个房间里分别住着一个不同国籍的人,每个人都喝一种特定品牌的饮料,抽一种特定品牌的烟,养一种宠物,没有任意两个人抽相同品牌的香烟,或喝相同品牌的饮料,或养相同的宠物,问题是谁在养鱼作为宠物?为了寻找答案,爱因斯坦给原创 2011-11-21 00:08:28 · 28675 阅读 · 29 评论 -
算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法
最长公共子序列(LCS)问题有两种方式定义子序列,一种是子序列不要求不连续,一种是子序列必须连续。上一章介绍了用两种算法解决子序列不要求连续的最终公共子序列问题,本章将介绍要求子序列必须是连续的情况下如何用算法解决最长公共子序列问题。 仍以上一章的两个字符串 “原创 2011-10-08 00:41:41 · 26956 阅读 · 10 评论 -
算法系列之五:最长公共子序列(LCS)问题(非连续子序列)的两种解法
算法系列之五:最长公共子序列(LCS)问题(非连续子序列)的两种解法 最长公共子序列也称作最长公共子串,英文缩写是LCS(Longest Common Subsequence)。其定义是:一个序列S,如果分别是两个或多个已知序列的子序列,且是符合此条件原创 2011-08-25 09:11:01 · 16824 阅读 · 3 评论 -
算法系列之四:字符串的相似度
算法系列之四:字符串的相似度 我们把两个字符串的相似度定义为:将一个字符串转换成另外一个字符串的代价(转换的方法可能不唯一),转换的代价越高则说明两个字符串的相似度越低。比如两个字符串:“SNOWY”和“SUNNY”,下面给出两种将“SNOWY”转换成“S原创 2011-07-31 23:39:20 · 27659 阅读 · 10 评论 -
算法系列之三:妖怪与和尚过河问题
有三个和尚(或传教士)和三个妖怪(或食人怪)过河,只有一条能装下两个人(和尚或妖怪)的船,在河的任何一方或者船上,如果妖怪的人数大于和尚的人数,那么和尚就会有被吃掉的危险。你能不能找出一种安全的渡河方法呢?原创 2011-07-25 00:02:21 · 22160 阅读 · 28 评论 -
算法系列之二:三只水桶等分水问题
算法系列之二: 三只水桶等分水问题 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它辅助容器。 这是一道经典题目,一般人都可以在一分钟内原创 2011-07-10 22:26:17 · 22236 阅读 · 20 评论 -
算法系列之一 :Google方程式
算法系列之一: Google方程式 有一个字符组成的等式:WWWDOT - GOOGLE = DOTCOM,每个字符代表一个0-9之间的数字,WWWDOT、GOOGLE和DOTCOM都是合法的数字,不能以0开头。请找出一组字符和数字的对应关系,使它们互相替换,并且替换后的数字能够满足等式。这个字符等式是Google公司能力倾向测试实验室的一道题目,这种题目主要考察人的逻辑推导能力和短期记原创 2011-06-07 12:04:00 · 18466 阅读 · 23 评论