关联式容器
所谓关联式容器,观念上类似关联式数据库(实则更为简单):每笔数据或每个元素都有一个键值(key)和一个实值(value)。当元素被插入到关联式容器中时,容器内部结构(可能RB-tree,也可能是hash-table)便依照其键值大小,某种特定的规则将这个元素放置于适当的位置。关联式容器没有所谓的头尾,只有最大和最小元素,所以不会有所谓push_back()、push_front()、pop_back()、pop_front()、begin()、end()这样的操作行为。
一般而言,关联式容器的内部结构是一个balanced binary tree(平衡二叉树),以便获得良好的搜寻效率。balanced binary tree有许多种类型,包括AVL-tree、RB-tree、AA-tree,其中最被广泛运用于STL的是RB-tree(红黑树)。
树的导览
树,在计算机科学里,是一种十分基础的数据结构。几乎所有的操作系统都将文件存放在树状结构里:几乎所有的编译器都需要实现一个表达式树(expression tree);文件压缩所用的哈夫曼算法需要用到树状结构;数据库所使用的B-tree则是一种相当复杂的树状结构。而RB-tree则是一种被广泛运用、可提供良好搜寻效率的树状结构。
树由节点(nodes)和边(edges)构成。整棵树有一个最上端节点,称为根节点(root)。每个节点可以拥有具方向性的边(directed,edges),用来和其它节点相连。相连节点之中,在上着称为父节点(parent),在下着称为子节点(child)。无
子节点者称为叶节点(leaf)。子节点可以存在多个,如果最多只允许两个子节点,即所谓二叉树(binary tree)。不同的节点如果拥有相同的父节点,则彼此互为兄弟节点(siblings)。根节点至任何节点之间有唯一路径(path)路径所经过的边数,称为路径长度(length)。根节点至任一节点的路径长度,即所谓该节点的深度(depth)。根节点的深度永远是0。某节点至其最深子节点(叶节点)的路径长度,称为该节点的高度。整棵树的高度,便以根节点的高度来代表。节点A->B之间如果存在(唯一)一条路径,那么A称为B的祖代(ancestor),B称为A的子代(descendant)。任何节点的大小(size)是指其所有子代(包括自己)的节点总数。
二叉搜索树
所谓二叉树搜索树,该树“任何节点最多只允许两个子节点”。
这两个子节点称为称为左子节点和右子节点。如果以递归方式来定义二叉树,我们可以说:“一个二叉树如果不为空,便是由一个根节点和左右两颗子树构成;左右子树都可能为空”。二叉树的运用极广,先前提到的编译器表达树和哈夫曼编码树都是二叉树。
所谓二叉搜索树(binary search tree),可提供对数时间(logarithmic time)的元素插入和访问。二叉搜索树的节点放置规则是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个键值。因此,从根节点一直往左走,知道无左路可走,即得最小元素;从跟节点一直往右走,直到无右路可走,即得最大元素。
二叉搜索树的节点插入操作:
二叉搜索树的节点删除操作:
STL之关联式容器(一)
最新推荐文章于 2024-01-19 20:53:30 发布