chatgpt生成的一些查找算法
在计算机科学中,有许多用于查找数据的算法。下面是一些常用的查找算法:
-
线性查找(Sequential Search): 从列表或数组的开头开始逐个比较元素,直到找到目标元素或遍历完所有元素。适用于小规模的数据集,时间复杂度为O(n)。
-
二分查找(Binary Search): 适用于有序列表或数组。将目标元素与中间元素比较,根据比较结果确定目标元素在哪一半,然后重复此过程直到找到目标元素。时间复杂度为O(log n)。
-
哈希表查找(Hash Table Search): 使用哈希函数将元素映射到一个特定的位置(索引),然后在该位置进行查找。哈希表可以实现O(1)的查找时间,但需要考虑哈希冲突。
-
二叉搜索树查找(Binary Search Tree Search): 二叉搜索树是一种有序树结构,左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。通过比较目标值与节点的值,递归地在左子树或右子树中查找目标值。
-
插值查找(Interpolation Search): 类似于二分查找,但是根据目标元素在有序数据中的位置估计其可能的位置,以更快地缩小查找范围。适用于均匀分布的有序数据。
-
跳表查找(Skip List Search): 跳表是一种有序数据结构,类似于多层链表,其中每一层都是原链表的子集,可以在O(log n)的时间内进行查找。
-
红黑树查找(Red-Black Tree Search): 红黑树是一种自平衡的二叉搜索树,通过旋转和重新着色来保持树的平衡。查找时间复杂度为O(log n)。
-
B树和B+树查找: 用于在大数据集上进行查找,例如数据库索引。这些树结构允许在O(log n)时间内进行高效查找和插入。
-
Trie(前缀树)查找: 用于字符串的查找和前缀匹配。Trie将字符串按字符构建成树状结构,允许在O(m)时间内进行查找,其中m是要查找的字符串的长度。
-
布隆过滤器(Bloom Filter)查找: 布隆过滤器用于判断一个元素是否存在于一个集合中,可能会有误判但不会漏判。适用于海量数据的查找。
选择适当的查找算法取决于数据集的大小、有序性以及你所需求的查找效率。每种算法都有其适用范围和局限性。
线性查找的python实现
第一种是,返回第1个和指定值 target相同元素的位置。如果没有找到值相同的元素返回-1。
def linear_search(li, target):
for loc, val in enumerate(li):
if val == target:
return loc
else:
return -1
第二种是,返回所有和指定值target相同的元素的位置。如果没有找到值相同的元素,返回[]。
def linear_search_all(li, target):
res = []
for loc, val in enumerate(li):
if val == target:
res.append(loc)
return res
- 在一个给定的整数列表 li 中,查找指定的值 target。
li = [97, 30, 35, 92, 94, 38, 2, 81, 9, 92]
- 在一个学生信息字典的列表中,查找指定学号的学生。
students_list = [ {'学号': 353989, '姓名': '学生353989', '身高': 182.79, '体重': 68.91, '性别': '女'}, {'学号': 785772, '姓名': '学生785772', '身高': 167.59, '体重': 42.79, '性别': '女'}, {'学号': 651930, '姓名': '学生651930', '身高': 165.35, '体重': 72.92, '性别': '女'}, {'学号': 848213, '姓名': '学生848213', '身高': 165.14, '体重': 77.06, '性别': '男'}, {'学号': 420737, '姓名': '学生420737', '身高': 183.2, '体重': 48.95, '性别': '男'}, {'学号': 719302, '姓名': '学生719302', '身高': 166.13, '体重': 58.71, '性别': '男'}, {'学号': 408678, '姓名': '学生408678', '身高': 153.43, '体重': 50.99, '性别': '女'}, {'学号': 337920, '姓名': '学生337920', '身高': 156.73, '体重': 46.65, '性别': '男'}, {'学号': 277859, '姓名': '学生277859', '身高': 155.0, '体重': 69.16, '性别': '男'}, {'学号': 206140, '姓名': '学生206140', '身高': 188.27, '体重': 62.24, '性别': '女'}, ]
二分查找的python实现
二分查找适用于有序列表或数组。返回第1个查找到的和指定值 target相同元素的位置。如果没有找到值相同的元素返回-1。
def binary_search(li, target):
left = 0
right = len(li) - 1
while left <= right:
mid = (left + right) // 2
if li[mid] == target:
return mid
if li[mid] > target:
right = mid - 1
elif li[mid] < target:
left = mid + 1