【问题标题】:How to find the number of integer clusters (efficiently) from a continuously running random integer generator?如何从连续运行的随机整数生成器中(有效地)找到整数簇的数量?
【发布时间】:2016-12-13 09:47:05
【问题描述】:

有一个随机整数生成器,它生成随机整数并在后台运行。需要设计一个API,在调用时返回当时的集群数量。

簇:簇是连续整数的字典顺序。例如,10,7,1,2,8,5,9 在这种情况下集群是 3 (1,2--5--7,8,9,10)。

当有数十亿或数万亿个整数时如何解决这个问题。什么可能是最佳解决方案? (请记住,生成器正在后台运行,并且可以随时多次调用 API)

我的方法:继续将生成器中的整数插入到列表中。当调用 API 时,对列表进行排序(插入),并遍历它以查找集群的数量。但我认为这不是一种有效的方法。

【问题讨论】:

  • 2--5--6 成为一个集群,而其他数字被隔离的规则是什么?
  • 感谢您指出,我已经编辑了我的问题。

标签: java algorithm sorting data-structures


【解决方案1】:

某种区间树怎么样。不是标准的,可以跟踪重叠间隔,而是一种更简单的,只跟踪不相交的间隔并自动合并重叠/相邻的间隔。

所以是间隔的 BST,按开始排序。要插入一个新的区间,

  1. 找到最高小于新间隔的开始,如果它们相邻,则将其加入
  2. 获取您现在拥有的间隔(您要插入的间隔或连接的间隔)并找到最低-高于其端点,如果相邻则将它们连接起来。
  3. 如果您已加入两次,请删除第一个(较短的)加入间隔。
  4. 如果您已加入零次,则将新区间插入为新节点
  5. 如有必要,应用通常的 BST 平衡旋转以保持树至少在一定程度上保持平衡

簇的数量在任何时候都是叶子的数量。您甚至不必显式计算它们,只需在更改树时更新计数即可。

Insert 与簇的数量成对数,它们的大小无关紧要。这有一个有趣的副作用,即对于随机整数,这会在一段时间内变慢,因为树必须主要代表单位间隔,但是当那里有足够的整数时,它会慢慢开始变得更快,因为超过某个点插入会倾向于加入比他们创造的更多的间隔。最终,对于树中的每个整数,它将只剩下一个节点,表示跨越所有整数的单个集群。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2018-10-09
    • 2014-08-22
    相关资源
    最近更新 更多