经典算法集合帖–2008-02-16

翻了翻自己的Blog,发现发的文章已经不少了,不过还真是应验了About页面上最初的说法,什么东西都往这上面扔……看到这里的订阅人数也已经超过120了,在这里表示一下感谢!感谢各位可以忍受我的杂乱无章……

之前发了一些关于算法的文章,虽然作了一个分类,不过翻起来还是不是很方便,所以做一个集合,希望可以给阅读的朋友们带来一些方便吧。

Continue reading “经典算法集合帖–2008-02-16”

二分搜索算法(折半查找)原理以及递归(recuition),迭代(iteration)的两种实现源代码

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。

【基本思想】

将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。

Continue reading “二分搜索算法(折半查找)原理以及递归(recuition),迭代(iteration)的两种实现源代码”

蚁群算法ACO(ant colony optimization)的原理以及实现源代码

Ant-icon 之前说的算法基本上都比较枯燥的(废话,算法都很枯燥……),这次要介绍的蚁群算法(Ant Colony Algorithm)却是一种源于自然现象的算法,也是一种 meta heuristic,即与具体问题关系不大的优化算法,也就是它是一种用来在图中寻找优化路径的机率型技术。Marco Dorigo于1992年在他的博士论文中引入,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。

Continue reading “蚁群算法ACO(ant colony optimization)的原理以及实现源代码”

四种常用排序方法的基本思想和PHP实现源代码

Shutdown-48x48 插入排序(Insertion Sort),选择排序(Selection Sort),冒泡排序和快速排序是我们经常会用到的排序算法。下面是这几种算法的基本思想和相对应的PHP实现代码。

Continue reading “四种常用排序方法的基本思想和PHP实现源代码”

汉诺塔算法的递归与非递归的C以及C++源代码

brontosaurus-48x48 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说。

开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。计算结果非常恐怖(移动圆片的次数)18446744073709551615,众僧们即便是耗尽毕生精力也不可能完成金片的移动了。

Continue reading “汉诺塔算法的递归与非递归的C以及C++源代码”

DES加密标准的说明以及加密/解密函数的实现源代码

BigEyes-Creature-48x48下面是来自维基的关于DES的说明: 数据加密标准( DES )是一种加密演算法(一种加密信息的方法), 1976年被美国联邦政府的联邦信息处理标准(FIPS)所选中,随后既在国际上广泛流传开来。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。

Continue reading “DES加密标准的说明以及加密/解密函数的实现源代码”

Stein算法的简单描述以及C++/Java的三种实现源代码

blue-creature-48x48欧几里德算法的简单描述以及C++与Java的各自实现代码中介绍的欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。
一般实际应用中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过 64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算 128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。

Continue reading “Stein算法的简单描述以及C++/Java的三种实现源代码”

欧几里德算法的简单描述以及C++与Java的各自实现(源代码)

I-Love-Autumn-48x48 欧几里德算法描述:
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有d|a, d|b,而r = a – kb,因此d|r ,因此d是(b,a mod b)的公约数
假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r ,因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

Continue reading “欧几里德算法的简单描述以及C++与Java的各自实现(源代码)”

约瑟夫环问题(Josephus)的两种解法(源代码)

Urban-MSN-1-icon 算法描述: 有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始, 如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。下面给出两种解法,前面的是比较常规的解法,比较适合“名门正派”,而后面一种则非常巧妙……

Continue reading “约瑟夫环问题(Josephus)的两种解法(源代码)”

几种经典的Hash算法的实现(源代码)

System-Calc-48x48 哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。

Continue reading “几种经典的Hash算法的实现(源代码)”