当前位置: 首页 > ds >正文

搜索——哈希优化策略

一、背景介绍

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

例:给定一个整数数组 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]] = jreturn []nums = [2, 7, 11, 15]
print(two_sum_brute_force(nums, 13))  # 返回[0,2]

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

http://www.xdnf.cn/news/3165.html

相关文章:

  • MTK Genio500 移植GMS及youtube问题处理的解决办法
  • docker拉取国内镜像
  • Javascript 中的继承?如何实现继承?
  • 解密Cloak斗篷技术:FP独立站推广利器
  • [论文阅读]Adversarial Semantic Collisions
  • 为什么要学习《易经》?
  • 大模型核心技术及架构解析
  • Android Q允许低内存启用系统弹窗
  • 蓝桥杯算法开发企业级实战指导:从0到1的C/C++全攻略
  • kubelet 清理资源以缓解磁盘压力
  • 考OCM证书前需要有OCP证书
  • 再谈cookie和session(结合表白墙具体案例)
  • 第一讲 | 算法复杂度
  • Jmeter接口自动化测试读取用例
  • 软件设计师-软考知识复习(2)
  • 边缘计算服务器
  • C++类和对象(2)关于类的默认成员函数
  • python初学
  • 【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
  • Android第五次面试总结之网络篇(修)
  • 经典算法 最长单调递增子序列
  • Stable Diffusion基础配置
  • 使用 v-print 实现 Vue 项目中的打印功能
  • rust 全栈应用框架dioxus
  • 深入解析常见排序算法及其 C# 实现
  • 系统思考培训助力总经理
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月29日第67弹
  • RISE with SAP 的合同及许可解析
  • 【电子对抗训练革命】新一代便携式雷达模拟器技术解密
  • Spring事务开发经验 回滚和不回滚?