什么数据结构可以有效地存储整数范围?


10

我需要保留一个范围在0到65535之间的整数的集合,以便可以快速执行以下操作:

  • 插入一个新的整数
  • 插入一系列连续的整数
  • 删除整数
  • 删除整数以下的所有整数
  • 测试是否存在整数

我的数据具有以下特性:它通常在集合中包含整数整数。例如,集合在某个时间点可能是:

{ 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 }

最简单的方法就是使用像C ++ std :: set这样的平衡二叉树,但是,使用它,我没有利用我经常会有大量数字的事实。也许最好存储一系列范围?但这意味着,如果要删除范围中间的整数,则需要将其分解;如果要填充两个范围之间的空格,则必须将其合并在一起。

是否存在任何适合此问题的现有数据结构?

Answers:


9

我建议您使用二叉搜索树,并对其进行扩充,以使叶子可以包含一个间隔(连续的整数)。保持不变,即间隔不重叠且有序(遵循搜索树不变式)。(对于间隔不重叠的特殊情况,这可以被视为间隔树或段树的特殊情况。)

Ølgñññ65535Ølgñ


5

首先,如果没有其他原因,因为“快速”的意义不大,那么您的问题措辞就很糟糕。您需要提供一些“快速”含义的度量。

除此之外,在尝试设计问题时,您首先需要非常了解问题并提出许多其他问题。在这种情况下,相关问题似乎是(无特定顺序):

  • 所有这些操作是否必须同样快速,或者某些操作比其他操作更重要?
  • 还有其他考虑事项吗?
  • 记忆是一个问题吗?
  • 是否需要考虑从多个线程执行插入,删除和查找的能力?
  • 工作量是否主要集中在插入上?移除?抬头?

[065535]

对于更多的工作,如果您担心的话,您可以节省空间,以8192整数的形式将数据存储为位来以速度为代价。尽管从概念上讲,单个整数运算仍将是恒定时间,而有范围整数运算仍将是线性时间,但它们将更慢。

因此,如果这确实是您的问题,我会说使用数组,然后继续处理代码中其他更重要的事情。

[065535]


3

ü={0ü-1个}Ø日志日志ü

根据数据的结构,可能会有许多巧妙的替代方法来存储数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.