一、分块查找法原理
分块查找法要求将列表组织成以下两种索引顺序结构
- 首先将列表分成若干个块(子表)。一般情况下,块的长度均匀,最后一块可以不满。每块的要求:块内无序,块与块之间要求有序
- 构造一个索引表。其中每个索引项对应一个块并记录每块的起始位置,以及每块中最大的关键字(或者最小的关键字)。索引表按照关键字有序排列。
举例:
二、分块查找基本过程
- 首先,将待查关键字key与索引表中的关键字进行比较,以确定待查记录所在的块。具体的可用顺序查找或者折半查找进行
- 进一步用顺序查找法,在相应块内查找关键字key
三、上代码
import random
import sys
def randomList(n): # 随机产生一个列表,长度为n
list1 = [] # 用来保存随机整数
# 人为规定列表长度不超过30
if 0 < n <= 30:
for i in range(n):
# 随机范围是:1至150
list1.append(random.randrange(0, 150))
return list1
else:
sys.exit('列表长度超出范围!!!')
def blockIng(): # 用来分块,不需要传参
# index用来保存每一块的范围
global list1, index
sort = [] # 用来存放分块数据
for key in index:
sub = [i for i in list1 if i < key[0]]
key[1] = len(sub)
sort += sub
list1 = list(set(list1) - set(sort)) # 去掉处理完的数据
list1 = sort
return index
def blockSearch(list1, key): # key表示待查找数据
start = end = 0
flag = -1
for num in index:
# 一个块一个块去查找数据
start += end
end += num[1]
if key <= num[0]: # 寻找key所在分块
for i in range(start, end):
if key == list1[i]:
flag = i
return flag
if __name__ == '__main__':
n = int(input('请输入查询列表长度(1-30):'))
list1 = randomList(n)
index = [[30, 0], [60, 0], [90, 0], [120, 0], [150, 0]]
blockIng()
print(list1)
list2 = [i for i in range(0, 150, 3)]
keys = random.choices(list1, k=2) + random.choices(list2, k=2)
for key in keys:
num = blockSearch(list1, key)
if num >= 0:
print(f'找到了{key},下标为:{num}......')
else:
print(f'您要查找的元素是:{key},没找到!!!')
代码中存在两个主要列表:
- list1:为随机生成的列表
- index:相当于索引表
分块后list1里的元素按照块内无序、块与块之间有序的顺序排列。
写得不好的地方请留言,看到后我会及时改正。