通常考虑一种排序方法产品线性排序的产品(例如“1,7,8,13,109 ......”),它会消耗O(N)
进行查询。
为什么不按非线性顺序排序,使用O(logN)
或其他东西通过迭代或牛顿方法等来查找元素?制作如此高阶排序的结构是否很昂贵?
简而言之,通过查找ax^2 + bx + c = 0
的根来排序允许访问的结果是否可能? (相比之下,通常它会找到ax + c = 0
的根。)例如,我们将x1 = 1, x2 = 2
作为二次方程的根,只需插入xi(s)
。然后可以使用更智能的方式进行查询。
我认为这些方面可能遇到困难:
预测数据可能相当困难。因此,我们不能构造一个通用公式来很好地描述以下数字(可能是哈希值)。
由于第一个难度,超出一定范围的数字可能会发散。谷歌的例子:the graph.从[-1,3]中得出的值非常大,以及执行原始公式的难度快速增加。
实际上相当于hash ,它会创建一个包含值的表。生产规则是一个公式。
由于算法本身的复杂性,执行“更智能”的查询可能会很昂贵。
答案 0 :(得分:0)
利用已知统计分布的智能方案通常更快一些常数。但是,它仍将它们保持在O(log N),这与普通的二进制搜索相同。原因在于,在每个步骤中,它们通常缩小元素的范围以通过因子R> 1来搜索。 2,对于简单的二进制搜索,只是R = 2。但是您需要使用log(N)/ log(R)步骤将其缩小到恰好一个元素。
现在这是否是净胜利取决于log(R)与每一步所需的工作。简单的比较(二进制搜索)需要几个周期。一旦你需要比+ - * /(比如exp
或log
)更复杂的东西来预测下一个元素的位置,那么需要更少步骤的利润就会消失。
总而言之:使用二进制搜索是因为对于许多现实世界的发行版而言,每一步都是有效的。