如何从连续运行的随机整数生成器中有效地找到整数簇的数量?

时间:2016-12-13 09:47:06

标签: java algorithm sorting data-structures

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

  1. 找到最新 - 小于新区间的开头,如果它们相邻则加入它
  2. 取你现在拥有的间隔(要插入的间隔或连接间隔)并找到最低 - 高于其终点,如果相邻则加入它们。
  3. 如果您已加入两次,则删除第一个(较短的)连接间隔。
  4. 如果您已加入零次,请将新间隔作为新节点插入
  5. 如果需要,应用通常的BST平衡旋转以保持树至少有些平衡
  6. 群集的数量在任何时候都是叶子的数量。您甚至不必显式计算它们,只需在更改树时更新计数。

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