【数据结构与算法】python实现二分查找
·
一、二分查找的基本概念
二分查找又称折半查找,它是一种效率较高的查找方法
- 原理:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二、二分查找过程
查找数字: 1
- 第一步: 找到中值(取整数)
- 第二步: 要查找的数和中值比较
- 第三步: 若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回
三、python实现二分查找的两种方式
🍇递归代码实现二分查找算法
def binary_search(alist, item):
if len(alist) == 0:
return False
else:
midpoint = len(alist)//2
if alist[midpoint]==item:
return True
else:
if item<alist[midpoint]:
return binary_search(alist[:midpoint],item)
else:
return binary_search(alist[midpoint+1:],item)
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
🥕非递归的方式实现二分查找算法
def binary_search(alist, item):
first = 0
last = len(alist)-1
while first<=last:
midpoint = (first + last)/2
if alist[midpoint] == item:
return True
elif item < alist[midpoint]:
last = midpoint-1
else:
first = midpoint+1
return False
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
三、拓展:二叉树反推
我们如何根据提供的三种深度排序中的两种排序,反推出来二叉树的图呢?
反推原理:先根中定边,往复树两边
举例说明,如:
先序:0 1 3 7 8 4 9 2 5 6
中序:7 3 8 1 9 4 0 5 2 6
1、先序找根,中序定两边
先序的特点是第一个元素是根,中序的特点是根两侧分别是左右子树,所以我们反推分界初始图:
2、两边重复步骤1
根据中序的内容,我们确定了两个子树包含的内容,那么结合先序的特点,两个范围内首先出现的数字就是第一层的节点内容
所以左侧子树的根节点是1,右侧子树的根节点是2
3、两边重复步骤1和2
找到左侧子树的根节点是1,
那么结合中序的左侧子树内容:7 3 8 1 9 4,可以确定:左侧子树包括
- 左部分:738
- 右部分:94
结合先序的左侧子树内容:1 3 7 8 4 9,可以确定:左侧子树的1元素的两个子节点是3和9
找到右侧子树的根节点是2
- 结合中序的右侧子树内容:5 2 6
- 结合先序的右侧子树内容:2 5 6
可以确定:2节点的左侧元素是5,右侧元素是6
4、重复步骤3
对于3结点来说:
- 结合中序的内容:7 3 8
- 结合先序的内容:3 7 8
可以确定:3节点的左侧元素是7,右侧元素是8
对于9结点来说:
- 结合中序的内容:9 4
- 结合先序的内容:4 9
可以确定:9节点的左侧元素是4
所以最终的二叉树图是:
更多推荐
已为社区贡献1条内容
所有评论(0)