我正在研究数据结构和算法,而我仍然坚持二进制搜索的平均不成功案例。我在我的书(Lipschutz的数据结构)中找不到它,甚至在互联网上的各种资源上,他们都只是在没有给出任何解释的情况下说明了公式。公式是:
Sn= (I+n)/n
和
Un= E/(n+1)
,其中
Sn= number of comparisons in case of successful search
Un= number of comparisons in case of unsuccessful search
I= internal path length of the binary tree, and
E= external path length of the binary tree.
n is the number of nodes in the binary tree.
在这里,我想说明我知道如何通过为其创建二进制搜索树来给出实际二进制搜索案例时的两种情况的比较as explained here
但是在用二叉树解释之后,他们还简单地说明了公式来得到它的一般表示。
Sn
的第一个公式我完全理解但Un
的公式对我来说并不清楚。
答案 0 :(得分:2)
这是因为不成功搜索的平均比较次数等于平均外部路径长度'由表达式E /(n + 1)给出的树的结构,因为有(n + 1)个外部节点代表所有失败的情况。
您正在将其与导致您混淆的平均成功案例进行比较。在成功搜索的情况下,比较次数等于从根节点到该成功节点的路径中的节点数。但不成功的搜索可以理解为在树中插入该特定节点。即:插入元素相当于对该节点的不成功搜索。我们知道在树中查找节点的比较数量恰好比插入节点所需的比较数量多1倍。
例如: 考虑排序的数组:3,7,10,13,15
它的二进制搜索可以用以下二叉搜索树表示:
10
/ \
/ \
/ \
3 13
/ \ / \
F 7 F 15
/ \ / \
F F F F
其中F表示失败案例。
现在这表明如果你在这个数组中搜索10只需要一次比较,如果你搜索3或13,两者都将进行2次比较,同样如果你搜索7或15,则每次需要进行3次比较
内部路径长度给出从根到特定内部节点的边数,因此对于每个节点,它将比成功搜索该节点所需的比较数少一个。因此,我们为每个节点添加1到内部路径长度,这导致总共n(因为有n个内部节点)所以公式(I + n)/ n是合理的。
现在谈到搜索失败的情况,假设在这个示例数组中你要搜索2(数组中不存在),所以第一次比较将使用mid元素,即10,然后第二次比较3,由于搜索不能低于3,我们的搜索结束时只进行了2次比较,不像你说的那样需要进行3次比较,因为它在树的2级上。类似地,在此数组中搜索5时,您将不得不进行3次比较而不是4次。因此,我们看到每个失败节点都要求比较等于其路径长度。因此,我们不必为每个外部节点添加额外的1,并且不成功搜索的平均比较等于二叉树的平均外部路径长度。这证明了公式E /(n + 1)。
我想这应该清楚你为什么我们没有为每个节点添加额外的1。
喝彩!