基本原理
将列表分成若干子列表(块),这些块是有序的,(每个块的第一个元素比前一个块的最后一个元素大),但块中的元素是无序的。首先确定待查值在哪个块,然后在块中顺序查找即可。
代码
# -*- coding: utf-8 -*-
'''
分块查找:块是有序的(块的第一个元素比前一个块的最后一个元素大),但元素可以是无序的;
1.首先看待查元素属于哪个块
2.找到属于哪个块之后 跳进去顺序查找
'''
def divblock(iList,indexList):
res=[]
for key in indexList:
sublist=[ele for ele in iList if ele<=key[1] and ele>=key[0]]
res.append(sublist)
return res
def blockSearch(input_list,index_list,key):
for sublist,index in zip(input_list,index_list): # 循环对应的块和ind
if key<=index[1]: # 若待查值<边界值
res=[i for i in range(len(sublist)) if key==sublist[i]] # 顺序查找子list。
return res[0]
return -1
if __name__ == '__main__':
iList=[9,17,13,5,2,26,7,23,29]
key=13
# 分块,可以分成三块,给定三个有序下标:0-9,10-19,20-29
indexList=[[0,9],[10,19],[20,29]] # 类似于哨兵的角色
res=divblock(iList,indexList) # 分块好的list
result=blockSearch(res,indexList,key)
print(result)
易忘点和易错点
a. 主要是灵活运用zip函数。