龙空技术网

算法|从零学算法:经典查找算法

产品经理李昱君 42

前言:

目前大家对“查找类算法的元操作是比较”大致比较看重,同学们都需要学习一些“查找类算法的元操作是比较”的相关知识。那么小编在网摘上网罗了一些有关“查找类算法的元操作是比较””的相关文章,希望小伙伴们能喜欢,小伙伴们一起来学习一下吧!

1. 猜数游戏

1.1 游戏规则

【 游戏双方 】防守者和攻击者。

【 游戏准备 】防守者在1~1000内任选一个自然数作为神秘数,并暗自记住,然后开始游戏。

【 游戏过程 】每轮游戏的过程如下

攻击者猜一个数,问防守者这个数是否是神秘数。

防守者要根据事实给出下面3个答案中的一个:

这个数就是神秘数

这个数比神秘数小

这个数比神秘数大

又下可持续多轮

【 游戏结果 】如果攻击者猜中神秘数,则算攻击者赢;否则,算防守者赢。

1.2 不限猜测次数的游戏的必胜攻略

不限猜猜测次数,攻击者必胜攻略

总共1000个数,攻击者可以从1开始猜,1不正确就猜2,2不正确就猜3,以此类推,一直猜到1000,肯定能够猜到神秘数。

该问题为查找问题——在1~1000这1000个整数中找到对手预设的神秘数(目标数)

编程实现必胜算法

tn = 165

found = False

for i in range(1,1001):

if i == tn:

print("secrete number is", i)

found = True

break

if not found:

print("failed")

代码解析:

tn = 165 # 定义一个变量tn,赋值为165

found = False # 定义一个变量found,初始值为False,表示尚未找到tn

for i in range(1,1001): # 从1到1000(不包括1001)创建一个整数序列,并将每个整数赋值给变量i

if i == tn: # 如果变量i等于变量tn的值

print("secrete number is", i) # 打印“secrete number is”和当前的i值(注意:这里的单词应为"secret number is")

found = True # 将found变量的值改为True,表示找到了tn

break # 退出当前的for循环

if not found: # 如果在循环结束后found仍然为False

print("failed") # 打印“failed”

当执行这段修正后的代码时,它会进行以下操作:

1. 定义一个变量tn并赋值为165。

2. 定义一个变量found并初始化为False,表示尚未找到目标数字。

3. 使用for循环遍历从1到1000的整数。

4. 在循环内部,检查当前的整数i是否等于tn

5. 如果找到匹配的数字,打印出“secret number is”和该数字,将found设置为True,然后使用break语句退出循环。

6. 如果循环正常结束而没有找到匹配的数字,则打印出“failed”。

在这个特定的例子中,代码将打印出“secret number is 165”,因为165确实在1到1000的范围内。如果tn的值不在1到1000的范围内,它将打印出“failed”。

1.3 限猜测次数的游戏

更新游戏规则:【 游戏结果 】如果攻击者在10次(含)之内猜中神秘数,则算攻击者赢;否则,算防守者赢。

如保证攻击者胜利,需要算法在1~1000这1000个数字中查找一个数字,保证最多查找10次就能查找到。这个算法是二分查找。

2. 二分查找:从原理到形式化描述

2.1 二分查找的原理

二分查找是一种在有序数列中查找某个特定元素(目标数)的查找算法

最初的待查数列和目标数由用户定义

查找过程是一个迭代(循环)过程

待查数列不为空时进入循环,否则查找失败——查找过程结束

每次循环从待查数列的中心元素开始。

如果中心元素正好等于目标数,则查找成功——查询过程结束

如果目标数大于或小于中心元素,则数列大于或小于中心元素的那一半称为新的待查数据列

2.2 二分查找的变成实现

形式化流程控制

从流程到代码

实现1~1000数列的二分查找算法

arr = list(range(1,1001))

tn = 635

low = 0

high = len(arr)-1

while low <= high:

m = int((high - low )/ 2) + low

if arr[m] == tn:

print("Succeeded! The target number is: ",arr[m])

break

else:

if arr[m] < tn:

low = m + 1

else:

high = m - 1

if low > high:

print("Search failed.")

另一种写法

tn = 635

low = 1

high = 1000

while low <= high:

m = int((high - low)/ 2) + low

if m == tn:

print("Succeeded! The target number is: ", m)

break

else:

if m < tn:

low = m + 1

else:

high = m - 1

if low > high:

print("Search failed.")

标签: #查找类算法的元操作是比较