数据结构
文章平均质量分 79
常用数据结构的总结、实现、分享。
spch2008
github.com/spch2008
展开
-
编辑距离
问题描述:由一个字符串原创 2014-08-30 16:03:14 · 690 阅读 · 0 评论 -
最长公共子串
之前写过一篇最长公共子序列,原创 2014-08-30 11:13:08 · 1111 阅读 · 0 评论 -
红黑树 插入与删除 总结
插入点为x, 父结点为p, 伯父节点为w,爷爷节点为g.插入操作:以插入点作为基准,则只有父亲结点为红色才导致红黑树失去平衡。重新调整平衡大致有两种情况:1. 伯父结点为红色2. 伯父结点为黑色伯父结点为红色:若伯父节点为红色,则爷爷节点为黑色。(爷爷结点黑色,父亲、伯父结点红色)同时将伯父w与父亲p结点置为黑色,这样,插入点x与父亲p结点处平衡(即红-红消失)原创 2013-11-29 10:23:43 · 2303 阅读 · 0 评论 -
排列生成算法--递归法
思想:第一个数与后面的数依次进行交换。例如求ABCD全排列。permutation(A,B,C,D) = A.permutation(B,C,D) + B.permutation(A,C,D) + C.permutation(B,A,D) + D.permutation(B,C,A)A.permutation(B,C,D) = AB.permutation(C,D) + AC.per原创 2013-10-16 12:21:49 · 977 阅读 · 0 评论 -
子集生成算法
本文地址:子集的生成:参考自:子集生成算法生成n个元素的子集,我认为可以这样理解:有n个不同的桶,编号1~n,每个桶最多放置一个球。遍历一遍桶,可以将球放入也可以不放入,这样,在遍历结束后,收集放置元素的桶,打印其编号,记得一个子集。而放与不放有2种选择,所以共有2^n个子集,这样,可以采用二进制的形式。示例:3个元素000 3个桶都不放球,空集001 第一原创 2013-07-30 22:17:25 · 3904 阅读 · 0 评论 -
排列生成算法--字典序法
本文地址:所谓字典序法就是按照字典排序的思想逐一产生所有排列。比如1,2,3,4四个数字进行全排列,先1234, 1243,1324,1342,1423,1432,…4321。由1243生成1324的过程:1. 1243从右向左找第一个正序对242. 从右向左找第一个大于2的数,33. 交换2与3的位置的:13424. 把3后面的数字全部反序的:1324总结:原创 2013-07-30 21:24:29 · 3202 阅读 · 0 评论 -
排列生成算法--序列法
序数法基于一一对应概念. 先在排列和一种特殊的序列之间建立 一种一一对应关系, 然后再给出由序列产生排列的方法。因为序列的产生非常方便, 这样我们就可以得到一种利用序列来生成排列的方法.原创 2013-07-29 20:13:05 · 2104 阅读 · 0 评论 -
红黑树(插入)
的原创 2013-07-28 09:17:20 · 3038 阅读 · 2 评论 -
不相交集及应用
法国法原创 2013-07-21 19:58:14 · 5505 阅读 · 3 评论 -
红黑树(删除)
得到原创 2013-07-21 09:23:57 · 27153 阅读 · 13 评论 -
最长公共子序列
嘟嘟嘟原创 2013-07-21 02:53:42 · 1181 阅读 · 0 评论 -
判断二叉树是否对称
碰见一个面试题,判断给定的一棵二叉树是否是对称的,即左右形状一直。想了想,思路来源于小时候罚写。左右子树同时遍历,若出现不一致,则说明不对称。代码如下:struct Node{ Node *left; Node *right; Node() { left = right = NULL; };};bool Judge(Node *leftRoot,原创 2013-07-18 11:43:21 · 7894 阅读 · 4 评论 -
八皇后问题
本文地址:http://blog.csdn.net/spch2008/article/details/9152713为求简单起见,先看四皇后问题。 所谓皇后问题,即任意两个皇后不能处于同一列,也不能同时处于同一行,而且还不能处于同一对角线上。 我们以列为单位进行放置,即同一列仅放置一个皇后, 1. 假设将皇后放于第一行第原创 2013-06-23 08:00:45 · 1728 阅读 · 1 评论 -
字典树 trie树
本文地址:http://blog.csdn.net/spch2008/article/details/9138557使用字典树来存储数据,数据是一个键值对,即键值-数值。字典树允许数据键值共享相同的前缀。本文采用的键值为字符串,数据如下:amy 56ann 15emma 30rob 27roger 52首先存入amy, level翻译 2013-06-20 17:00:16 · 1335 阅读 · 0 评论 -
KMP 字符串查找
本文地址:http://blog.csdn.net/spch2008/article/details/9097371KMP算法解析 这篇文章讲解的很详细:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html KMP算法实现原创 2013-06-15 17:02:44 · 1090 阅读 · 0 评论 -
最近点对
看了最近点对问题,实现一下,不知是否有错。#include using namespace std;struct Point{ Point(float x, float y) { this->x = x; this->y = y; } float x; float y;};float dist(Point &a, Point &b){ re原创 2013-03-29 10:09:31 · 908 阅读 · 0 评论 -
最大连续子序列问题
一、穷举法int MaxSubsequence(int *arr, int arrLen){ int maxSoFar = 0; int max = 0; for(int i = 0; i < arrLen; i++) { for(int j = i; j < arrLen; j++) { max = 0; for(int k = i; k原创 2013-02-27 16:23:37 · 1186 阅读 · 0 评论 -
伸展树——自顶向下
三种旋转 当我们沿着树向下搜索某个节点X的时候,我们将搜索路径上的节点及其子树移走。我们构建两棵临时的树──左树和右树。没有被移走的节点构成的树称作中树。在伸展操作的过程中:1、当前节点X是中树的根。2、左树L保存小于X的节点。3、右树R保存大于X的节点。开始时候,X是树T的根,左右树L和R都是空的。1、zig:原创 2013-01-15 15:48:15 · 3705 阅读 · 0 评论 -
树
概念路径:节点n1到nk的路径定义为节点n1,n2,……,nk的一个序列。路径长:为路径上边的条数。深度:ni的深度为从跟到ni的路径长。所以根的深度为0。高度:ni的高度为ni到树叶的最长路径的长度。实现由于树的儿子数量可以变化很大而且事先不知道,因此,从父节点建立到儿子节点的连接时不可行的。如果这样建立,会产生过多的空间浪费。struct Node{原创 2013-01-13 19:49:08 · 654 阅读 · 0 评论 -
桶排序与基数排序
桶排序 思想:要排序的数据的范围为小于M的正整数。这样,使用一个大小为M的bucket数组,数组初始化为0。 bucket数组的每个单元称为“桶”。然后依次扫描待排序数据(A1,A2,A3,A4,……,Ai),读到Ai的时候,bucket[Ai]增加1。 这样,待排序数据读完后,扫描数组bucket,打印出排序表即原创 2012-12-18 09:42:55 · 857 阅读 · 0 评论 -
二叉平衡树AVL
对于二叉查找树,由于不良数据,可能形成很不平衡的树。而且,在删除操作的时候,总是在右子树中寻找节点来代替删除节点,这样有助于左子树比右子树深,查找时间增加。虽然可以随机选取左子树的最大节点或右子树的最小节点来替代删除节点,来消除不平衡性。但通过这种做法来消除不平衡并没有被证实。所以,二叉平衡树应运而生。.hstruct Node{ i原创 2012-12-16 22:07:38 · 717 阅读 · 0 评论 -
二叉查找树
对于大量的输入数据,链表的线性访问时间太慢,不宜使用。取而代之,采用二叉查找树,其平均访问时间为O(logN).hstruct Node{ int data; Node *left; Node *right;};class BinaryTree{ public: BinaryTree(); ~BinaryTree(); void Insert(原创 2012-12-14 14:53:10 · 618 阅读 · 0 评论 -
左式堆 斜堆
左式堆第1,左式堆以二叉树的形式构建。第2,左式堆的任意结点的值比其子树任意结点值均小(最小堆的特性)。但左式堆不是一棵完全二叉树,而是一棵不平衡的树。第3,NPL是 null path length 的缩写,指的是从该结点到达一个没有两个孩子的结点(一个或无孩子)的最短距离,NULL的Npl为-1。左式堆左儿子的NPL大于等于 右儿子的 NPL,即左式堆是向左增原创 2012-12-12 21:15:20 · 5952 阅读 · 0 评论 -
堆
此处的堆,是一棵完全二叉树。.hclass Heap{ public: Heap(int capacity = 20); ~Heap(); bool IsFull() const; bool IsEmpty() const; int GetMin() const; int Delete(); void Insert(int); priv原创 2012-12-11 22:00:50 · 730 阅读 · 0 评论 -
选择问题——N个数中取第K个最大
一、简单排序 思路:将N个数从大到小排序,取第K个数 1.冒泡排序 void BubbleSort(int *arr, int arrLen){ int change = 0; for(int i = 0; i < arrLen-1; i++) { change = 0; for(int j = 0原创 2012-12-11 21:57:20 · 5129 阅读 · 0 评论 -
大整数素性测试
源代码:typedef long int HugeInt; HugeInt Witness(HugeInt A, HugeInt i, HugeInt N){ HugeInt X, Y; if(i == 0) return 1; X = Witness(A, i/2, N); if(X == 0) return 0; Y = ( X * X) % N翻译 2012-12-09 22:18:32 · 1822 阅读 · 0 评论 -
递归 求幂
1. 迭代算法long int pow(long int X, unsigned int N){ long int val = 1; for(int i = 0; i < N; i++) val *= X; return val;}2. 递归算法 long int pow(long int X, unsigned int N) { if(N =原创 2012-12-08 21:38:56 · 2300 阅读 · 0 评论 -
哈希表 平方探测再散列
1. 头文件 enum KindOfEntry{ Deleted, Empty, Legitimate};struct Node{ int key; KindOfEntry info;};class MyHash{ public: MyHash(int tableSize); ~MyHash(); void Insert(int key);原创 2012-12-08 14:37:02 · 7845 阅读 · 1 评论