查找
查找可以分为静态查找和动态查找。
静态查找
定义:
在查找过程中,只是对数据元素执行查找操作,而不对其执行其他操作。
顺序查找
折半查找
索引查找
通常用线性表来表示静态查找表,线性表有顺序存储结构和链式存储结构,此处只考虑顺序结构。
顺序查找
顺序查找思路:
将给定值与静态查找表中数据元素的关键字逐个比较,若表中某个元素的关键字与给定值相等,则查找成功,否则查找失败。
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