飞污熊博客

静下心来做一件事

排序算法中最快的是快速排序算法,搜索算法中最快的是二分搜索算法。我也最喜欢这2 个算法。 因为它们是使用递归实现的,代码简洁清晰,效率又非常高。

根据我的理解,算法的本质就是数学。根据输入和设定的目标,采用有限的步骤实现输出。 通常,使用计算机实现的算法,都会用到循环,这样才能发挥计算机高速运算的优势。

循环和递归是等效的,这已经被科学家所证明。数学上没有循环,只有递归的概念,因此使用递归代替循环表示算法有很多好处:

  1. 递归的代码要比循环简洁很多,也优雅很多。
  2. 递归的代码可以用数学方式建模,可以从数学角度验证其正确性。

很多函数式语言甚至没有循环的概念和关键字,强迫你使用递归来实现循环。如,ErLang 。 递归也有一些缺点,递归使用栈来保存函数地址和参数、返回值,而栈是有一定大小的, 过多的递归调用可能会造成栈溢出。但是,递归算法会容易转变为循环。我更欣赏递归的简洁, 除非真的出现栈溢出的问题,我是不会使用循环的。

阅读全文 »

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解 — 摘自八皇后问题wiki

阅读全文 »

我们将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。

规则集包含两部分:计算从指定位置开始的所有合法移动,以及每次移动的结果位置。

下面先给出表示谜题的抽象类,其中的类型参数P和M表示位置类和移动类。根据这个接口, 我们可以写一个简单的串行求解程序,该程序将在谜题空间Puzzle Space中查找, 直到找到一个解答或者找遍了整个空间都没有发现答案。注:一个移动M代表一步。

1
2
3
4
5
6
7
8
9
10
/** 表示 搬箱子 之类谜题的抽象类*/
public interface Puzzle<P, M> {
P initialPosition();

boolean isGoal(P position);

Set<M> legalMoves(P position);

P move(P position, M move);
}
阅读全文 »

Markdown 是一种轻量级标记语言。它允许人们”使用易读易写的纯文本格式编写文档, 然后转换成有效的XHTML(或者HTML)文档”。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。

个人在平时非常喜欢用markdown写文档,完全就是程序员的福音,因为几个非常简单的语法就能实现漂亮的文字排版。 另外各种工具和网址对于它的支持也是非常好,github博客就是用markdown写的。 还可以利用版本管理,非常方便的管理写过的文章,这篇文章总结一下它的用法。

阅读全文 »