【发布时间】:2011-11-30 11:29:27
【问题描述】:
假设您在内存中有大量连续的整数,每个整数都恰好属于一个类别。两个操作必须是 O(log n):将一个范围从一个类别移动到另一个类别,并找到给定范围的类别计数。
如果第一个操作的正确实现,我很确定第二个操作可以轻松解决。
每个整数都从一个类别开始,所以我从一组平衡的 BST 开始。将子树从一个 BST 移动到另一个(例如,将范围移动到不同的类别)的运行时间相当于合并两个 BST,即 O(n1 * n2)[1]。
这太慢了(在 python 中,C 不是一个选项),我想不出一种方法来利用我的数据的固有结构来创建高效的 BST 合并操作。
我现在正在研究 AVL、红黑和区间树、二叉堆和树堆。比较它们的属性是压倒性的。我应该使用哪种结构?
编辑(问题说明):我可以灵活地存储这些值并创建我的数据结构。对于如何接收来自另一个应用程序的输入,我很不灵活,如下所示:CATEGORY(cat3, I, J)。我当前的解决方案为范围内的每个整数创建一个带有节点的树。这对于我的数据集的大小来说太慢了,所以如果有更好的方法,我很乐意重新架构。
任何给定的请求都可以将任何可能的整数范围移动到任何类别中。换句话说,范围在CATEGORY(cat1, 1, 10) 后跟CATEGORY(cat3, 5, 15) 的意义上是重叠的,但在任何给定时间每个整数都将属于一个类别的意义上是非重叠的。
【问题讨论】:
-
范围是保存为整数列表还是像
(begin, end)这样的元组? -
在你开始实现一些树之前,你应该尝试使用内置的数据类型,比如字典和集合。这些都经过高度优化且非常高效。
-
所以你有一个包含元组的列表 [ (number1, cat1), .... ] ???
-
我不确定我是否完全理解这个问题,所以,我先问几个问题。你如何表示一个范围?作为某些数据结构中的所有整数还是只是第一个+最后一个(或第一个+计数)?在执行这些操作时,您是否曾经需要拆分和连接范围?什么是类别?可以用一些数字来描述吗?在类别之间移动是什么意思?
-
通过将范围从一个类别移动到另一个类别,您的意思是对于范围 [x, y] 1) 所有整数 x 在其他类别中 会在新类别中?
标签: python algorithm tree computer-science