- 博客(10)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 红黑树-详细剖析-如果你有一天或者两天的时间,借助此文,能够学会红黑树的。
看了算法导论,也看了wikipedia,纠结了好几天,终于能看懂红黑树了。于是就写下这边博客,以供自己以后参考,或者能够和大家交流,希望能够共同学习。红黑树是很复杂的一种树。它的典型用途就是关联数组。至于红黑树的删除,必定会给出耳目一新的思路。一,红黑树的插入按照常理,给出红黑树的性质:1,每个节点或者是红色的或者是黑色的。2,根节点是黑色的。3,每个NIL节点都是黑色的。
2012-11-29 21:11:14 1754
原创 计数排序:counting-sort
计数排序是假设输入的数据都是0到k之间的整数,如果给定的数据集是有限的,那么排序可以在线性事件内完成。但是深入计数排序后会发现,计数排序有它的局限性,需要额外的存储空间,事件复杂度为O(n),但是空间复杂度上升到了O(n+k),如果数据集中整数的范围拉的很大,但是中间都是空出来的,有很大一部分数字没有出现,那么就不能能计数排序了。先给出计数排序的基本算法(来自算法导论):COUNTIN
2012-11-26 21:46:57 1802
原创 二叉树的基础问题
先给定一个二叉树的图作为样例:图中下边没有给出的表示为空,图画的不好,将就着看吧。下面的代码中分别给出了二叉树的前中后的递归遍历和非递归遍历,最后还给出层次遍历。#include#include#includeusing namespace std;#define NIL '#'typedef struct tree_node{ char data; struct
2012-11-24 20:12:35 944
原创 约瑟夫环-两种实现方法,两种时间复杂度
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为r的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。求最后出列的人的编号。第一种方法就是使用循环链表的方法,因为这种方法在删除一个节点后,对于其他节点的位置改动不用太大。这是一种很浪费时间的方法,每次都删除第m个数字(注意题意包含摸的概念),也
2012-11-24 16:32:01 10563
原创 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。例如给定下列的输入:然后有如下的输出:可以看到,所谓树的镜像,就是把同一层中属于同一个父节点的两个子节点进行对调。图中没有给出一个父节点之后一个子节点的情况,但是可以把问题统一于一个父节点同时存在两个左右子节点的情况,这两个子节点可以同时存在,但是其中一个也可以是空,可以
2012-11-23 20:52:16 2079
原创 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \
2012-11-19 22:24:07 6858 1
原创 判断两个数组中是否有相同的数字
首先要说声不好意思,因为这个题说的很模糊,但是也算是两个方向吧。也就是说,给定的两个数组是否有序,如果无序的话那么解决这个问题所用的时间复杂度就是nlog(n),如果给定的两个数组有序,那么解决方法的时间复杂度会是O(n)。下面会给出两个解法。(假设数组是有序的,因为如果无序的话直接用快速排序或者堆排序在nlog(n)就可以解决)。第一种方法,就是应用折半查找,依次从第一个数组中取出一个元素,
2012-11-19 20:32:15 9838
原创 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
自己用c语言编写的一个程序,是按照数据结构书上给出的结构。如果不对的地方请指教。同时会给出c++的设计。#include#include#define STACK_MAX_CAPACITY 20#define INCREMENT 10typedef struct stack{ int *base; int *top; int capacity;}stack;stack d
2012-11-18 20:04:24 3154
原创 数组al[0,mid-1] 和 al[mid,num-1],都分别有序。将其merge成有序数组al[0,num-1],要求空间复杂度O(1)
这个涉及到原地归并排序和block swap两个算法,所以如果有兴趣的读者先读我空间的 Parallel In-Place Merge 和 block swapping两篇文章。首先给出原地归并排序的基本原理图:首先把给定的数组分成两部分,前一部分包括[l,m]中的元素,而后者则包括(m,r]中的元素。然后找到第一个数组中的中间值,也就是q1=(l+m)/2,q1位置的元素就是我们
2012-11-12 21:03:39 2607
原创 二分查找. (代码可在五行以内)
算法要求在五行之内写出二分查找,我用了6行,不知道有高手可以用五行写出来不:#include#includeint a[]={10,22,42,51,56,63,78,99,102,118};int binary_search(int low, int high, int key) { if(low > high) return -1; int mid = low + (high
2012-11-07 22:50:16 4812 4
an efficient implemention of double array trie
2013-01-06
shared ptr可以从boost库中单独提出来吗
2015-06-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人