一、分块查找
分块查找部需要进行整理排序,首先按照一定的取值范围将数列分成数块,块内的元素是可以无序的,但块必须是有序的,其中块的有序表示为处于后面位置中的块的最小元素都要比前面位置块中的最大元素大。
二、输出结果
三、代码实现
import random
import timeit
def randomList(n):
iList = []
for i in range(n):
iList.append(random.randrange(0,1000))
return iList
def divideBlock():
global iList,indexList
sort = []
for key in indexList:
# 第一次运算,key = [250,0]
# 从iList里面获取数据,一个个判断是否在0-250之间
# 若满足条件则将数据i存储到sub字典当中
sub = [i for i in iList if i < key[0]]
# 将0-250区间的个数赋值给indexiList中key[1]
key[1] = len(sub)
sort += sub
# 删除已经分块的数据,为方便未分块数据进行分块
iList = list(set(iList)-set(sort))
iList = sort
print()
return indexList
def blockSearch(iList,key):
right = 0
left = 0
for num in indexList:
# 如果未找到分块的数据,会不断往后累加字典分块个数
left += right
right += num[1]
# 一个区间一个区间判断,属于该区间则跳出该for循环,继续往下执行
if key< num[0]:
break
for i in range(left,right):
if key == iList[i]:
return i
return -1
if __name__ == "__main__":
######创建20个1000以内的列表########
iList = randomList(20)
print(iList)
#分块的字典列表,第二列数据为这个区域内的个数
indexList = [[250,0],[500,0],[750,0],[1000,0]]
divideBlock()
print(iList)
keys=[random.choice(iList),random.randrange(min(iList),max(iList))]
for key in keys:
num = blockSearch(iList,key)
if(num>=0):
print("%d number is %d\n"%(key,num))
else:
print("%d the key number is not find\n"%key)