最近对存储/更新/检索 比较感兴趣,树是传统数据库实现索引的主要方式,所以抽空整理学习一下。
最基本的二叉查找树: http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9
左右节点,内部节点和叶子节点都会存储数据;实现简单,遍历方便,平均高度是logN,但可能退化成N。
实际情况一般使用BST的变种,比如红黑树,AVL树,他们可以保证logN的高度。STL中set,map等数据结构使用的是就红黑树。
红黑树: http://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91
B树:http://en.wikipedia.org/wiki/B-tree
平衡树,但是每个节点的子节点可能会多于2个,子节点和叶子节点都可能存储数据,多用在文件系统和数据库中;
B+树:http://en.wikipedia.org/wiki/B+_tree
B树的变种,只在叶子节点中存储数据。
B树和B+树的些微区别
实现树型目录结构文件系统,常采用二叉树,其中每个节点都有父指针,子指针和兄弟指针,其中子指针指向该目录下的第一个子节点,而该子节点的父指针则指向 它的上级目录。目录下各子节点用兄弟指针连接起来。大型文件系统一般采用B+树实现,而不采用B树,这时因为:在B树中,分支节点和叶子节点均保存记录的 关键码和记录的指针;在B+树中,分支节点只保存记录关键码的复制,无记录指针,所有记录都集中在叶节点一层,并且叶节点可以构成一维线性表,便于连续访 问和范围查询。由于在B树的叶子节点中直接就包含记录,导致了叶节点能存放的SearchKey数目减少,同样大的文件相应的需要的节点数目就增多了,树 的高度也较B+树深了很多。对于同样阶的B树和B+树,B+树的树高和平均检索长度均大于B树(因为B+树必须检索到叶节点一层);但实际检索过程中,最 耗时间的是I/O,也就是访盘次数越少越好。B+树的分支节点无记录指针,同样一个盘块可以存放的关键码数就更多,所以虽然平均检索长度大,但访盘次数反 而少,文件操作的速度也就比B树快。