算法
查找
线性查找(顺序查找)
基本思想:
从数据的一端开始查找,比较元素是否与查找元素相同,若有则查找成功,直到另一端结束。既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构,但查找效率较低。
#python实现
def sequential_search(nums, key):
for i in range(0,len(nums)):
if nums[i] == key:
return i
return False
二分查找(折半查找)
基本思想:
将待查找元素与序列中间值进行比较,若相等则找到,大于中值,则可以在右半边继续开始同样的查找工作,小于中值,则在左边.
#pyton实现
def binary_search(nums, key):
first = 0
last =len(nums)- 1
while first <= last:
mid = (last + first) // 2
if nums[mid] > key:
last = mid - 1
elif nums[mid] < key:
first = mid + 1
else:
return mid
return False
分块查找(索引顺序查找)
基本思想:
将数据进行分块,并用一个索引不表存储相关信息;将数据分成若干块,其中前一块的最大值不能大于后一块的最小值,用一个索引表存储每个块中的最大值和块的起始位置,块中的元素可以是无序的,但索引表必须是有序的。
#python3实现
def block_search(list, count, key):
length = len(list)
block_length = length//count
if count * block_length != length:
block_length += 1
for block_i in range(block_length):
block_list = []
for i in range(count):
if block_i*count + i >= length:
break
block_list.append(list[block_i*count + i])
result = binary_search(block_list, key)
if result != False:
return block_i*count + result
return False
。