基于线性表的查找法
顺序查找
算法思想
用所给的元素与列表的中的各个元素进行比较,若相等返回索引,否则返回错误信息。
假设列表长度为$n$那么查找第$i$个元素时需进行$n-i+1$次比较,即$C_i=n-i+1$,又假设查找每个数据元素的概率相等,即$P_i =1/n$,则顺序查找成功的平均查找长度为
$ASL_{succ} = quadsum_{i=1}^n{P_iC_i}=(n+1)/2$
Python代码清单
import sys
import time
## 直接查找
class SeqSearch(object):
'''
SeqSearch 是直接查找算法,
使用 search方法进行查找操作
不返回任何值,因为没有后续的处理直接输出即可。
'''
list_a = []
def __init__(self, number1, aim1):
# 初始化操作
for item in range(number1):
self.list_a.append(item)
self.aim = aim1
def search(self):
flag = 0
for item in self.list_a:
if item == self.aim:
flag = 1
break
else:
pass
if flag == 0:
print('没有这个数')
else:
print('找到了。')
if __name__ == '__main__':
# 帮助文本
help_info = '''
This program is for SeqSearch.
How to use it! Follow the example!
python SeqSearch 5 3
The 5 representative will generate five numbers.
search 3
'''
# 接受系统传的参数。
command = sys.argv[0:]
# 判断输入是否合法。
if len(command) != 3 or 'help' in command:
print(help_info)
else:
try:
# 试图将文本型转化为int。
number = int(command[1])
aim = int(command[2])
except ValueError:
# 转化失败,提示信息并退出。
print(help_info)
sys.exit(1)
# 一切就绪,实例化类对象。
look = SeqSearch(number, aim)
time_start = time.time() # 记录开始时间
look.search() # 调用查找算法。
time_end = time.time() # 记录结束时间。
print('花费的时间是%f' % (time_end-time_start))
折半查找
折半查找又称为二分法查找,这种方法对待查找的列表有两个要求,一是必须采用顺序存储结构,二是必须按照关键字大小有序排列。
算法思想
首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等则查找成功,否则利用中间位置将表分为前后两个子表,如果中间的关键字大于要查找的关键字,则进一步查找前子表,否则查找后面的子表。重复以上过程直到查找成功,或不存在为止。
平均查找长度。假设表的长度$n=2h-1$,则相应的判定树的深度是$h$的满二叉树,$h=long_2{n+1}$。又假设每个记录查找到的概率相等,则查找成功时的平均查找长度为
$ASL_{bs} = quadsum_{i=1}n{P_iC_i}约等于log_2{(n+1)}-1 $
Python代码清单
import sys
import time
class BinSearch(object):
'''
BinSearch 是折半查找算法,
使用 search方法进行查找操作
不返回任何值,因为没有后续的处理直接输出即可。
'''
list_a = []
def __init__(self, number1, aim1):
# 初始化操作
for item in range(number1):
self.list_a.append(item)
self.aim = aim1
def search(self):
flag = 0
low = 0
high = len(self.list_a) - 1 # 获取高位
while low < high: # 条件是不交叉
mid = int((low + high)/2) # 选择中间位置
if self.list_a[mid] == self.aim:
flag = 1 # 找到值
break
else:
if self.list_a[mid] > self.aim:
high = mid - 1
if self.list_a[mid] < self.aim:
low = mid + 1
if flag == 0:
print('找不到哇哇')
if flag == 1:
print('找到了啊')
if __name__ == '__main__':
# 帮助文本
help_info = '''
This program is for BinarySearch.
How to use it! Follow the example!
python BinSearch 5 3
The 5 representative will generate five numbers.
search 3
'''
# 接受系统传的参数。
command = sys.argv[0:]
# 判断输入是否合法。
if len(command) != 3 or 'help' in command:
print(help_info)
else:
try:
# 试图将文本型转化为int。
number = int(command[1])
aim = int(command[2])
except ValueError:
# 转化失败,提示信息并退出。
print(help_info)
sys.exit(1)
# 一切就绪,实例化类对象。
look = BinSearch(number, aim)
time_start = time.time() # 记录开始时间
look.search() # 调用查找算法。
time_end = time.time() # 记录结束时间。
print('花费的时间是%f' % (time_end-time_start))