python之查找(顺序查找、折半查找、索引查找、二叉排序树查找、哈希表查找)

查找

查找可以分为静态查找和动态查找。

静态查找

定义:
在查找过程中,只是对数据元素执行查找操作,而不对其执行其他操作。

顺序查找
折半查找
索引查找

通常用线性表来表示静态查找表,线性表有顺序存储结构和链式存储结构,此处只考虑顺序结构。

顺序查找

顺序查找思路:
将给定值与静态查找表中数据元素的关键字逐个比较,若表中某个元素的关键字与给定值相等,则查找成功,否则查找失败。
python实现:

class StaticTable:
    def __init__(self):
        self.SequenceList = []
    def CreateStaticTable(self,elements):
        self.SequenceList = elements
    '''顺序查找'''
    def SequenceSearch(self,key):
        iPos = -1
        for i in range(len(elements)):
            if self.SequenceList[i] == key:
                iPos = i
                break
        return iPos
if __name__ == '__main__':
    elements=[3,5,8,123,22,54,7,99,300,222]
    table1 = StaticTable()
    table1.CreateStaticTable(elements)
    iPos = table1.SequenceSearch(99)
    print("位置为:%d"  %iPos)

特点:
简单,但是当n很大时,查找效率低。

折半查找

折半查找思路:
折半查找又被称为二分查找,要求静态查找表必须是有序表(其关键字是非递减顺序序列)。确定查找区间后,从区间的中间位置开始,如果与给定值相等,则查找成功,如果大于给定值,在左半部分继续寻找,如果小于给定值,在右半部分继续寻找。
python实现:

class StaticTable:
    def __init__(self):
        self.BinaryList = []        
    def CreateStaticTable(self,elements):
        self.BinaryList = elements 
    '''折半查找'''
    def BinarySearch(self,key):
        low = 0
        high = len(elements)-1
        while low <= high:
            mid = (high+low)//2
            if key > self.BinaryList[mid]:
                low = mid + 1
            elif key < self.BinaryList[mid]:
                high = mid - 1
            else:
                return mid
        return -1
if __name__ == '__main__':
    elements = [3,5,8,22,54,67,99,107,222,300]
    table1 = StaticTable()
    table1.CreateStaticTable(elements)
    iPos = table1.BinarySearch(99)
    print("位置为:%d"  %iPos)    

特点:
需要比较的次数少,查找效率高,但是要求静态查找表必须是有序的。

索引查找

思路:
索引查找又被称为分块查找,其查找效率介于顺序查找和折半查找之间。在使用索引查找算法时,除了需要长度为n的静态查找表以外,还需要与静态查找表相对应的索引表。通常将静态查找表均分为s块,前s-1块中的每一块内的数据元素个数为 ⌊ n / s ⌋ \left \lfloor n/s \right \rfloor n/s(即向下取整),因为n通常不是s的整数倍,所以最后一块的数据元素的个数小于等于t。尽管每一块内元素不一定有序,但分块有序,即前一块中所有元素关键字小于后一块中所有元素的关键字。对静态查找表的每个子表建立索引像,每一项包括两部分:子表最大关键字和子表中第一个元素在静态查找表中的位置。
python实现:

class IndexTable:
    def __init__(self):
        self.data = []
        self.key = []
    def CreatIndexTable(self,elements,n,s):
        t = n // s;
        for i in range (0,len(elements),t):
            self.data.append(i)
            self.key.append(max(elements[i:i+t]))
        return self.data,self.key
class StaticTable:
    def __init__(self):
        self.SequenceList = []        
    def CreateStaticTable(self,elements):
        self.SequenceList= elements 
    def IndexSearch(self,key,FirstPosList,MaxValueList):
        iPos = -1
        low = 0
        high = 0
        num = FirstPosList[1] - FirstPosList[0]
        for i  in range(len
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值