查找算法!

chatgpt生成的一些查找算法

在计算机科学中,有许多用于查找数据的算法。下面是一些常用的查找算法:

  1. 线性查找(Sequential Search): 从列表或数组的开头开始逐个比较元素,直到找到目标元素或遍历完所有元素。适用于小规模的数据集,时间复杂度为O(n)。

  2. 二分查找(Binary Search): 适用于有序列表或数组。将目标元素与中间元素比较,根据比较结果确定目标元素在哪一半,然后重复此过程直到找到目标元素。时间复杂度为O(log n)。

  3. 哈希表查找(Hash Table Search): 使用哈希函数将元素映射到一个特定的位置(索引),然后在该位置进行查找。哈希表可以实现O(1)的查找时间,但需要考虑哈希冲突。

  4. 二叉搜索树查找(Binary Search Tree Search): 二叉搜索树是一种有序树结构,左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。通过比较目标值与节点的值,递归地在左子树或右子树中查找目标值。

  5. 插值查找(Interpolation Search): 类似于二分查找,但是根据目标元素在有序数据中的位置估计其可能的位置,以更快地缩小查找范围。适用于均匀分布的有序数据。

  6. 跳表查找(Skip List Search): 跳表是一种有序数据结构,类似于多层链表,其中每一层都是原链表的子集,可以在O(log n)的时间内进行查找。

  7. 红黑树查找(Red-Black Tree Search): 红黑树是一种自平衡的二叉搜索树,通过旋转和重新着色来保持树的平衡。查找时间复杂度为O(log n)。

  8. B树和B+树查找: 用于在大数据集上进行查找,例如数据库索引。这些树结构允许在O(log n)时间内进行高效查找和插入。

  9. Trie(前缀树)查找: 用于字符串的查找和前缀匹配。Trie将字符串按字符构建成树状结构,允许在O(m)时间内进行查找,其中m是要查找的字符串的长度。

  10. 布隆过滤器(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
  1. 在一个给定的整数列表 li 中,查找指定的值 target。
    li = [97, 30, 35, 92, 94, 38, 2, 81, 9, 92]
    
  2. 在一个学生信息字典的列表中,查找指定学号的学生。
    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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值