
数据结构
Nestler
这个作者很懒,什么都没留下…
展开
-
【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,几乎所有的操作都是转调用hash table提供的接口。由于插入无法存储相同的键值,所以hash_set的插入操作全部都使用hash table的insert_unique接口,代码如下:pair insert(const value_type& obj){ pair p = rep.insert_unique(obj);原创 2014-05-12 09:25:17 · 1421 阅读 · 0 评论 -
【STL】关联容器 — 红黑树
set、map、multiset、multimap四种关联式容器的内部都是由红黑树实现的。在STL中红黑树是一个不给外界使用的独立容器。既然是容器,那么就会分配内存空间(节点),内部也会存在迭代器。关于红黑树的一些性质,可以参考“数据结构”中的笔记,这里只记录STL中的红黑树是如何实现的。和slist一样,红黑树的节点和迭代器均采用了双层结构:节点:__rb_tree_no原创 2014-05-07 11:17:15 · 2066 阅读 · 0 评论 -
【STL】关联容器 — map
和set类似,也采用了rb_tree作为底层容器,但每个节点是一个pair对象,它关联了键值和实值。键值不允许修改,但实值是可以修改的,等下的代码也会有所说明。下面是map的代码框架:template class Key, class T, class Compare = less, class Alloc = alloc> // 默认采用递增顺序class原创 2014-05-09 13:56:56 · 986 阅读 · 0 评论 -
【STL】关联容器 — hash_map
hash_map和map的用法很相似,只是底层机制有所不同。hash_map容器采用的底层机制是hash table代码:template , class EqualKey = equal_to, class Alloc = alloc>class hash_map{private: typedef hashtable, Key原创 2014-05-12 10:25:25 · 1342 阅读 · 0 评论 -
【STL】关联容器 — set
set中的key就是value,value就是key,并且key是唯一的,利用红黑树有序地存储(红黑树在插入时自动调整)。正因为有序,所以无法通过迭代器随意修改key,否则顺序会打乱。set的底层容器就是rb_tree,有了tr_tree的基础,set的就很好理解了,很多的接口都只是转调用rb_tree的操作。整体代码如下:template class Key, class C原创 2014-05-09 13:56:25 · 914 阅读 · 0 评论 -
【STL】关联容器 — hashtable
C++ 11已将哈希表纳入了标准之列。hashtable是hash_set、hash_map、hash_multiset、hash_multimap的底层机制,即这四种容器中都包含一个hashtable。解决碰撞问题的办法有许多,线性探测、二次探测、开链等等。SGI STL的hashtable采用的开链方法,每个hash table中的元素用vector承载,每个元素称为桶(bucke原创 2014-05-11 09:37:52 · 1499 阅读 · 0 评论 -
红黑树
红黑树是一个二叉搜索树,具有如下规则:每个节点不是红色就是黑色。根节点必须为黑色。如果节点为红,其子节点必须为黑,父子节点不得同时为红。任一节点至NULL(NULL为黑色)的任何路径,所含黑节点数必须相同。根据规则4,新增节点必须为红。根据规则3,新增节点的父节点必须为黑。因为新增节点必须是红,那么只有在父节点不为黑的时候才需要调整,父节点为黑则无需调整。着原创 2014-05-13 20:23:12 · 1023 阅读 · 0 评论 -
栈的应用 — 平衡符号
编译器可用此算法来检查括号是否成对出现,算法使用了一个栈。算法描述:做一个空栈。读入字符直到文件尾。如果字符是一个开放括号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。根据上面的描述,自己写了一份代码,它只能处理小、中、大三种括号:#include原创 2014-04-28 19:52:30 · 1521 阅读 · 0 评论 -
栈的应用 — 逆波兰记法
逆波兰记法又称为后缀记法,把操作符放置于操作数后面,计算过程通常用栈来实现的,通过栈来保存中间结果,使得逆波兰记法没有必要知道任何优先规则。方法描述:当见到一个数时就把它推入栈中;在遇到运算符时该运算符就作用于从该栈弹出的两个数上,将结果推入栈中。下面演示计算后缀表达式的过程。后缀表达式:6 5 2 3 + 8 * + 3 + *四个数字入栈:6 5 2 3(→栈生原创 2014-04-28 19:51:16 · 1020 阅读 · 0 评论 -
栈的应用 — 中缀式转后缀式
由中缀式转换成后缀式,同样使用栈,并运用一些规则来完成。规则介绍如下:当读到的是操作数,立即输出。当读到的是运算符,则先从栈中弹出优先级高于自己的运算符(不包含括号),自己入栈。读到左括号入栈,读到右括号则将栈中元素出栈并输出,直到遇见左括号(括号都不输出)。输入为空后,将栈元素弹出并输出直到栈空。注意,最后生成的后缀表达式是考虑了运算符优先级的,再配合逆波兰的无优先级概念这一性质原创 2014-04-28 19:54:10 · 1074 阅读 · 0 评论 -
AVL树
一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。实际高度只比logN多以一点,和普通二叉查找树相比,平衡二叉搜索树一般而言搜寻时间可节省25%左右(STL源码剖析P203)。只有那些从插入点到根节点的路径上的节点的平衡可能被改变,因为只有这些节点的子树可能发生变化。把需要重新平衡的节点称为a(左右子树高度差大于1)。注意,确定这个节点很重要,否则无法确定原创 2014-05-04 17:06:10 · 1085 阅读 · 0 评论 -
二叉查找树
一棵树是N个节点和N-1条边的集合。因为,每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲。二叉树:每个节点都不能有多于两个的儿子。深度平均值为O(logN)。使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。在程序中,一定要记得处理的根节点为空的情况。除了删原创 2014-04-29 15:51:18 · 967 阅读 · 0 评论 -
散列表
散列表是一种ADT。散列表的实现常常叫做散列(hashing),它是一种用于以常数平均时间执行插入、删除、查找的技术。需要元素间任何排序信息的操作将不会得到有效的支持。例如FindMax、FindMax、按序输出等。散列表的关键是确定散列函数,《数据结构与算法分析》中提到了几种散列函数,但都不是完美的。能解决冲突但有可能散列表占用率不高。字符串中的字符不是随机出现,这也影响到了散列表的原创 2014-05-15 20:13:02 · 1028 阅读 · 0 评论 -
用并查集求朋友圈数目
题目:假如已知有n个人和m对好友关系,如果两个人是直接或者间接有好友关系,则认为他们属于同一个朋友圈。写程序判断里面有多少朋友圈。例如:n = 5, m = 3 r = {(1,2), (2, 3), (4, 5)} 1 2 3 是一个朋友圈, 4 5 是一个朋友圈。所以输出是2原创 2014-08-22 10:50:06 · 2175 阅读 · 0 评论