Algorithm 指数搜索与二进制搜索
除了在空间复杂度方面,二进制搜索在任何方面都优于指数搜索吗?这两种算法都在有序元素列表中搜索值,但它们解决了不同的问题。指数搜索是为无界列表而显式设计的,而二进制搜索则处理有界列表 指数搜索背后的思想非常简单:搜索一个界限,然后执行二进制搜索 例子 让我们举个例子<代码>A=[1,3,7,8,10,11,12,15,19,21,22,23,29,31,37]。此列表可以看作是一个二叉树(尽管不需要构建树): 二进制搜索 对Algorithm 指数搜索与二进制搜索,algorithm,search,Algorithm,Search,除了在空间复杂度方面,二进制搜索在任何方面都优于指数搜索吗?这两种算法都在有序元素列表中搜索值,但它们解决了不同的问题。指数搜索是为无界列表而显式设计的,而二进制搜索则处理有界列表 指数搜索背后的思想非常简单:搜索一个界限,然后执行二进制搜索 例子 让我们举个例子A=[1,3,7,8,10,11,12,15,19,21,22,23,29,31,37]。此列表可以看作是一个二叉树(尽管不需要构建树): 二进制搜索 对e=27(例如)的二进制搜索将执行以下步骤 b0)让T,R分别为树及其根
e=27
(例如)的二进制搜索将执行以下步骤
b0)让T,R
分别为树及其根
15 (R)
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31___
/ \ / \ / \ / \
1 7 10 12 19 22 29 (R) 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
(R) 1 7 10 12 19 22 29 37
b1)将e
与R
进行比较:e>15
。设T,R
分别为T
右子树及其根
15 (R)
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31___
/ \ / \ / \ / \
1 7 10 12 19 22 29 (R) 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
(R) 1 7 10 12 19 22 29 37
b2)将e
与R
进行比较:e>23
。设T,R
分别为T
右子树及其根
15 (R)
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31___
/ \ / \ / \ / \
1 7 10 12 19 22 29 (R) 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
(R) 1 7 10 12 19 22 29 37
b3)将e
与R
进行比较:e<31
。设T,R
分别为T
左子树及其根
15 (R)
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31___
/ \ / \ / \ / \
1 7 10 12 19 22 29 (R) 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
(R) 1 7 10 12 19 22 29 37
b4)比较e
和R
:e29
:元素不在列表中,因为T
没有子树
指数搜索
对e=27
(例如)的指数搜索将经历以下步骤
设T,R
分别为最左边的子树(即叶1
)及其根(1
)
15 (R)
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31___
/ \ / \ / \ / \
1 7 10 12 19 22 29 (R) 37
15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31
/ \ / \ / \ / \
(R) 1 7 10 12 19 22 29 37
e1)将e
与R
进行比较:e>1
。设R
为R
的父级,T
为以R
为根的树
15
____/ \____
/ \
__8__ _23__
/ \ / \
(R) 3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
e2)将e
与R
进行比较:e>3
。让R
成为R
的父级,T
成为以R
为根的树:
15
____/ \____
/ \
(R)_8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
(R) 15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
e3)将e
与R
进行比较:e>8
。让R
成为R
的父级,T
成为以R
为根的树:
15
____/ \____
/ \
(R)_8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
(R) 15
____/ \____
/ \
__8__ _23__
/ \ / \
3 11 21 31 (R)
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
e4)将e
与R
进行比较:e>15
<代码>R没有父项。设T
为T
的右子树,且R
为其根:
15
____/ \____
/ \
__8__ _23_(R)
/ \ / \
3 11 21 31
/ \ / \ / \ / \
1 7 10 12 19 22 29 37
e5..7)参见步骤b2..4)
时间复杂性
为了便于演示,让N=2^N
为A
的大小,并让索引从1
开始。如果N
不是二的幂,则结果几乎相同
让
0好吧,你的指标是什么?就我个人而言,我认为“二进制搜索”更容易拼写,这很好。就时间复杂性而言,指数搜索在许多情况下优于二进制搜索。让我们保持时间复杂度作为度量。时间复杂度对于两者都是相同的(因为大O忽略常量)。但如果数组的大小事先已知,则指数搜索对于某些值(接近数组开头的值)更快,而二进制搜索对于其他值更快。我希望二进制搜索平均速度更快,但我没有任何数字支持。你值得我的赏金