![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DataStructure
dadaguo3000
这个作者很懒,什么都没留下…
展开
-
队列
<br />如果保持在队列中删除和添加节点,当分配和释放节点时,将使可用的内存碎片化.对于通过链表实现的队列,可以有两种选择.<br />第一种选择是使用自己的函数来分配和返回内存.这个函数将分配一个节点池.然后使用和返回这些节点.<br /> <br />第二种选择是创建一个未使用节点的链表.当把项目添加到队列中时,就把节点从空闲链表移到队列中;<br />当项目出队时,就把节点返回到空闲链表中。原创 2010-12-10 19:39:00 · 408 阅读 · 0 评论 -
选择排序
<br />选择排序的基本思想是:每步从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列的最后,直到全部排完为止。<br />直接选择排序的基本思想是,每一趟排序在n-i+1(i=1, 2, ... n-1)个记录中选取关键字最小的记录,并和第i个记录进行交换。<br /> <br />选择排序算法的时间复杂度为O(n2)。原创 2011-01-06 19:47:00 · 317 阅读 · 0 评论 -
插入排序
<br />插入排序的基本思想是:每一趟将一个待排序的纪录按其关键字值的大小插入到已经排序的部分文件中的适当位置,直到全部插入完成。<br />目前插入排序有两种:直接插入排序和希尔排序。<br /> <br />直接插入排序<br />基本思想是依次将每个记录插入到一个有序的序列中去。<br />假设记录存放在r[1..n]之中,r[1..i-1]是已排好序的记录,r[i..n]是没排序的记录。<br />插入排序是将未排序的r[i..n]中的r[i]插入到r[1..i-1]中,使r[1..i]成为有序,原创 2011-01-05 21:20:00 · 351 阅读 · 0 评论 -
归并排序
归并排序就是将两个或两个以上的有序数据序列合并成一个有序数据序列的过程。时间复杂度为O(nlog2n)。原创 2011-01-06 20:09:00 · 286 阅读 · 0 评论 -
交换排序
<br />交换排序的基本方法是:两两比较待排序记录的排序关键字,并交换不满足顺序要求的那些偶对,直到全部满足为止。<br /> <br />冒泡排序:<br />通过无序区中相邻记录关键字间的比较和位置交换,使关键字最小的记录如气泡一般逐渐往上“漂浮”至“水面”。整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较,且使关键字较小的记录换至关键字较大的记录之上,使得经过一趟冒泡排序后,关键字最小的记录,并把它换在第二个位置上。依此类推,一直到所有记录都有序为止。<br /> <br /> <br /原创 2011-01-15 12:10:00 · 396 阅读 · 0 评论 -
(转)关于一道1到N自然数排序的华为面试题
一个算法!原创 2010-11-23 09:38:00 · 473 阅读 · 0 评论 -
单向链表的排序
<br />快速排序非常适合在数组上实现,但不适合在链表上实现,可以在链表上实现的有价值的排序算法主要有插入排序,归并插入排序和基数排序3种。<br /> <br />原创 2011-01-23 11:33:00 · 653 阅读 · 0 评论 -
代码自动生成-宏带来的奇计淫巧
<br />宏有一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种类型的代码(类型替换),那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。<br /> <br />1.宏可以像函数一样被定义。<br /> <br />2.如果宏需要参数,你可以不传,编译器会给你警告(宏参数不够),但是这会导致错误,如C++书籍中所描述的,编译器(预处理器)对宏的语法检查不够,所以更多的检查性工作得你自己来做。<br /> <br />3.#符号把一个符号直接转换为字符串,例如<br />#d转载 2011-02-25 11:25:00 · 655 阅读 · 0 评论 -
基数排序
<br />基数排序是一种分类的方法.<br /> <br />在计算机处理中,对整数排序不会使用10作为基数,因为计算机里的整数都是二进制的数,因此可以使用16或256为基数来处理,因为这样可以使用位操作来取出整数中对应的位,效率比取十进制的位要高。通常,基数排序在数据非常多的时候排序效率才会提高,一般在几十万条记录时,基数排序的效率比归并排序好。<br /> <br />基数排序过程中有两个基本操作,一个是将数据根据基数分类放到对应的箱子中,这个操作被称为分配操作;另一个是依次将各个箱子的数按顺序连成一原创 2011-02-20 16:57:00 · 368 阅读 · 0 评论 -
哈希表
<br />哈希表的构造方法<br />1.直接定址法<br />2.数字分析法<br />3.折叠法<br />4.除留余数法<br /> <br />哈希表的处理冲突方法<br />1.开放定址法<br />2.再哈希法<br />3.链地址法<br />4.建立一个公共溢出区<br />公共溢出区是指另外设立存储空间来处理哈希冲突。假设哈希函数的值域为[0,m-1],则设向量HashTable[0, m-1]为基本表,另外设立存储空间向量OverTable[0, v]用以存储发生冲突的记录。<br /原创 2011-01-03 00:17:00 · 1152 阅读 · 0 评论 -
Linux内核链表
<br /> 2.4内核中的链表结构核2.6并没有太大区别。二者不同之处在于2.6扩充了两种链表数据结构:链表的读拷贝更新(rcu)和HASH链表(hlist)。这两种扩展都基于最基本的list结构。<br /> <br />链表数据结构定义:<br />struct list_head { struct list_head *next, prev;};<br />这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。<br />原创 2011-01-01 12:03:00 · 426 阅读 · 0 评论 -
glib库中的哈希函数和比较函数
<br />http://www.cppblog.com/aurain/archive/2010/07/06/119463.html<br />哈希表是一种key-value访问的数据结构,通过指定的key值可以快速的访问到与它关联的value值。hash表的一种典型用法就是字典,通过单词的首字母可以快速的找到单词。<br /> <br />typedef char gchar;typedef short gshort;typedef long glong;typedef int原创 2010-12-10 00:34:00 · 872 阅读 · 0 评论 -
Hash函数
<br />良好的Hash函数具有两个令人称心如意的特点:<br />一是快速的,并且它会把散列键均匀地分布在整个表中。<br />二是它还必须弥补可能出现在输入数据中的聚集(聚集是具有近似元素值得数据的趋势),对于相同的数据项,它必须总是产生相同的散列键。<br /> <br />如满足以下条件,散列函数一般将快速工作:<br />它们最多含有一个除法运算(一般是最终的模运算)<br />它们生成广泛的散列键<br />它们不依赖于将促使产生聚集的数据属性原创 2010-12-13 20:32:00 · 354 阅读 · 0 评论 -
查找
<br />一组算法通过利用字符串属性(Boyer-Moore算法)或者通过同时查找多个目标字符串(Aho-Corasick算法以及正则表达式查找)来减少查找时间。另一组算法为多个目标字符串通过近似查找(Aho-Corasick算法,也就是正则表达式查询)来减少查询时间。<br />第二组算法则是寻找近似的匹配。可以利用模板(grep)、通过距离指标或者通过两个单词的发音(Soundex 和Metaphone)来指定近似匹配的类型。<br /> <br />原创 2010-12-16 20:35:00 · 288 阅读 · 0 评论 -
switch
<br />暴力算法-----<br />一种解决方案是使用switch语句。许多编译器会把switch语句实现为一个跳转表(jump table),而不是一系列的if/else条件(跳转表是一个已知大小的数组,其元素由指向可执行代码的指针组成)。<br /> <br />当switch语句控制大量的case时尤其如此。当使用跳转表时,switch中的变量只需测试一次,即可跳转到相应case语句的代码上。<br /> <br />不幸的是,C语言不允许在运行时评估case语句;因此,诸如case *stri原创 2010-12-16 21:19:00 · 276 阅读 · 0 评论 -
多字符串查找
<br />没看懂,用示例程序中的程序运行,居然出错,可能是我使用用法不对。<br /> <br />太难了,以后需要静下心好好看看这500行代码!原创 2010-12-20 23:27:00 · 457 阅读 · 0 评论 -
Boyer-Moore查找
<br />启发式方法#1:跳过字符<br />启发式方法#2:重复模式(没看懂)<br /> <br />原创 2010-12-19 21:11:00 · 274 阅读 · 0 评论 -
红黑树
<br />1.红黑树的定义<br />红黑树是指满足下列条件的二叉搜索树:<br />(1)每个节点要么是红色,要么是黑色<br />(2)所有的叶节点都是空节点,并且是黑色<br />(3)如果一个节点是红色,那么它的两个子节点都是黑色<br />(4)节点到其孙子节点的每条简单路径都包含相同数目的黑色节点<br />(5)根节点永远是黑色的<br /> <br />从根节点到叶节点的黑色节点数被称为树的黑色高度(black-height)。<br />从根节点到叶节点的路径长度不会超过任何其他路径的两原创 2011-01-01 15:19:00 · 500 阅读 · 0 评论 -
循环链表
<br />循环链表和单链表的唯一差别在于单链表中,算法判断到达链表尾的条件是p->next是否为空,而在双链表中,则是判断P->next是否等于头指针。原创 2011-01-01 11:11:00 · 310 阅读 · 0 评论 -
hlist
来自:http://blog.csdn.net/zhanglei4214/article/details/6767288在Linux内核中,hlist(哈希链表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和hlist相关的数据结构有两个(1)hlist_head和(2)hlist_nodestruct hlist_head { struct hlist_转载 2012-07-21 11:00:49 · 2001 阅读 · 0 评论