恒定时间搜索

时间:2013-08-02 10:23:59

标签: algorithm search complexity-theory

假设我有一根杆,我切成了碎片。考虑到原始杆上的一点,有没有办法在恒定的时间内找出它属于哪一件?

例如:

  |------------------|---------|---------------|
  0.0                4.5       7.8532          9.123

给出一个职位:

                                   ^
                                   |
                                   8.005

我想获得3rd piece

可以通过二分查找在O(log n)时间轻松获得这样的答案,但是可以在O(1)中进行吗?如果我以某种方式预先处理“削减”职位?

4 个答案:

答案 0 :(得分:4)

如果你假设你要查询的点是沿着杆一致地随机选择的,那么你可以有EXPECTED恒定时间解决方案,没有疯狂的内存爆炸,如下所示。如果你将杆分成N个等间距的碎片,其中N是你杆中的原始不规则间隔段的数量,然后记录N个相等大小的碎片中的每个原始不规则碎片的那个重叠,然后进行查询首先只需要查询点并进行简单的舍入,找出它所在的等间距,然后使用该索引查找哪些原始段与等间距的块相交,并且然后检查每个相交的原始段以查看该段是否包含您的点(如果您想确保最坏情况的性能仍为对数,则可以使用二进制搜索)。如果你假设沿你的杆随机选择查询点,那么这种方法的预期运行时间是恒定的,如果你的杆最初被切成N个不规则的部分,则内存量是O(N),所以没有疯狂的内存需求。

预期的证明O(1)运行时间:

当你计算你原来的N个不规则段和我建议构建的N个等间距段之间的交叉点总数时,总数不超过2 *(N + 1)(因为如果你对所有所有规则和不规则段的终点,一个新的交叉点总是可以向定义规则或不规则段的一个端点充电。因此,您有一组多达2(N + 1)个不规则区段,以某种方式分布在它们相交的N个常规区段中。常规段之间交叉点的实际分布无关紧要。当您有一个统一的查询点并计算与包含查询点的常规段相交的不规则段的预期数量时,每个常规段的概率为1 / N由查询点选择,因此预期的相交不规则段数需要检查的是2 *(N + 1)/ N = O(1)。

答案 1 :(得分:0)

对于任意切割和精度,不是真的,你必须将位置与各种起点或终点进行比较。

但是,如果你只是在谈论少量削减,那么表现应该不是真正的问题。

例如,即使有十个片段,您也只进行了九次比较,而不是大量的计算。

当然,您总是可以将情况转换为使用联立方程式生成的一个公式(例如ax^4 + bx^3 +cx^2 + dx + e),这将给您一个细分,但最高的幂会随着细分计数而上升,所以它是不一定像简单检查那样有效。

答案 2 :(得分:0)

使用基于比较的算法,你不会比lg n做得更好。将正IEEE浮点的31个非符号位重新解释为31位整数是一个保持顺序的转换,因此尝试和van Emde Boas树都是选项。我会先引导你走向一个三级特里。

答案 3 :(得分:0)

您可以为每个位置分配一个整数,然后将其用作查找表的索引,这将为您提供恒定时间查找。如果您的手杖很短并且您没有将其切成几分之一毫米的碎片,这非常容易。如果你可以用这样的近似值,那将是我的方法。

有一种增强的方式可以进一步概括这一点。在查找表的每个元素中,您将中间位置和段ID存储在左侧和右侧。这使得一次查找(O(1))加上一次比较(O(1))。缺点是查找表必须非常大,以至于在同一个表元素的范围内永远不会有两个以上的不同段。同样,这取决于您的要求和输入数据是否有效。