Foreward
这个问题含糊不清,所以我会做一些假设。
首先,我们尝试在[0到M]范围内表示设置数字,其中M是一个相当小的数字,如100,000。
BST可以简单地包含集合中的元素。
位图只能是M位长,如果该位置的数字在集合中,则设置一个位,否则,该位数不在该集合中。我将假设已经创建了一个大小为M的位图。
在这个答案中,我考虑Self-Balancing Binary Search Trees和Bitmaps - 对于非平衡BST,您必须处理每个操作的最佳情况,平均情况和最坏情况。
运营和复杂性
插入:将n添加到集合中。
- BSTs 需要O(log(n))时间才能插入。
- 位图需要对目标位执行简单的(OR 1)操作,并进行快速分割并进行一些移位以将1放在正确的位置,但仍然保持为O(1)。
删除:从集合中删除n。
- BSTs 找到该元素,然后删除它,然后旋转树,这样整体为O(log(n))。
- 位图需要对目标位执行简单的(AND 0)操作,并进行快速分割并进行一些移位以将1放在正确的位置,但仍然保持为O(1)。
查找:集合中是否为n?
- BSTs 以O(log(n))查找n。
- 位图返回特定目标位上的(AND 1)值,进行除法并移位以将1放在正确的位置,整体为O(1)。
设置交集:这里有两组,哪些是相同的。
设置联盟:这是2套,合并它们。
- BSTs :通过在BST1和BST2之间交替进行BST1和BST2的广度优先遍历,将BST1和BST2中的所有元素添加到其中来创建新的BST。如果元素已经存在,则不要再添加它。总的来说,这就像O(n * log(n))。
- 位图:与设置交集相同,但使用(OR)操作。 O(M)其中M是位图范围的大小。
问题中的歧义
- 这些集(数字,对象)中存储的项目是什么
- 是否要对二进制搜索树进行自我平衡分析?
- 这是从一个相当小的有限范围中选择的一组吗? (即可以用Bitmap完成吗?)
- 目前还不清楚优化时间复杂度的含义,虽然它似乎意味着“此数据结构上此操作的平均情况下,已知最低的Big-O(上限)是多少?”
结论
对于所有这些操作,位图优于自平衡BST。
包含/排除位图的缺点:
- 您只存储包含/排除,并且不存储有关该元素的任何数据。
- 仅适用于整数,或者以1对1方式散列为整数的对象(如果散列函数是可逆的,则可以将对象取回。)
- 您必须拥有固定范围的元素,例如0到100,000的整数。
- 固定范围必须相当小,例如小于1亿。
- Union和Intersection取决于Range Size,而不取决于所代表元素的数量。