python数据结构(查找)

目录

查找

线性表查找分为

顺序查找

折半查找

分块查找


查找

查找某个“特定的”数据元素是否在查找表中;

检索某个“特定的”数据元素的各种属性;

在查找表中插入一个数据元素;

从查找表中删去某个元素。

线性表查找分为

顺序查找

折半查找

分块查找

顺序查找

从表的头或者尾开始,逐一开始查找,然后一一和我们要查找的目标进行一一对比,看是否相同,最后查找完也没发现,则说明该表中没有此元素。(效率较低)

def sequential_search(lis,item):
    pos=0               #代表从0开始进行比较
    found=False
    while pos < len(lis) and not found:
      if lis[pos] == item:       #将线性表中的元素取出来和要查找的数进行比较
        found = True
      else:
        pos = pos + 1
    return (found)

折半查找

前提:线性表已经按照从小到大的顺序排列。

就是每次查找去分成两等分,然后有个中间值,让这个值和我们要查找的值进行比较,可以比较出来看是哪边的,是大于它的还是小于它的,大于它则在大于它的区间找,小于则小于找,然后以此类推,找中间值,然后作比较。

def binarysearch(a,num):
    length=len(a)
    low=0        #最小数下标
    high=length-1      #最大数的下标
    shile low <= high:
      mid=int(low+((high-low)/2))      #取中间值
      if a[mid]<num:
        low=mid+1       #如果中间值比目标值小,则在mid右半边
      elif a[mid]>num:
        high=mid-1       #如果中间值比目标值大,则在mid左半边找
      else:
        return mid     #查找到,位置是mid
    return -1    #没查到

分块查找

将数据分为几块几块,要求前一块中最大数据必须小于后一块中最小数据。在块中可以杂乱无序。

建立一个索引表,每块中最大关键字的值及每块的第一个记录在表中的位置和最后一个记录在表中的位置存放在索引项中。原理是:逐步缩小搜索空间的过程。

最后实例:

import random

Range = 20
Length = 9
flag = 0
pos = -1
tabNum = 3
tabPos = -1

list = random.sample(range(Range), Length)
goal = random.randint(0, Range)
print('search ', goal, ', in list:')

#子表建立,选择序列前m个元素排序后建立索引,根据索引建立子表
list_index = []  #使用二维列表表示多个子序列
for i in range(tabNum):  #在列表中添加m个列表
    list_index.append([])
#向第1-m子列表添加原序列的前m-1个元素作为索引,留出第一个子列表盛放最大索引
for i in range(1, tabNum):
    list_index[i].append(list[i - 1])  #会出现最大值在第二个子列表中,第一子列表为空的情况
for i in range(1, tabNum - 1):  #将添加元素的子列表中的元素降序排列
    for j in range(1, tabNum - i):
        if list_index[j] < list_index[j + 1]:
            list_index[j], list_index[j + 1] = list_index[j + 1], list_index[j]
#将其余元素添加到各子列表,比索引大则放到前一个子列表中,其余放入最后一个索引中
for i in range(tabNum - 1, Length):
    for j in range(1, tabNum):
        if list[i] > list_index[j][0]:
            list_index[j - 1].append(list[i])
            break
    else:
        list_index[tabNum - 1].append(list[i])
if len(list_index[0]) > 1:  #提取第一个子列表的最大值最为索引
    for i in range(len(list_index[0]) - 1, 0, -1):
        if list_index[0][i] > list_index[0][i - 1]:
            list_index[0][i], list_index[0][i - 1] = list_index[0][i - 1], list_index[0][i]
print(list_index)  #显示构造的子列表

for i in range(tabNum - 1, -1, -1):  #将给定元素与各子列表进行比较,确定给定元素位置
    if len(list_index[i]) != 0 and goal < list_index[i][0]:
        for j in range(len(list_index[i])):
            if list_index[i][j] == goal:
                tabPos = i + 1
                pos = j + 1
                flag = 1
if flag:
    print("find in ", tabPos, "list ", pos, "th place")
else:
    print("not found")

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值