搜索——哈希优化策略
一、背景介绍
在算法中,常通过将线性查找替换为哈希查找来降低算法的时间复杂度。
例:给定一个整数数组 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]
此方法的时间复杂度为𝑂(),空间复杂度为𝑂(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]] = jreturn []nums = [2, 7, 11, 15]
print(two_sum_brute_force(nums, 13)) # 返回[0,2]
此方法通过哈希查找将时间复杂度从𝑂()降低至𝑂(𝑛),大幅提升运行效率。
由于需要维护一个额外的哈希表,因此空间复杂度为𝑂(𝑛)。尽管如此,该方法的整体时空效率更为均衡,因此它是本题的最优解法。