搜索——哈希优化策略

一、背景介绍

在算法中,常通过将线性查找替换为哈希查找来降低算法的时间复杂度。

例:给定一个整数数组 nums 和一个目标元素 target ,请在数组中搜索“和”为target 的两个元素,并返回它们的数组索引。返回任意一个解即可。

二、实现方法

1. 线性查找:以时间换空间

考虑直接遍历所有可能的组合。如图所示,开启一个两层循环,在每轮中判断两个整数的和是否为target ,若是则返回它们的索引。

代码:

def two_sum_brute_force(nums: list[int], target: int):
    """ 方法一:暴力枚举"""
    # 两层循环,时间复杂度 O(n^2)
    for i in range(len(nums)- 1):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]
    return []

nums = [2, 7, 11, 15]
print(two_sum_brute_force(nums, 13))  # 输出2,11对应的索引[0,2]

此方法的时间复杂度为𝑂(n^{2}),空间复杂度为𝑂(1),在大数据量下非常耗时。

2. 哈希查找:以空间换时间

考虑借助一个哈希表,键值对分别为数组元素和元素索引。循环遍历数组,每轮执行如下步骤。
1. 判断数字target- nums[i] 是否在哈希表中,若是则直接返回这两个元素的索引。
2. 将键值对nums[i] 和索引i添加进哈希表。

代码:

def two_sum_hash_table(nums: list[int], target: int):
    """ 方法二:辅助哈希表"""
    # 辅助哈希表,空间复杂度 O(n)
    dic = {}
    # 单层循环,时间复杂度 O(n)
    for j in range(len(nums)):
        if target - nums[j] in dic:
            return [dic[target - nums[j]], j]
        dic[nums[j]] = j
    return []

nums = [2, 7, 11, 15]
print(two_sum_brute_force(nums, 13))  # 返回[0,2]

此方法通过哈希查找将时间复杂度从𝑂(n^{2})降低至𝑂(𝑛),大幅提升运行效率。
由于需要维护一个额外的哈希表,因此空间复杂度为𝑂(𝑛)。尽管如此,该方法的整体时空效率更为均衡,因此它是本题的最优解法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值