分块查找

基本原理

将列表分成若干子列表(块),这些块是有序的,(每个块的第一个元素比前一个块的最后一个元素大),但块中的元素是无序的。首先确定待查值在哪个块,然后在块中顺序查找即可。

代码

# -*- 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函数。