【经典算法学习】
且心
编程之里,编程之外O_O
展开
-
大数运算(超长整数运算)算法的简单分析
也就是大数(超长整数)的四则运算。啥也不说,直接上代码吧,重点是注释,有不对的还请多多指正!O(∩_∩)O~#define N 8//最大位数void add(int*, int*, int*);//加法void subtract(int*, int*, int*);//减法void multiply(int*, int, int*);//乘法void divide(int*,原创 2013-12-13 17:24:49 · 1958 阅读 · 0 评论 -
约瑟夫问题(Josephus Problem)算法分析及代码
约瑟夫问题简介据说着名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Joseph原创 2013-12-24 10:17:02 · 6319 阅读 · 0 评论 -
排列算法分析及实现(C/OC)
排列简介一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Sequence,Arrangement, Permutation)。根据排列的定义,两个排列相同,当且仅当两个排列的元素完全相同,且元素的排列顺序也相同。例如,abc与abd的元素不完全相同,它们是不同的排列;又如abc与acb,虽然元素完全相同,但元素的排列顺序不同,原创 2013-12-24 13:58:24 · 1502 阅读 · 0 评论 -
格雷码生成算法分析及实现(C/OC)
格雷码简介 Gray Code是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数好了,任两个数之间只有一个位元值不同,例如以下为3位元的Gray Code:000001 011 010 110 111 101 100由定义可以知道,GrayCode的顺序并不是唯一的,例如将上面的数列反过来写,也是一组Gray Code:100101 111 110 010 011原创 2013-12-24 16:21:50 · 2246 阅读 · 0 评论 -
求m个元素集合中n个元素的所有子集(C/OC)
算法分析假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些? 假设有5个元素的集点,取出3个元素的可能子集如下:{1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5}这些子集已经使用字典顺序排列,如此才可以观察出一些规则:如果最右一原创 2013-12-25 15:16:52 · 5624 阅读 · 0 评论 -
集合所有子集,无字典顺序与有字典顺序的两种解法(C/OC)
简介 给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。以下分别为无字典顺序和有字典顺序两种算法分析及代码实现,仅供参考。无字典顺序算法分析 如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置原创 2013-12-25 14:11:35 · 2575 阅读 · 1 评论 -
数字拆解算法分析及实现(C/OC)
数字拆解简介 这个题目来自于数字拆解,我将之改为C语言的版本,并加上说明。题目是这样的:3 = 2+1 = 1+1+1 所以3有三种拆法4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1原创 2013-12-26 10:16:35 · 3630 阅读 · 0 评论 -
基于堆积树的选择排序(Heap排序法)
Heap排序法算法分析选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快,Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,因而称之为改良的选择排序法。Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是一个二元树,也原创 2013-12-27 11:11:39 · 3229 阅读 · 0 评论 -
指针函数小练习
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)代码实现://主程序float sum;int n = 9; //给n赋值if(n%2==0) //n为偶数{ printf("Even="); sum=dcall(peven原创 2014-01-22 14:09:24 · 1214 阅读 · 0 评论 -
费氏搜寻法之算法分析与实现
费氏搜寻法简介费氏搜寻法,就是利用斐波那契数列从有序数列中搜寻特定元素的一种搜索算法。二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的log值,这边要介绍的费氏搜寻,其利用费氏数列作为间隔来搜寻下一个数,所以区间收敛的速度更快,搜寻时间为O(logn)。费氏搜寻法算法分析费氏搜寻使用费氏数列来决定下一个数的搜原创 2014-01-07 09:55:39 · 1662 阅读 · 0 评论 -
插补搜寻法之算法分析及实现
插补搜寻简介插补方式有:直线插补,圆弧插补,抛物线插补,样条线插补等,我们这里用到的是直线插补。直线插补(Llne Interpolation)这是车床上常用的一种插补方式,在此方式中,两点间的插补沿着直线的点群来逼近,沿此直线控制刀具的运动。对于一个有序数组,一般我们可以使用二分查找发查找某一个元素,这里介绍另一种方法,插补(Interpolation)搜寻法。和二分查找直接用中间的原创 2014-01-06 10:17:08 · 2376 阅读 · 0 评论 -
中序式转后序式算法分析及代码(C/OC)
中序式转后序式简介平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 法。可以将中序表示式转换为后序(Postfix)表示式,后序表示式又称之为逆向波兰表原创 2013-12-23 11:05:04 · 1784 阅读 · 0 评论 -
背包问题简介及代码分析(C、OC都可运行)
背包问题(Knapsack Problem) 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号、单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT$5700 2 橘子 2KG NT$2250 3 草莓 1K原创 2013-12-11 14:45:08 · 913 阅读 · 0 评论 -
Boyer-Moore字符串搜索算法
Boyer-Moore字符串搜索算法 在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年。此算法仅对搜索目标字符串(关键字)进行预处理,而非被搜索的字符串。虽然Boyer-Moore算法的执行时间同样线性依赖于被搜索字符串的大小,但是通常仅为其它算法的一小部分:它不需要对被搜索的字符串中的原创 2013-12-10 15:30:35 · 1192 阅读 · 0 评论 -
八皇后问题解法及算法分析
什么是八皇后问题八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。问题解法,关键看注释,仅供参考#define N 6 //设置棋盘行列数,既皇后有几个int column[N+1];原创 2013-12-09 11:26:36 · 2031 阅读 · 0 评论 -
一般法求PI,以及利用超长数运算求长PI(总结)
一般法求PI比较简单,现举一小例。如根据Leibniz定理:1/1-1/3+1/5-1/7+1/9...=PI/4则代码实现如下://主程序int i,j=0;double pa=0;for(i=1;i<40000;i=i+2)//通过加大i的最大值可提高计算精确度{ if(j==0) { pa=pa+1.0/i; j=1原创 2013-12-18 13:51:56 · 2904 阅读 · 0 评论 -
生命游戏简介及算法分析(整理)
生命游戏生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞。规则生命游戏中,对于任意细胞,规则如下:每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)当前细胞为存活状...原创 2013-12-09 17:20:12 · 15924 阅读 · 1 评论 -
简单因式分解及利用质数表进行因式分解
简单因式分解,不用质数表,比较简单,就不注释了int i, n;n = 500;printf("%d = ", n);for(i = 2; i * i <= n;) { if(n % i == 0) { printf("%d * ", i); n /= i; } else i++;}printf("%d\n"原创 2013-12-20 13:43:35 · 3880 阅读 · 0 评论 -
利用辗转相除法求最小公倍数,最大公约数
算法简介辗转相除,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公约数的算法。它是已知最古老的算法, 其可追溯至公元前300年。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。算法描述:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。 程原创 2013-12-20 13:52:20 · 1700 阅读 · 0 评论 -
完美数简介及算法分析
完美数简介各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。第三原创 2013-12-20 16:24:31 · 9966 阅读 · 1 评论 -
基数排序法算法分析及实现
基数排序法简介「基数排序法」(radix sort)属于「分配式排序」(distribution sort),基数排序法又称「桶子法」(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些「桶」中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法原创 2014-01-05 14:34:21 · 1671 阅读 · 0 评论