PKU2418 HardwoodSpecies 平衡树
【题目】:HardwoodSpecies
【类型】:数据结构
【难度】:2
【来源】:PKU2418
【关键字】:平衡树 哈希
【题目大意】:有若干个植物名字,里面有重复的名字,把这些名字排序,然后算出这些名字出现的频率。
---------------------------------------------------------------------------------------------------------------
【分析】:
第一眼看这道题目,肯定是一种记录某个元素出现次数的排序问题,大概解决方法有这样几种:
1)快排+线性查找
2)排序二叉树
3)哈希判重+快排排序
当然,我用的是排序二叉树。
【方法1】:
BST排序搜索树。
当访问到某一节点时,如果插入的元素小于该节点的元素,那么访问该节点的左儿子;如果插入的元素大于该节点的元素,那么访问该节点的右儿子;如果插入的元素等于该节点的元素,那么在当前节点的访问次数上加1。
【方法2】:
AVL树是在BST树的基础上进行的平衡处理维护,每次插入的时间复杂度为O(log(2)N),而BST树有可能退化为一条链,使得时间复杂度退化为O(N)。
AVL树是指在某一节点的左儿子或者右儿子插入某一元素后,破坏了其原有的平衡,例如以这个节点的右儿子为根的子树的节点总数(包含其本身)小于以左儿子的左儿子或者左儿子的右儿子为根的子树节点总数(包含其本身),那么以这个节点为根的子树就是不平衡的。此时需要进行调整,以维持他的平衡。
调整方法:LL型:左子树的左子树节点大于右子树节点将根节点向右旋转。
LR型:左子树的右子树节点大于右子树节点将,左儿子节点向左旋转,然后根节点向右旋转。
RL型:右子树的左子树节点大于左子树节点将,右儿子节点向右旋转,然后根节点向左旋转。
RR型:右子树的右子树节点大于左子树节点将根节点向做旋转。
【方法3】:
SBT树是CQF神牛在WC2007上公布的一种他自己创造的平衡树算法,通过种种试验,SBT貌似是各种平衡树算法中性价比最高的一个。
具体内容详见CQF神牛在WC2007的论文。
【方法4】:
Treap平衡树,其实就是Tree+Heap,它是通过随机一个优先级q域,使得这棵树即满足data域的BST排序性质,又满足q域的大根堆或小根堆性质。它是平衡书中最好操作的一种,同时也是竞赛中选手最常使用的一种平衡树算法。