随笔分类 -  数据结构

摘要:内核中的红黑树只是提供了一个管理机制,并没有提供具体的使用接口。需要使用者根据自己的使用环境去定义和实现自己的关键字(char,uchar, int, uint等类型)操作。这样可以更加灵活。 像内核中的链表,hash表的代码都是这种思想。 1 struct mytype 2 { 3 int num; 4 5 struct rb_node my_node; 6 }; 7 8 struct mytype *my_find(struct rb_root *root, int num) 9 { 10 struct rb_no... 阅读全文
posted @ 2013-04-16 20:57 only_eVonne 阅读(844) 评论(0) 推荐(0)
摘要:1 typedef struct st_rb_node { 2 /** 3 * 本结构体四字节对齐,因而其地址中低位两个bit永远是0。 4 * Linux内核开发人员非常爱惜内存,他们用其中一个空闲的位来存储颜色信息。 5 * parent_color成员实际上包含了父节点指针和自己的颜色信息。 6 */ 7 unsigned long parent_color; 8 #define RB_RED 0 9 #define RB_BLACK 1 10 struct st_rb_nod... 阅读全文
posted @ 2013-04-16 20:48 only_eVonne 阅读(2080) 评论(0) 推荐(0)
摘要:转自http://www.cnblogs.com/zhangchaoyang红黑树RB-treeRB-tree是满足以下4个条件的二叉查找树:每个节点不是红色就是黑色根节点为黑色不能存在两个连续的红色节点任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。以下所有操作,在新插入节点后,首先将新节点设为红色。按照二叉查找树的规则插入新节点后,如果新增节点的父 阅读全文
posted @ 2013-04-16 20:44 only_eVonne 阅读(259) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/v_JULY_v/article/details/6530142B树是一种平衡的多路查找树,一般应用在内存与外存需要频繁交换的场合。例如,在一个典型的B树的应用中,要处理的硬盘的数据量很大,无法一次全部装入内存。因此我们会使用B树,并且使B树的阶数 (节点的个数)与硬盘存储的页面大小相匹配,即一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。比如一颗b树的阶数为1 阅读全文
posted @ 2013-04-14 13:25 only_eVonne 阅读(469) 评论(0) 推荐(0)
摘要:红黑树和平衡二叉树(AVL树)类似,都是在进行插入和删除操作时通过特定旋转保持二叉查找树的平衡,从而获得较高的查找性能。红黑树和AVL树的区别在于平衡二叉树追求的是全局平衡,而红黑树只追求局部平衡,因此在操作时对红黑树的平衡调整更高效。红黑树并不是严格意义上的左右子树深度差不大于1,但它依然保持平衡,并保持好的查找时间复杂度。自从红黑树出来后,AVL树就被放到了博物馆里。 阅读全文
posted @ 2013-04-09 15:33 only_eVonne 阅读(2048) 评论(0) 推荐(0)
摘要:平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1;很显然,平衡二叉树是在二叉排序树(BST)上引入的,就是为了解决二叉排序树的不平衡性导致时间复杂度大大下降,那么AVL就保持住了(BST)的最好时间复杂度O(logn),所以每次的插入和删除都要确保二叉树的平衡变换规则:插入实例:{4, 5 ,7, 2, 1, 3, 6}实现代码:#include <stdio.h>#include & 阅读全文
posted @ 2013-04-09 14:09 only_eVonne 阅读(311) 评论(0) 推荐(0)
摘要:二叉树首先是一棵树,每个节点都不能有多于两个的儿子,也就是树的度不能超过2。二叉树的两个儿子分别称为“左儿子”和“右儿子”,次序不能颠倒。如图1是一个简单的二叉树。二叉树的种类一种是满二叉树,除了最后一层的叶子节点外,每一层的节点都必须有两个儿子节点。如图2是一个满二叉树。另一种是完全二叉树,一棵二叉树去掉最后一层后剩下的节点组成的树为满二叉树,最后一层的节点从左到右连续,即所有的结点都连续集中在最左边。这样的树称为完全二叉树。如图3是一棵完全二叉树。满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树二叉树的实现因为一棵树有最多只有两个儿子,所以我们可以用指针直接指向他们。一个节点包括值(d 阅读全文
posted @ 2013-04-06 12:16 only_eVonne 阅读(440) 评论(0) 推荐(0)
摘要:无论是链表,栈还是队列,它们都是线性结构的,每个节点的左边最多一个节点,右边也最多一个节点,对于大量的输入数据,线性表的访问时间太慢,不宜使用。这里我要说一种非线性的数据结构,其大部分操作的运行时间平均为O(logn)。我们涉及到的这种数据结构叫做树。在计算机科学中,树是非常有用的抽象概念。我们形象的去描述一棵树,一个家族的老祖可能有两个儿子,这两个儿子一个有一个儿子,一个有三个儿子,像这样发展下去的一个族谱,就是一个树,如图1所示。就像一棵真正的树一样,我们把老祖称为树根,两个字儿是分叉开的两个树枝,这两棵树枝可以继续向下分成N个树枝,循环下去,一直到长出叶子为止。我们把老祖或者树根称为根( 阅读全文
posted @ 2013-04-06 12:08 only_eVonne 阅读(769) 评论(0) 推荐(0)
摘要:所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。一.插入排序插入排序的基本思想是每步将一个待排序的记录按其排序码值的大小,插到前面已经排好的文件中的适当位置.. 阅读全文
posted @ 2011-12-12 15:46 only_eVonne 阅读(1844) 评论(0) 推荐(0)
摘要:1.哈希表的概念:哈希是一种重要的存储方法,也是一种重要的查找方法。它的基本思想是:以关键字K为自变量,通过一个确定的函数f,计算出对应的函数值f(k),把这个值解释为关键字等于K的结点的存储地址。查找时,再根据要查找的关键字用同样的函数计算地址,然后到相应的存储单元取出要查找的结点。按这个思想建立的表,称为哈希表,称函数f为哈希函数,称f(k)的值为哈希地址。哈希表实例:已知线性表的关键字集合为:S={and,begin,do,end,for,go,if,then,until}则可设哈希表为:charHT[26][8]哈希函数H(key)的值,可取关键字key中第一个字母在字母表中的序号(0 阅读全文
posted @ 2011-10-16 11:10 only_eVonne 阅读(15393) 评论(0) 推荐(0)
摘要:hash定义:把任意长度的输入,通过hash算法,变换成固定长度的输出。输出的空间通常远小于输入值的空间。 数学表达式:h = H(M) 其中H()为单向hash算法,M为任意长度输入,h为固定长度的输出一般应用的Hash算法,还需要满足其他关键特性: 第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计算上不可能 构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应的M=H-1(h)不可行。 这样,散列值就能在统计上唯一的表征输入值,因此,密码学上的 Hash 又被称为"消息摘 要(message digest)",就是要求能方便的将&q 阅读全文
posted @ 2011-10-15 21:23 only_eVonne 阅读(1314) 评论(0) 推荐(0)