代码改变世界

随笔分类 -  数据结构与算法(原创)

二叉树

2012-04-08 21:42 by Rollen Holt, 875 阅读, 收藏, 编辑
摘要: 今晚闲来无事,练练基本的数据结构吧 BinTreeNode.h template<typename Type> class BinaryTree;template<typename Type> class BinTreeNode{public: friend class BinaryTree<Type>; BinTreeNode():m_pleft(NULL),m_pright(NULL... 阅读全文

面试题

2012-03-25 18:11 by Rollen Holt, 2344 阅读, 收藏, 编辑
摘要: 微软面试题:地球上有多少个满足这样条件的点站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?北极点满足这个条件。距离南极点很近的一个圈上也满足这个条件。在这个圆圈上,向南走一公里,然后向东走一公里恰好绕南极点一圈,向北走一公里回到原点。所以地球上总共有无数点满足这个条件。谷歌面试题:判断一个自然数是否是某个数的平方判断一个自然数是否是某个数的平方。当然不能使用开方运算。假设待判断的数字是 N。方法1:遍历从1到N的数字,求取平方并和N进行比较。如果平方小于N,则继续遍历;如果等于N,则成功退出;如果大于N,则失败退出。复杂度为O( 阅读全文

UVa 10010 Where's Waldorf?

2012-03-21 23:01 by Rollen Holt, 947 阅读, 收藏, 编辑
摘要: #include<stdio.h>#include<string.h>#define maxn 57long test,m,n,k;char r[maxn][maxn];const long xd[]={-1,-1,0,1,1,1,0,-1},yd[]={0,1,1,1,0,-1,-1,-1};void search(const char *a,long &x,long &y){ long pos,xx,yy; for(long i=1;i<=m;i++) for(long j=1;j<=n;j++) if(r[i][j]==a[0]) { 阅读全文

UVa 10082 WERTYU

2012-03-21 22:48 by Rollen Holt, 426 阅读, 收藏, 编辑
摘要: #include<stdio.h>int main(){ /* freopen("data.in","r",stdin); freopen("data.out","w",stdout); //*/ const char s[]="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; char c; while... 阅读全文

UVa 10361 Automatic Poetry

2012-03-21 22:46 by Rollen Holt, 386 阅读, 收藏, 编辑
摘要: #include<iostream>#include<string>using namespace std;int main(){ long n; cin>>n; getchar(); for(long cas=1;cas<=n;cas++) { string a,b,ans; getline(cin,a); for(long i=0;a[i];i++) if(a[i]!='<'&&a[i]!='>') cout<<a[i]; cout<<endl; //... 阅读全文

UVa 401 Palindromes

2012-03-21 22:40 by Rollen Holt, 442 阅读, 收藏, 编辑
摘要: 题目大意:Palindrome的定义是,一个字符串从左向右和从右向左读是一样的;Mirrored string的定义是,一个字符串左右对称;Mirrored palindrome就是既palindrome又mirrored的字符串。对称的关系表题目中已给出。#include<stdio.h>#include<string.h>const char one[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";const char two[]="A 3 HIL JM O 2TUVWXY51SE Z 8 "; 阅读全文

哲学家就餐的问题--java实现

2011-09-15 20:32 by Rollen Holt, 8055 阅读, 收藏, 编辑
摘要: 先来看看运行结果吧:代码分为4个文件:Chopstick.javapackage Philosopher;/** * 表示筷子的类 * */public class Chopstick{ public Chopstick(){ } public Chopstick(int id){ this.id = id; } public boolean isAvailable(){ return available; } public void setAvailable(boolean available){ this.available = available; } public int get... 阅读全文

棋盘覆盖--递归分治java实现

2011-08-28 12:11 by Rollen Holt, 6487 阅读, 收藏, 编辑
摘要: 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。 四各L型骨牌如下图1 图1棋盘中的特殊方格如图2图2 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图3所示。图3 将棋盘保存在一个二. 阅读全文

Strassen矩阵乘法

2011-08-27 23:26 by Rollen Holt, 8134 阅读, 收藏, 编辑
摘要: Strassen矩阵乘法矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。60年代末,Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.18)。首先,我们还是需要假设n是2的幂。将矩阵A,B和C中每一矩阵都分块 阅读全文

递归分治算法求解--整数划分问题

2011-08-27 19:03 by Rollen Holt, 4252 阅读, 收藏, 编辑
摘要: 【问题描述】:将正整数n表示为一系列整数的和:n=N1+N2+N3+…Nn 其中(N1>=N2>=N3>=…Nn)正整数n的这种表示叫做正整数n的划分,正整数n的不同的划分的个数叫做n的划分数。记做p(n)。比如对于6:6;5+14+2;4+113+3;3+2+1;3+1+1+12+2+2;2+2+1+1;2+1+1+1+11+1+1+1+1+1+1【算法设计】:在正整数n的所有划分中,将最大加数N1不大于m的划分的个数记做divide(n,m),建立递关系式:1):当最大加数不大于1的时候,只有一种划分形式,也就是1+1+1+1....2):最大加数实际上不可能大于n,所以 阅读全文

递归分治算法计算全排列

2011-08-26 23:25 by Rollen Holt, 1048 阅读, 收藏, 编辑
摘要: 其实计算全排列本人所知有字典序法,还有一个在组合数学中学到的,忘记了,呵呵。不好意思。大家可以Google一下。下面这个例子是我练习递归分治算法的时候设计的,呵呵,大家指针批评。/** * @author Rollen-Holt * 递归分治算法计算全排列 * */public class Perm{ public static void main(String[] args){ int[] data={1,2,3,4}; perm(data,0,data.length-1); } /** * 产生data[start:end]的所有排列 * */ public static void... 阅读全文

java写的多项式乘法

2011-08-24 19:54 by Rollen Holt, 2901 阅读, 收藏, 编辑
摘要: 因为项目需要用到多项式的乘法,所以特写了一些,大家可以围观批评。class test{ test() { } test(int n, double x){ this.n=n; this.x=x; xishu=new int[n]; } public static double plyv(int n,int xishu[], double x2){ double resault=xishu[n-1]; for(int i=n-2;i>=0;i--){ resault=resault*x2+xishu[i]; } return resault; } public stat... 阅读全文

java写的回溯法求迷宫问题

2011-08-23 20:42 by Rollen Holt, 11705 阅读, 收藏, 编辑
摘要: 问题描述:[实验目的]综合运用数组、递归等数据结构知识,掌握、提高分析、设计、实现及测试程序的综合能力。[实验内容及要求]以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。(1)根据二维数组,输出迷宫的图形。(2)探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。[测试数据]左上角(1,1)为入口,右下角(8,9)为出口。0010001000100010001011010111001000010000010001010111100111 阅读全文

算法标记的一点知识

2011-06-05 11:50 by Rollen Holt, 983 阅读, 收藏, 编辑
摘要: 现在的数据规模越来越大, 因此, 当输入规模大到只有运行时间的量级有关时, 就是在研究算法的渐进效率. 也就是从极限的角度观察算法的增长.大O 记号 : 只有渐进上界时使用.Θ 记号 : 同时具有 渐进上界 和下届.Ω 记号 : 渐进下届.定理 3.1 : 对任意两个函数 f(n) 和 g(n) , f(n) = Θ(g(n)) 当且仅当f(n) = O(g(n)) 和 f(n) = Ω(g(n)) .这一章真的令人蛋痛, 全是记号, 表示头晕. 几个渐进函数之间的 各种 关系 : 传递性, 自反性, 对称性, 转置对称性, 三分性 神马的, 果然都是浮云啊, 只理解简单的大O好了, 其他的以 阅读全文