
数据结构与算法
文章平均质量分 60
kangquan2008
一是希望我能把以前的积累再次重新的梳理一次,查缺补漏。二也是在这世界留下点记录。。表明我曾经来到过这世界,学到过这些东西。。
展开
-
循环队列的队空与队满的条件
为了方便起见,约定:初始化建空队时,令 front=rear=0, 当队空时:front=rear 当队满时:front=rear 亦成立 因此只凭等式front=rear无法判断队空还是队满。 有两种方法处理上述问题: (1)另设一个标志位以区别队列是空还是满。 (2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位原创 2010-07-07 21:31:00 · 113122 阅读 · 19 评论 -
插入排序
#include #include void swap(int *a ,int *b){ int tmp = (*a); (*b) = (*a); (*a) = tmp;}void insert_sort(int data[], int size){ for(int i=1; i<size; i++)/* size - 1 times*/ { int tmp = da原创 2011-09-01 15:13:01 · 612 阅读 · 0 评论 -
堆排序与直接选择排序的比较
直接选择排序基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列.直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]原创 2010-07-15 21:35:00 · 1053 阅读 · 0 评论 -
POJ 3278
使用分支界限法,通常回溯法的求解目的是找出解空间中满足某约束条件的所有解,而分支界限是求出解空间的满足约束条件的一个解; #include#includeusing namespace std;queue que;int visited[100008] = {0};int cnt[100008];int queOut;void bfs(int here,int原创 2010-07-19 14:38:00 · 694 阅读 · 0 评论 -
栈
#include #include #include #define STACK_SIZE 10typedef unsigned int DATA;typedef struct STACK{ DATA data[STACK_SIZE]; int top;}Stack;Stack stack;void initial(){ stack.top = 0; for(i原创 2011-08-27 23:25:49 · 490 阅读 · 0 评论 -
二叉树代码练习
#include #include #include #define STACK_SIZE 100typedef struct TREE{ char data; struct TREE *left; struct TREE *right;}*Tree,Node;typedef struct STACK{ Node node[STACK_S原创 2011-09-20 15:13:05 · 719 阅读 · 0 评论 -
约瑟夫 猴子选大王
猴子选大王,通过简单模拟可以解决。思路是踢掉n-1,只剩最后一个#include #include #include #include #define ALIVE 1#define DIE 0int get_monkey_king(int monkey[],int num,int ith){ int index = 0; for(int i=0; i<num-原创 2011-10-07 21:48:30 · 1168 阅读 · 1 评论 -
哈斯 拉链法 C
哈斯一般用开放地址和拉链法来实现,开放地址的最坏情况要比拉链的可能性大,我的理解是开放地址形成冲突都是往后退然后放,有可能形成要遍历全部数据才能找到要找的数据,而拉链的情况下一般来说,不会导致所有数据都同一条链表上。至于平均复杂度,我不是很会分析,谁懂告诉我吧 :)开放地址的源码:http://blog.youkuaiyun.com/kangquan2008/article/details/67原创 2011-10-06 09:50:37 · 1335 阅读 · 0 评论 -
归并集
/********************************** * 归并集 :) * 包括find和union两个操作 * find 定义为查找到data的根 * union_oper 定义为归并两个树 * 其中find的过程会对路径进行压缩 * union的时候通过秩引导降低树高 * * author : huangkq19989 * blog : http://blo原创 2011-10-04 20:33:21 · 1862 阅读 · 0 评论 -
自定义实现字符串处理函数 strlen strcmp strcpy strncpy strcat strncat strchr strstr
/****************************************************************************** * author : kangquan@scut2008 * * blog : http://blog.youkuaiyun.com/kangquan2008 * * discription: 自定义实现字符串处理函数 * siz原创 2011-09-04 12:38:14 · 1826 阅读 · 0 评论 -
二分查找
/**************************************** * Copyright huangkangquan@scut2008 * Create :2011/9/1 ****************************************/#include #include int binary_search(int data[], int low原创 2011-09-01 23:53:31 · 568 阅读 · 0 评论 -
AOE
#include#include#include#includeusing namespace std;#define Max 100int ve[Max];int vl[Max];int ee,el;int eetemp[Max*Max],eltemp[Max*Max];int indegree[Max];//入度int flag = 0;int原创 2010-07-16 08:18:00 · 622 阅读 · 0 评论 -
快排
////////////////////////////////////////// description: quick sort algorithm// created by : kangquan2008@scut////////////////////////////////////////#include#includeint partition(int data[],i原创 2011-08-28 14:30:59 · 535 阅读 · 0 评论 -
归并排序
#include #include #include void merge(int result[],int data[],int left,int mid,int right){ int i = left; int j = mid; int cnt = left; for(; i<mid&&j<=right;) { if(data[i] < data[j]) res原创 2011-09-20 21:58:41 · 680 阅读 · 0 评论 -
字典树
字典树能有效处理查询某个字符串出现的次数,创建树的时间复杂度为 O(n*len),其中n 为字符串的个数,len 为字符串的平均复杂度;我的代码里空间复杂度并不算好,有很多空指针。但处理该类问的时间复杂度能比哈斯要好。查询的时间复杂度为O(len)代码如下:)#include #include #define SIZE 26#define CHECK_RET(r原创 2011-10-06 00:18:29 · 1317 阅读 · 0 评论 -
hash 开放地址法源码
哈斯开放地址法源码///////////////////////////////////////////////////////////////////////////////// // author: kangquan@scut2008//// blog: http://blog.youkuaiyun.com/kangquan2008//// description: proc原创 2011-09-13 18:31:32 · 1240 阅读 · 0 评论 -
模拟迷宫 深搜
/****************************************************************************** * author : kangquan@scut2008 * * blog : http://blog.youkuaiyun.com/kangquan2008 * * discription: 模拟走迷宫 * ***********原创 2011-09-04 14:11:09 · 673 阅读 · 0 评论 -
创建堆并进行堆排序
以下程序是形成小根堆,并进行堆排序。基本操作为head_shift_down()函数,该函数将大的元素往下降。创建堆和进行堆排都是通过它来完成。编写过程出现一些错误就是进行终止时使用的判断条件为 data[smaller] >= data[index];应该为data[smaller] >= tmp;tmp即为要shiftdown的元素。而对index进行下一步,应是index = s原创 2011-09-02 18:52:14 · 1461 阅读 · 0 评论 -
深搜 广搜
深度优先步骤:1,设置指针p,指向顶点v;2,访问p所指顶点,使p指向与其相连且未被访问过的顶点;3,若p所指顶点存在,重复2,否则进行4;4,按先前访问的次序和方向回溯到一个尚有邻接顶点且未被访问过的顶点,并使p指向该顶点,重复2,直至所有顶点均被访问 图的邻接表表示法的深度优先遍历: int visited[n] = {0}; //未被访问void d原创 2010-07-16 08:45:00 · 913 阅读 · 0 评论 -
POJ 3349
用c++的输入输出流TLE,改用C的则通过;由于数据很大,暴力两两比较的话,log(n*n)通不过;采用hash链式地址进行查找能提高效率,log(M*(n/M)*(n/M)),其中M为桶数,则n/M为链表长度;采用了STL的vector,其插入函数为v.push_back(a);AC的代码:#include#include#include using namesp原创 2010-07-17 01:56:00 · 827 阅读 · 0 评论 -
01背包之动态规划
动态规划通常由以下四个步骤组成:1.找出最优解的性质,刻画其结构特征;2.递归定义最优值;3.自底向上计算最优值;4.根据计算最优值时得到的信息,构造最优解 01背包问题按以上四个步骤分析如下:1.最优解的结构特征: 要求放进n个物体(v[i]为i的价值,w[i]为i的重量)在总裁重为W的背包中,使总价值最大,可转换为当处理第n个物品后,使总价值最大原创 2010-07-19 14:24:00 · 669 阅读 · 0 评论 -
选择排序
////////////////////////////////////////// description: quick sort algorithm// created by : kangquan2008@scut////////////////////////////////////////#include#includevoid swap(int * a,int * b)原创 2011-08-28 15:09:32 · 461 阅读 · 0 评论 -
冒泡
#include #include void swap(int * a,int *b){ int tmp = (*a); (*a) = (*b); (*b) = tmp;}void bubble_sort(int data[],int size){ for(int i=0; i<size-1; i++)// only need size-1 times { int f原创 2011-08-27 23:25:12 · 510 阅读 · 0 评论 -
计算最大连续子序列之和
题目描述 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 输入 测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K输出 对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一原创 2011-09-20 16:24:13 · 2361 阅读 · 0 评论 -
八皇后
打印出所有的八皇后可能的位置,及其可能的种数。思路:用回溯,直接深度优先遍历一遍空间树。#include #include #include #define SIZE 8int solution_kind = 0;int position[SIZE]; // 表示第i个皇后放在(i,position[i])上// 判断是否在对角线上int in_diagonal(原创 2011-10-08 13:18:19 · 711 阅读 · 0 评论 -
将二叉树写入文件,再读出重新构建
代码如下:/******************************* * * 功能:生成一棵二叉树,写进文件,再读出, * 并将其重构成一个二叉树 * * author:kangquan2008@scut blog:http://blog.youkuaiyun.com/kangquan2008 * ******************************/#includ原创 2011-10-04 19:29:17 · 6935 阅读 · 2 评论 -
二叉排序树
/*********************************** * * 二叉排序树:查找、插入、删除 * author : kangquan2008 * * **********************************/#include #include #include typedef struct Node{ int data; st原创 2011-10-04 14:06:10 · 826 阅读 · 0 评论 -
判断是否为回文数
递归算法://////////////////////////////////////////// author: kangquan@scut2008//////////////////////////////////////////#include #include #include int is_huiwen(char * num, int begin, int e原创 2011-09-02 00:28:52 · 794 阅读 · 0 评论 -
二叉树基本操作
#includeusing namespace std;typedef char Elemtype;struct BTreeNode{ Elemtype data; BTreeNode *left; BTreeNode *right;};void InitialBTree(BTreeNode *&BT){ BT=NULL;}v原创 2010-07-07 21:37:00 · 956 阅读 · 0 评论 -
交叉链表 有环链表 链表逆转
/////////////////////////////////////////////////// Description: this file process the link// 1. add node in the head and the tail// 2. link has a loop or not // 3. two links will meet each原创 2011-08-27 20:47:15 · 530 阅读 · 0 评论 -
统计单词出现的次数并按单词出现的次数顺序输出单词及其次数
这是一道笔试题来的,主要是用字典树来解决:/****************************************** * * 描述:这是一道笔试题,要求按单词出现的次序打印出单词及其出现的次数; * * 思路:既然是笔试题,肯定要考虑时间复杂度,字典树要比哈斯的要好, * 因此我用了字典树. * * author: huangkq1989@scut2008 *原创 2011-10-07 15:00:39 · 7225 阅读 · 0 评论 -
输出迷宫的所有路径和最短路径
编写这个代码主要是锻炼一下回溯和分支界限法的,分别通过深搜和广搜遍历解空间树可以解决输出迷宫的所有路径和输出所有迷宫最短路径的两个问题,其中要注意的包括:1,剪枝:包括界限和约束,在这个问题的约束主要是指该节点是否已遍历和是否能通过2,回溯活节点(指能得到解的节点,比如该题就指矩阵中为0的元素)可多次成为扩展节点(即继续递归下去),而分支界限的活节点只有一次机会成为扩展节点。原创 2011-10-07 14:54:25 · 9429 阅读 · 0 评论 -
斐波那契非递归解法
/*************************** * 斐波那契非递归输出 * blog:http://blog.youkuaiyun.com/kangquan2008 * author:huangkq1989 * 这是一道面试题来的,应该说很简单, * 但是在面试的时候面试官说如果这个 * 函数要调用一百万次,问怎么优化, * 但是没想到,其实可以打表! * 不过我的代原创 2011-10-04 19:55:14 · 1212 阅读 · 1 评论 -
POJ 2685
#include #include #include #include #define CNT 2#define MAXSIZE 9int main(){ int cnt; scanf("%d",&cnt); while( cnt-- ) { char input[CNT][MAXSIZE]; int result[CNT] = {0,0}; scanf("原创 2011-09-13 13:40:08 · 744 阅读 · 0 评论