0
点赞
收藏
分享

微信扫一扫

分块查找算法(Python版)

止止_8fc8 2022-05-03 阅读 39
python

一、分块查找法原理

分块查找法要求将列表组织成以下两种索引顺序结构

  1. 首先将列表分成若干个块(子表)。一般情况下,块的长度均匀,最后一块可以不满。每块的要求:块内无序,块与块之间要求有序
  2. 构造一个索引表。其中每个索引项对应一个块并记录每块的起始位置,以及每块中最大的关键字(或者最小的关键字)。索引表按照关键字有序排列。

举例:

二、分块查找基本过程

  1. 首先,将待查关键字key与索引表中的关键字进行比较,以确定待查记录所在的块。具体的可用顺序查找或者折半查找进行
  2. 进一步用顺序查找法,在相应块内查找关键字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里的元素按照块内无序、块与块之间有序的顺序排列。


写得不好的地方请留言,看到后我会及时改正。

举报

相关推荐

0 条评论