计算机算法艺术
文章平均质量分 63
liwenjia1981
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
归并排序
要记住有这么一个窍门:凡是判定树为一棵树的算法,其时间复杂度多半为O(nlgn).lgn就是log以2为底n的对数。 归并排序算法同插入排序是有性能区别的。前者时间复杂度为o(nlgn),而插入排序的时间复杂度为o(n*n),但是二路插入排序或者二分插入排序可以稍稍的减少时间复杂度,并不明显。 在大规模数据的排序上,当然归并排序更为首选;而小规模数据上,则插入排序最优。原创 2010-03-07 10:23:00 · 572 阅读 · 0 评论 -
前序,中序,后续非递归遍历树的标准算法
<br />前序,中序,后续非递归遍历树的标准算法<br /> 在中国源码网上发现了这三个算法,据说是标准算法,算法的整体思想就是(以中序为例):<br />1、先设一个栈s和一个指向树根的指针p,用p指指向结点的lchild并顺其而下直到p==NULL跳出循环,在这一过程中把从根节点到最左节点过程中经过的每个结点(包括最左结点)入栈,则此时的p指向的是树的最左结点。 <br />2、栈顶元素出栈以访问最左结点<br />3、访问最左结点的根结点。<br />4、由于将右子树理解为一原创 2010-07-12 14:39:00 · 7822 阅读 · 0 评论 -
解谷歌的一道题
<br />这几天有一道Google的面试题在论坛炒得很火,题目如下:“有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层面。”下面给出我的分析和解答。<br /> <br />为了得到两个棋子的最优策略,我们先简化问题,看看一个棋子的情况。如果手中只有一个棋子,为了得知临界层面,你只有一种选择:从2楼开始,一层一层地试,直到棋子被打碎,此时你站的楼层就是所求的临界层面。在最差的情况下,我们需要投掷99-转载 2010-06-11 21:06:00 · 687 阅读 · 0 评论 -
LCS最长公共子序列算法
<br />#include<iostream><br />#include<string.h><br />#include<stdio.h><br />using namespace std;<br />char X[7]={'A','B','C','B','D','A','B'};<br />char Y[6]={'B','D','C','A','B','A'};<br />int LCS[8][7];<br />int LCI[8][7];<br />void LCSLeng(char *a,cha原创 2010-06-16 11:26:00 · 503 阅读 · 0 评论 -
一道算法题
<br />两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合 <br />物会放糖的烧杯,问你两个烧杯哪个杂质多?<br /> <br /> <br /><br />一样多吧 <br /><br />对的 <br /><br />为啥? <br /><br />是不是因为:糖和盐本来就是均匀的 <br /><br />因为,就算不搅拌均,你放一勺过去,那边放一勺不含杂质的过来,那么都是一勺杂之 <br /><br />如果搅拌均匀的话也是一样<br />小依 21:45:32<br原创 2010-06-15 09:57:00 · 1795 阅读 · 0 评论 -
子数组连续和最大值
<br />#include<stdio.h><br />#include<iostream><br />using namespace std;<br /><br />int max(int left,int right)<br />{<br /> return left>=right?left:right;<br />}<br />int maxsum(int *x,int l,int u)<br />{<br /> if(l>u) return 0;<br /> <br /> if(l==u) r原创 2010-06-17 14:25:00 · 484 阅读 · 0 评论 -
合并算法求逆序对
<br />#include<stdio.h><br />#include<string.h><br />#include<iostream><br />#include<stdlib.h><br /> <br />using namespace std;<br /> <br />#define NUM 5<br />int number=0;<br /> <br />void MergeSort(int *a,int length);<br />void MergePart(int *a,int *b,i原创 2010-06-17 10:53:00 · 439 阅读 · 0 评论 -
合并排序算法 C代码
<br />#include<stdio.h><br />#include<unistd.h><br /> <br />void Merge(int *a,int low,int mid,int high)<br />{<br /> int *clone=new int[high-low+1];<br /> if(!clone) return ;<br /> <br /> int l=low;<br /> int s=mid+1;<br /> int i=0;<br /> while((l<=mid)&&原创 2010-06-18 16:38:00 · 772 阅读 · 0 评论 -
广度优先遍历BFS的图算法
<br />#include<iostream><br />#include<queue><br />using namespace std;<br /><br />class graph<br />{<br /> public:<br /> graph(){}<br /> graph(int v)<br /> {<br /> CreateGraph(v);<br /> }<br /> bool CreateGraph(int v)<br /> {<br /> if(v<=0)<br /原创 2010-06-22 16:02:00 · 610 阅读 · 0 评论 -
计算字符串相似度
<br /><br />编程之美3.3<br />看完题后,毫无头绪<br />书上的解题思路很好,首先两个字符串的距离肯定是个可知数,必须小于两字符串之和。<br />可以通过删除操作将两个串都变成空串。<br />书上所示的递归方法,代码敲出来了,有点点不同<br /> view plaincopy to clipboardprint?#include <stdlib.h> #include <stdio.h> #include <string.h> void calDistance(char转载 2010-07-13 10:27:00 · 2492 阅读 · 1 评论 -
研究生必会算法
<br />1。广义表转换二叉树<br />2。用后续遍历计算树高度和节点个数原创 2010-07-11 10:55:00 · 1399 阅读 · 1 评论 -
计算机排序算法艺术
排序算法是最为重要的算法应用之一。作为研究生或者本科生来说,我个人归纳整理的一下几种必须要精通的排序算法: 1)插入排序----折半插入排序----二路插入排序 2)希尔排序(用的较少) 3)冒泡排序-----快速排序 4)选择排序-----树形选择排序------赢者树、败者树 5)堆排序 6)归并排序 7)计数排序------基数原创 2010-03-07 13:08:00 · 629 阅读 · 0 评论 -
每对顶点间最短路径----Floyd算法 收藏
<br />每对顶点间最短路径----Floyd算法 收藏<br /> 对于一个各边权值均大于零的有向图,对每一对顶点,求出vi与vj之间的最短路径和最短路径长度。<br />以下代码包含有向图的建立,Floyd算法的实现以及输出最短路径和最短路径长度,具体过程请看【动画演示Floyd算法】。<br />代码说明几点:<br />1、A[][]数组初始化为各顶点间的原本距离,最后存储各顶点间的最短距离。<br />2、path[][]数组保存最短路径,与当前迭代的次数有关。初始化都为-1,表示没有中间顶点。转载 2010-06-27 21:12:00 · 2276 阅读 · 0 评论 -
求逆序对
#include using namespace std; static int nums=0; bool Merge(int *list,int left,int mid,int right) { int i=left; int j=mid+1; int k=0; int *num=new int[right-left+1]; if(!num) return false; while((i原创 2010-07-03 11:11:00 · 492 阅读 · 0 评论 -
1。排列算法 2。大整数划分
<br />#include<iostream><br />using namespace std;<br />int partion(int n,int m)<br />{<br /> if((n<1)||(m<1))<br /> return 0;<br /> if((n==1)||(m==1))<br /> return 1;<br /> if(n<m)<br /> return partion(n,n);<br /> if(n==m)<br /> return 1+partion原创 2010-07-02 10:46:00 · 543 阅读 · 0 评论 -
n元一维向量左/右移动 i个位置
将一个n元一维向量左移动,或者右移 i个位置,是一道经典的算法题,比如,abcdef左移两位,变成cdefab, 简单的代码使用一个 n元的中间向量完成该工作,能否使用数十个字节的内存空间,用正比于n的时间内完成向量的旋转? 最简单的办法就是,循环移动K次,每次移动一位。时间复杂度是o(K*n)。代码如下: ShitBits(int *arr,int N,int k) {原创 2010-05-11 16:02:00 · 1062 阅读 · 0 评论 -
洗牌算法
<br />洗牌即产生指定数据的随机序列。在网上找了半天大体有两种做法1、 思路:将54个数依次放到随机的位置。关键是每次找一个随机的位置。下面是找这个随机位置的算法:1、用一个Bool型数组记录各个位置是否已经放置了数,如果放置则置true,没有则为false。在算法开始时数组初始化为false。2、每次产生一个0~53的随机数,看这个位置是否已经放置了数,如果已经放置了,则继续用同样的方法找一个随机位置判断;如果这个位置还未放置,则设置此位置,并标记其已经放置。3、反复执行(2)直到所有的位置都放置了数原创 2010-07-10 16:30:00 · 819 阅读 · 1 评论 -
数组中最长递增子序列
<br />这道题还有优化的解法:保留一个动态规划优化矩阵,里面保留每次最长子序列的终点。<br />#include<iostream><br />#include<vector><br />using namespace std;<br />int Max(int *a, int n)<br />{<br /> int max = a[0];<br /> for(int i = 1; i < n; i++)<br /> if(max < a[i])<br />原创 2010-07-12 10:49:00 · 893 阅读 · 0 评论 -
求A+B=C
<br />#include<stdio.h><br />int a[5]={1,2,3,5,11};<br />int *p;<br />int *q;<br />int maxij(int **i,int **j,int flag)<br />{<br /> int u,v;<br /> <br /> printf("----%d/n",a[flag]);<br /> for( u=0,v=4;u<v;)<br /> {<br /> if(a[u]+a[v]==a[flag])<br /> {<br原创 2010-07-12 19:56:00 · 1312 阅读 · 0 评论 -
基于邻接表的图的广度优先遍历算法
<br />C++写程序确实比C方便的多。<br />#include<iostream><br />#include<queue><br />using namespace std;<br />class ArcNode;<br />class VexNode<br />{<br /> public:<br /> //private:<br /> VexNode()<br /> {<br /> vertix=0;<br /> //data=0;<br /> next=NULL;<原创 2010-06-22 19:21:00 · 1777 阅读 · 0 评论
分享