首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于存储长序列(大部分是连续的)整数的有效数据结构

用于存储长序列(大部分是连续的)整数的有效数据结构
EN

Stack Overflow用户
提问于 2016-09-16 00:25:57
回答 4查看 3.1K关注 0票数 13

我想要一个数据结构来有效地存储一个长序列的数字。数字应该总是整整数,比方说朗克斯。

我想利用的输入(声称“效率”)的特点是,多头大多是连续的。可能会缺少值。并且这些值可以与无序交互作用。

我希望数据结构支持以下操作:

  • addVal(n):添加单个值,n
  • addRange(n,m):将n和m之间的所有值相加
  • delVal(n):删除单个值,n
  • delRange(n,m):删除n和m之间的所有值,包括
  • containsVal( n ):返回结构中是否存在单个值n
  • containsRange(n,m):返回结构中是否存在n和m之间的所有值,包括

本质上,这是一种更具体的集合数据结构,它可以利用数据的连续性来使用小于O(n)内存,其中n是存储的值数。

显然,虽然我认为这样一个数据结构的有效实现需要我们在内部存储时间间隔,这是不可见的或与用户无关的。有一些间隔树分别存储多个间隔,并允许操作找到与给定点或间隔重叠的间隔数。但是从用户的角度来看,这应该完全像一个集合(除了基于范围的操作之外,这样可以有效地处理大量的添加和删除)。

示例:

代码语言:javascript
复制
dataStructure = ...
dataStructure.addRange(1,100) // [(1, 100)]
dataStructure.addRange(200,300) // [(1, 100), (200, 300)]
dataStructure.addVal(199) // [(1, 100), (199, 300)]
dataStructure.delRange(50,250) // [(1, 49), (251, 300)]

我的假设是,这最好通过一些基于树的结构来实现,但我对如何做到这一点还没有很好的印象。我想知道是否有一些常用的数据结构已经满足了这个用例,因为我不想重新发明轮子。如果不是,我想听听你认为如何最好地实现这一点。

EN

Stack Overflow用户

发布于 2016-09-17 04:32:33

另一种选择可能是绳子数据结构( 结构),它似乎支持您所要求的操作),在O(log n) time中实现。与维基百科中的例子相反,您的示例将存储[start,end]而不是字符串子序列。

关于绳子的有趣之处在于它对区间内索引的有效查找。它通过排序从左到右的所有值位置来实现这一点--从低到高的位置(您的间隔将是一个直观的表示)可以是向上的,也可以是向下的,只要运动是向右的--以及依赖存储子树的大小,根据左边的权重来定位当前位置。通过更新和断开相关的树段,可以在O(log n)时间内通过较大的包含区间来吞没部分区间。

票数 3
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39522165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档