随笔分类 -  AlgorithmAndDS

摘要:递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点。如果不用递归,那该怎么做呢?仔细一.先序遍历 看一下递归程序,就会发现,其实每次都是走树的左分支(left),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。 可以用栈记忆:在访问途中将依次遇到的节点保存下来。由于节点出现次序与恢复次序是反序的,因此是一个先进后出结构,需要用栈;还可以节点增加指向父节点的指针。void preOrder1(TNode* root) { Stack S; wh... 阅读全文
posted @ 2013-06-07 11:55 加拿大小哥哥 编辑
摘要:今天只涉及数学。符号(notation)。1.f(n) = O(g(n))表示存在适当常数c使得0=<f(n)<=c*g(n)对于n>n0时成立,我想起了高数里用小o表示余项,此处的等号有时候也用属于号表示。2.大Ω符号仅仅颠倒了上述不等式,f(n) = Ω(g(n))表示存在适当常数c使得0=<c*g(n)<=f(n)对于n>n0时成立。3.θ表示上面的交集, 阅读全文
posted @ 2013-06-04 18:48 加拿大小哥哥 编辑
摘要:1.学习算法主要是性能的需要,必要时牺牲性能以确保安全等。2.用$符号表示例子(such that).3.直接插入排序;插入排序分为直接插入排序(最坏情况是逆序)和折半插入排序。public void InsertionSort(int[] arr) { for (int i = 1; i < arr.Length; i++) { int t = arr[i]; int j = i; while ((j > 0) && (arr[j - 1] > t)... 阅读全文
posted @ 2013-06-02 11:15 加拿大小哥哥 编辑
摘要:1.2.循环链表:从表的任一结点出发均能找到其它节点。3.4. 阅读全文
posted @ 2013-06-02 10:51 加拿大小哥哥 编辑
摘要:在有序序列的查找中,如果各个元素的查找概率都是一样的,那么二分查找是最快的查找算法,但是如果查找元素的查找概率是不一样的,那么用二分查找就不一定是最快的查找方法了,可以通过计算ASL来得知。所以基于这种查找元素概率不想等的有序序列,可以通过构造最优二叉树的方法,使得该二叉树的带权路径长度最小,这样的二叉树的构造代价是非常大的,所以用一种近似的算法,构造次优查找树,该树的带权路径长度近似达到最小。 数据结构中算法描述为: 1 #include <iostream> 2 #include <cmath> 3 #include <cstdlib> 4 #inclu 阅读全文
posted @ 2013-05-28 11:44 加拿大小哥哥 编辑
摘要:1.有这样一道题目:用1、2、3、4、5、6、7、8、9九个数字拼成一个九位数(每个数字恰好用一次),使得它的前三位、中间三位、最后三位的比值是1 : 2 : 3。例如192384576就是一个合法的解,因为192 : 384 : 576 = 1 : 2 : 3。#include <iostream >using namespace std;int main(){ int i, x, y, z; int d[9]= {1, 2, 3, 4, 5, 6, 7, 8, 9}; do{ x = d[0] * 100 + d[1] * 10 + d[2]; ... 阅读全文
posted @ 2013-05-22 13:07 加拿大小哥哥 编辑
摘要:1.多岔路口的交通灯管理(通行能力最大化)。2.算法解决的是一类问题。3.DS是一个二元组,包含数据元素的集合和定义在数据元素关系上的集合。4.根据斯特林公式n!约等于(n/e)^n。5.指数级算法如2^n,n在小于20时还可以用。6. 1 package a; 2 3 //顺序表的合并,复杂度len1 + len2 4 public class Union { 5 public static void main(String[] args) { 6 int[] a = {1,4,56,79}; 7 int[] b = {3,8,24,35,79,10... 阅读全文
posted @ 2013-05-21 11:38 加拿大小哥哥 编辑
摘要:在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了... 这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就... 阅读全文
posted @ 2013-05-04 19:52 加拿大小哥哥 编辑
摘要:问题描述:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。 在矩阵角上的按钮改变3盏灯的状态 在矩阵边上的按钮改变4盏灯的状态 其他的按钮改变5盏灯的状态Input 第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。Output 对每个案例,首先输出一行,输出字符串“PUZZLE #m”,... 阅读全文
posted @ 2013-05-01 16:31 加拿大小哥哥 编辑
摘要:考虑方程式:a^3 + b^3 = c^3 + d^3其中:“^”表示乘方。a、b、c、d是互不相同的小于30的正整数。这个方程有很多解。比如:a = 1,b=12,c=9,d=10 就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729。当然,a=12,b=1,c=9,d=10 显然也是解。如果不计abcd交换次序的情况,这算同一个解。你的任务是:找到所有小于30的不同的正整数解。把a b c d按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为:1,9,10,12不同解间的顺序可以不考虑。 1 #include <iostream> 阅读全文
posted @ 2013-04-27 10:23 加拿大小哥哥 编辑
摘要:http://blog.csdn.net/vinci_lau/article/details/7078575 1 #include <iostream> 2 using namespace std; 3 4 int a[10]={0}; 5 int len = 0; 6 7 void fun(int n,int m){ 8 if(n==0){ //所求数已被全部分划 9 cout<<a[0];10 //每行最后一个恰有m个数相加 11 for(int i=1;i<m;++i) 12 cout<<"+"<<a[i... 阅读全文
posted @ 2013-04-26 22:18 加拿大小哥哥 编辑
摘要:youkongxie 阅读全文
posted @ 2013-04-26 21:51 加拿大小哥哥 编辑
摘要:1.六个数里取所有三个数的全排列按字典序输出 法一:我记得比赛时我用的是二维数组,每一维先排序,竟然立马水过了,后来我想要是数多了就很麻烦,于是有了下面的方法。 法二: 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn = 25; 7 int n,num; 8 int a[maxn]; 9 bool vis[maxn] = {false};10 11 void fun(int cnt)12 {1 阅读全文
posted @ 2013-04-25 10:15 加拿大小哥哥 编辑
摘要:1132: 最少硬币问题Time Limit: 1500 ms Memory Limit: 10000 kB Total Submit : 909(187 users)Accepted Submit : 241(132 users)Page View : 9030Font Style: Aa Aa Aa 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。编程任务:对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数. 阅读全文
posted @ 2013-04-20 22:05 加拿大小哥哥 编辑
摘要:一.问题描述 亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?二.算法描述 方法一:暴力枚举,时间复杂度O(N^2) 1 /* 2 * O(N^2)... 阅读全文
posted @ 2013-04-20 15:38 加拿大小哥哥 编辑
摘要:求小于n的数里,与n互为素数的个数一. 奇数和偶数是否一定互素(排除1,不是比如6和9);1和不和任意数互素(比如6采用欧拉定理验证下)。 若n已经进行唯一分解,直接欧拉公式。 如果n的标准素因子分解式是p1^a1*p2^a2*……*pm^am,其中众pj(j=1,2,……,m)都是素数,而且两两不等。则有 φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm) 利用容斥原理可以证明它。二.不知唯一分解 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int main() 阅读全文
posted @ 2013-04-15 22:43 加拿大小哥哥 编辑
摘要:问题:ax+by=c,已知a、b、c,求解使该等式成立的一组x,y。其中a、b、c、x、y均为整数 a,b的最大公约数为gcd(a,b)。如果c不是gcd(a,b)的倍数,则该等式无解,因为等式左边除以gcd(a,b)是整数,而等式右边除以gcd(a,b)后为小数。因此,只有当c是gcd(a,b)的倍数的时候,该等式有解。这样,可以通过计算使ax1+by1=gcd(a,b)成立的x1、y1,然后有x=(c/gcd(a,b))*x1,y=(c/gcd(a,b))*y1,得到x,y。 问题就被转换为求使ax+by=gcd(a,b)成立的一组x,y。 如果b不为零,根据欧几里德定理,可以设... 阅读全文
posted @ 2013-04-15 08:26 加拿大小哥哥 编辑
摘要:一.问题描述 与分治法不同的是动归的子问题间不是相互独立的,前一个往往为后一个提供信息。 看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50 按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次 按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次 所以问题是:如何确定运算顺序,可以使计算量达到最小化。二.问题分析 枚举显然不可,如果枚举的话,相当于一个“完全加括号问题”,次数为卡特兰数,卡特兰数指数增长,必然不行。 令m[i][j... 阅读全文
posted @ 2013-04-14 22:23 加拿大小哥哥 编辑
摘要:1 //目标学会用猜数字(二分)的方法,换个角度来解决问题 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 const int N = 100000; 6 7 int a[N],n,m,max; 8 9 void input()10 {11 scanf("%d%d",&n,&m);12 max=0;13 for(int i=0;i<n;i++) 14 {15 scanf("%d",&a[i]);16 max & 阅读全文
posted @ 2013-04-12 18:20 加拿大小哥哥 编辑
摘要:一.问题描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30, 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18. 最好的是最... 阅读全文
posted @ 2013-04-11 13:13 加拿大小哥哥 编辑