📌  相关文章
📜  Van Emde Boas树|套装4 |删除中(1)

📅  最后修改于: 2023-12-03 15:20:56.745000             🧑  作者: Mango

Van Emde Boas树套装4 - 删除中

简介

Van Emde Boas树是一种维护整数集合的高效数据结构,支持快速的查找、插入和删除操作。它的时间复杂度为O(log log n),具有理论上最优的复杂度。

这里介绍的是Van Emde Boas树的第四个套装——删除中。在Van Emde Boas树中,删除操作没有直接的实现方式,而是通过标记某个数已经被删除了来实现。当删除操作数量增加时,需要进行删除操作的节点数量也会随之增加,最终可能导致整棵树变得不稳定。因此,需要引入删除中这一套装来优化删除的性能。

原理

在删除中的Van Emde Boas树中,我们使用一个array来记录每个节点被删除的情况。具体而言,若节点i被标记为删除,则array[i]=1;否则array[i]=0。这里的array的大小和树的节点总数是一致的。

当执行删除操作时,我们只需要在array中标记被删除的节点即可,而不需要对树的结构进行改变。当进行查询操作时,若发现某个节点被标记为删除,则说明该节点已经不存在,需要继续向下查找。

在这种情况下,Van Emde Boas树的复杂度依然为O(log log n),时间效率优越,而且可以避免删除操作导致的不稳定性问题。

代码示例
# 初始化
class VEB:
    def __init__(self, u):
        self.u = 1  # 2的幂次
        while self.u < u:
            self.u *= 2
        self.min = None
        self.max = None
        if u <= 2:
            self.summary = None
            self.cluster = []
        else:
            self.summary = VEB(self.high())
            self.cluster = [VEB(self.low()) for i in range(self.high())]
        self.array = [0] * self.u

    # 计算高位
    def high(self):
        return self.u // 2

    # 计算低位
    def low(self):
        return self.u - self.high()

    # 查询
    def member(self, x):
        if x == self.min or x == self.max:
            return True
        elif self.u <= 2:
            return False
        else:
            return self.cluster[self.high_bit(x)].member(self.low_bit(x))

    # 最小值查询
    def minimum(self):
        return self.min

    # 最大值查询
    def maximum(self):
        return self.max

    # 查找后继元素
    def successor(self, x):
        if self.u == 2:
            if x == 0 and self.max == 1:
                return 1
            else:
                return None
        elif self.min is not None and x < self.min:
            return self.min
        else:
            max_low = self.cluster[self.high_bit(x)].maximum()
            if max_low is not None and self.low_bit(x) < max_low:
                offset = self.cluster[self.high_bit(x)].successor(self.low_bit(x))
                return self.index(self.high_bit(x), offset)
            else:
                succ_cluster = self.summary.successor(self.high_bit(x))
                if succ_cluster is None:
                    return None
                else:
                    offset = self.cluster[succ_cluster].minimum()
                    return self.index(succ_cluster, offset)

    # 插入
    def insert(self, x):
        if self.min is None:
            self.min = x
            self.max = x
        else:
            if x < self.min:
                x, self.min = self.min, x
            if self.u > 2:
                if self.cluster[self.high_bit(x)].minimum() is None:
                    self.summary.insert(self.high_bit(x))
                    self.cluster[self.high_bit(x)].insert(self.low_bit(x))
                else:
                    self.cluster[self.high_bit(x)].insert(self.low_bit(x))
            if x > self.max:
                self.max = x

    # 删除
    def delete(self, x):
        if self.min == self.max:
            self.min = None
            self.max = None
        elif self.u == 2:
            if x == 0:
                self.min = 1
            else:
                self.min = 0
            self.max = self.min
        else:
            if x == self.min:
                first_cluster = self.summary.minimum()
                x = self.index(first_cluster, self.cluster[first_cluster].minimum())
                self.min = x
            self.array[x] = 1
            if self.cluster[self.high_bit(x)].minimum() is None:
                self.summary.delete(self.high_bit(x))
                if x == self.max:
                    summary_max = self.summary.maximum()
                    if summary_max is None:
                        self.max = self.min
                    else:
                        self.max = self.index(summary_max, self.cluster[summary_max].maximum())
            elif x == self.max:
                self.max = self.index(self.high_bit(x),self.cluster[self.high_bit(x)].maximum())

    # 计算高位
    def high_bit(self, x):
        return x // self.low()

    # 计算低位
    def low_bit(self, x):
        return x % self.low()

    # 计算原始下标
    def index(self, high, low):
        return high * self.low() + low

本示例为Python代码,实现了Van Emde Boas树的基本操作和删除中操作。示例中使用array记录删除状态,insert操作和delete操作中添加了相应的处理。