首页 > 编程 > Python > 正文

详解常用查找数据结构及算法(Python实现)

2020-02-23 04:09:03
字体:
来源:转载
供稿:网友

一、基本概念

查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找表(Search Table):由同一类型的数据元素(或记录)构成的集合

关键字(Key):数据元素中某个数据项的值,又称为键值。

主键(Primary Key):可唯一地标识某个数据元素或记录的关键字。

查找表按照操作方式可分为:

静态查找表(Static Search Table):只做查找操作的查找表。它的主要操作是: 查询某个“特定的”数据元素是否在表中 检索某个“特定的”数据元素和各种属性 动态查找表(Dynamic Search Table):在查找中同时进行插入或删除等操作: 查找时插入数据 查找时删除数据

二、无序表查找

也就是数据不排序的线性查找,遍历数据元素。

算法分析:最好情况是在第一个位置就找到了,此为O(1);最坏情况在最后一个位置才找到,此为O(n);所以平均查找次数为(n+1)/2。最终时间复杂度为O(n)

# 最基础的遍历无序列表的查找算法# 时间复杂度O(n)def sequential_search(lis, key):  length = len(lis)  for i in range(length):    if lis[i] == key:      return i    else:      return Falseif __name__ == '__main__':  LIST = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]  result = sequential_search(LIST, 123)  print(result)

三、有序表查找

查找表中的数据必须按某个主键进行某种排序!

1. 二分查找(Binary Search)

算法核心:在查找表中不断取中间元素与查找值进行比较,以二分之一的倍率进行表范围的缩小。

# 针对有序查找表的二分查找算法# 时间复杂度O(log(n))def binary_search(lis, key):  low = 0  high = len(lis) - 1  time = 0  while low < high:    time += 1    mid = int((low + high) / 2)    if key < lis[mid]:      high = mid - 1    elif key > lis[mid]:      low = mid + 1    else:      # 打印折半的次数      print("times: %s" % time)      return mid  print("times: %s" % time)  return Falseif __name__ == '__main__':  LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]  result = binary_search(LIST, 99)  print(result)

2. 插值查找

二分查找法虽然已经很不错了,但还有可以优化的地方。

有的时候,对半过滤还不够狠,要是每次都排除十分之九的数据岂不是更好?选择这个值就是关键问题,插值的意义就是:以更快的速度进行缩减。

插值的核心就是使用公式:

value = (key - list[low])/(list[high] - list[low])

用这个value来代替二分查找中的1/2。

上面的代码可以直接使用,只需要改一句。

# 插值查找算法# 时间复杂度O(log(n))def binary_search(lis, key):  low = 0  high = len(lis) - 1  time = 0  while low < high:    time += 1    # 计算mid值是插值算法的核心代码    mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low]))    print("mid=%s, low=%s, high=%s" % (mid, low, high))    if key < lis[mid]:      high = mid - 1    elif key > lis[mid]:      low = mid + 1    else:      # 打印查找的次数      print("times: %s" % time)      return mid  print("times: %s" % time)  return Falseif __name__ == '__main__':  LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]  result = binary_search(LIST, 444)  print(result)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表