6. 哈希表与平衡二叉树
6.1 全域散列(UniversalHashing)
根据假设可知,有边为0,那么求碰撞的概率转化为求左边等式等于0的概率,可以证明左边等式是集合中的一个随机元素。
可以举例子n=7, x4-y4=2 or3,a4=0,1,2,3,4,5,6时,计算左边的值。
所以可以看到为0的概率为1/n,这样碰撞的概率也是1/n。
6.2 链式哈希表的性能分析
假设对数据集S进行哈希时,是通过全域哈希簇中随机的一个哈希函数,并且每个哈希函数是链式实现,有n个buckets。
那么所有操作的时间复杂度为O(1)。这里以查询操作为例进行证明。
证明之前,将条件进行一下声明,这里的哈希函数是从全域散列中随机选取的;数据集S的数量为O(n),通常S的元素个数与n的比值α成为装载因子,为O(1),在链式哈希表中,装载因子可以大于1,而开放式地址法中是不可能超过1的;通过哈希函数h计算的过程复杂度为O(1)。
6.3 Bloom Filter
Bloom Filter支持插入和查找,注意,不支持删除。Bloom Filter能够保证只要插入过就能查找成功,但是存在较小的概率对于未插入过的元素也查找成功。
Bloom Filter由于其在较小空间下的高效性,使得应用十分广泛,其最早用于拼写错误的查找,现在还用于非法密码的监测和网络路由中。
Bloom Filter由两部分组成,一个是n维的比特数组A,即数组中的每个元素非0即1;另一个是k个哈希函数,k值为常数也不会太大。
6.4 平衡二叉搜索树
平衡二叉树的构造:每个节点有一个key值;节点有左右叶子节点指针和双亲指针;每个节点的叶子节点不会超过2个。
BST的特点:对于节点x,任意;任意.
BST的一些操作:
BST中的查找search(key k)
--start at root
--if k<key traverse left
--if k>key traverse right
BST中的插入insert(key k):
--search for k (unsuccessfully)
--rewrite final nul pointer to point to thenew node with key k
BST中的Min/Max:
--start at root
--follow left (right) child pointers untilyou cann’t anymore
--return
BST中的前驱和后继节点的访问:
--if k’s left subtree no-empty, return maxkey in left subtree
--otherwise: follow parent pointers untilyou get to a key less than k
BST中按序访问(即二叉树的中根遍历):
--let r=root of BST with usbtrees Tl and Tr
--recurse Tl
--print r
--recurse Tr
BST中的删除(k):
--search for k
--if k node has no children just delete knode
--if k node has one child, just splice outk node (替换)
--if k node has two children,
--computer k’s predecessor L
--swap k and L
注,BST中的search/insert/deletion操作,在最坏的情况下,是O(Height).
BST可以用于查找第i大或小的元素,这里需要树中的每个节点存储额外的信息来便于处理,任意节点x,其存储了size(x),若y和z为x的孩子节点,则size(x)=size(y)+size(z)+1.
6.5 红黑树
在BST中的search和insert都和树的高度有关,红黑树通过一些设定,可以保证这两者的执行时间为O(logn).
红黑树的特性:每个节点为红或者黑;根节点是黑色的;在每一行没有2个节点同时为红的情况发生(所谓的同一行,这里说的是父子两个节点,这个条件也就是说红色节点的孩子节点只有可能为黑);从根出发到叶子节点的路径上黑节点的数目等同。
注:长度为3的链表不能为一颗红黑树。