性能 – 二进制搜索无均匀分布

二进制搜索对均匀分布是高效的.您的列表的每个成员具有相同的“命中”概率.这就是为什么你每次尝试中心的原因.

有没有均匀分布的有效算法?例如1 / x分布后的分布.

二进制搜索和二进制树之间有很深的联系 – 二叉树基本上是一个“预先计算的”二进制搜索,其中切点由树的结构决定,而不是选择作为搜索运行.而事实证明,处理每个键的概率“权重”有时是用二叉树来完成的.

一个原因是因为它是一个相当正常的二叉搜索树,而是预先知道的,并且具有查询概率的知识.

Niklaus Wirth在他的着作“算法和数据结构”一书中介绍了这一点,其中有几个变体(一个用于Pascal,一个用于Modula 2,一个用于Oberon),其中至少有一个可以从他的web site下载.

二叉树并不总是二叉搜索树,而二叉树的一个使用是派生一个Huffman compression code.

无论哪种方式,二叉树是通过从叶子分开开始构建的,并且在每个步骤中,将两个最不可能的子树加入到更大的子树中,直到剩下只有一个子树.为了在每个步骤中有效地选择两个最不可能的子树,使用优先级队列数据结构 – 也许是binary heap.

一旦建立一个二进制树,从未修改过,可以使用多种用途,但可以有效更新的二进制树更有用.有一些重量平衡的二叉树数据结构,但我不熟悉他们.当心 – 通常使用术语“重量平衡”,其中每个节点总是具有权重1,但是子树权重近似平衡.其中一些可能适用于不同的节点权重,但我不知道.

无论如何,对于数组中的二进制搜索,问题是可以使用任意概率分布,但效率低下.例如,您可以拥有一个运行总计权重的数组.对于您的二进制搜索的每次迭代,您要确定中途的概率分布点,因此您可以确定其值,然后搜索running-total-of-weight数组.您可以为您的主要二进制搜索获得完美的权重平衡的下一个选择,但是您必须对运行的总阵列进行完整的二进制搜索.

但是,如果您可以确定加权中点而不搜索已知的概率分布,则该原则是有效的.原理是一样的 – 你需要你的概率分布的整体(代替运行中的总数),当你需要一个中点时,你可以选择它来获得积分的精确中心值.这不仅仅是编程问题的代数问题.

像这样的加权二进制搜索的一个问题是最差情况下的性能更差 – 通常是通过常数因子,但是如果分布偏倚足够,则可能会有效地进行线性搜索.如果您的假设分配是正确的,尽管偶尔搜索缓慢,但是平均情况下的表现是有所改善的,但是如果您的假设分配错误,则可以在许多搜索是根据该分发不太可能的项目时支付.在二叉树形式中,“不太可能”的节点比根本不在于简单的平衡(平坦概率分布假定)二叉树.

平坦概率分布假设即使是完全错误也能运行得很好 – 最糟糕的情况是好的,最好和平均的情况必须至少是这样定义的.从平均分配的角度来看,如果实际查询概率与您的假设有很大的不同,那么更糟糕的是.

http://stackoverflow.com/questions/16872675/binary-search-for-no-uniform-distribution

转载注明原文:性能 – 二进制搜索无均匀分布