玩转算法与数据结构(二)

转接上一篇,地址:https://blog.csdn.net/q1119823309/article/details/90703135
我的码云地址:码云地址

开始

1. 二分查找

二分查找针对的是有序数组,不断将数组对半分,判断 target 在哪个位置知道找到 target 或不可再分。
注意:为保证数据不溢出,在取mid值时需:mid = l + ( r - l ) / 2 。

  • 对于重复数据较多的数组:
    floor 函数:找到重复 target 第一个位置,如果没有 target 返回前一个位置,没有前一个位置,返回 -1
    ceil 函数:找到重复 target 最后一个位置,如果没有 target 返回后一个位置,没有后一个位置,返回 -1

2. 二分搜索树

优势:查找、插入、删除 均为O(logn)

二分搜索树是二叉树, 每个节点的键值大于左孩子,小于右孩子,中序遍历二分搜索树是有序的。

深度优先遍历:前序遍历,中序遍历,后序遍历 (非递归需要借助堆栈)
广度优先遍历:层序遍历(需要借助队列queue)

  • 删除
    当被删节点左子树为空时,删除节点,并把指向被删节点的索引指向右子树
    当被删节点右子树为空时,删除节点,并把指向被删节点的索引指向左子树

当左右子树都不为空时,使用 Hubbard Deletion 对节点进行删除,被删除节点可以被该节点的前驱或者后继代替。
前驱:即被删除节点的左子树的最大值;后继:即被删节点的右子树的最小值。

floor:如果node的key值和要寻找的key值相等,则node本身就是key的floor节点,如果node的key值比要寻找的key值大,则要寻找的key的floor节点一定在node的左子树中,如果node->key < key, 则node有可能是key的floor节点, 也有可能不是(存在比node->key大但是小于key的其余节点),需要尝试向node的右子树寻找一下

ceil:与floor相反,如果node的key值和要寻找的key值相等,则node本身就是key的ceil节点,如果node的key值比要寻找的key值小,则要寻找的key的ceil节点一定在node的右子树中,如果node->key > key, 则node有可能是key的ceil节点, 也有可能不是(存在比node->key小但是大于key的其余节点),需要尝试向node的左子树寻找一下

rank:找到key值为排名第几的元素,可以添加一个节点数的记录值,每个节点记录自己及下面的节点数
select: 找到排名第几的元素,与rank类似,根据节点数来查找。
需要维护insert和remove方法。

如果需要支持重复元素的二分搜索树,则每个节点添加count来记录重复值。

同样的数据会组成不同的二分搜索树,有可能会退化成链表。仅有右子树或左子树
解决方案:
平衡二叉树:红黑树(著名的实现),2-3 tree,AVL tree,Splay tree

扩展:平衡二叉树和堆的结合:treap
字典树:trie

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值