位图或二进制搜索树

时间:2012-07-16 13:44:52

标签: bitmap binary-search-tree

以下哪种数据结构最适合插入,删除,查找,设置交集,联合?优化时间复杂度。

  1. 位图
  2. 二进制搜索树

1 个答案:

答案 0 :(得分:3)

Foreward

这个问题含糊不清,所以我会做一些假设。

首先,我们尝试在[0到M]范围内表示设置数字,其中M是一个相当小的数字,如100,000。

BST可以简单地包含集合中的元素。

位图只能是M位长,如果该位置的数字在集合中,则设置一个位,否则,该位数不在该集合中。我将假设已经创建了一个大小为M的位图。

在这个答案中,我考虑Self-Balancing Binary Search TreesBitmaps - 对于非平衡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)。

设置交集:这里有两组,哪些是相同的。

  • BST :以MergeSort类型的方式对两个BST进行按顺序遍历,如果两个元素相同,则将其添加到返回BST中。

    • 以排序顺序向返回BST添加元素对于平衡是不利的,因此您可以通过对超过一半的BST执行有序遍历以及在bST的后半部分进行反向遍历来修改此值,然后以交替顺序添加前向列表和反向列表中的交叉元素。
    • 总的来说,这就像O(n * log(n)),因为将所有元素添加到返回BST所需的时间比遍历要长。
  • 位图:遍历两个位图,存储(AND)字节(或一次说32位)并将其作为位图存储在结果位置。 O(M)其中M是位图初始化范围的大小。

设置联盟:这是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,而不取决于所代表元素的数量。
相关问题