(嵌入式八股)第4章 STL(二)(后续STL相关会持续补充在这里)

4.11 哈希碰撞与哈希冲突

哈希碰撞(Hash Collision)和 哈希冲突(Hash Collision)这两个术语常常被混用,但它们在某些文献中可能有略微的区别。实际上,在大多数情况下,它们指的是相同的现象:当两个不同的输入数据(或者对象)通过哈希函数映射到同一个哈希值时,发生了冲突或碰撞。

哈希碰撞:

哈希碰撞指的是,当两个不同的输入数据通过哈希函数处理后,得到了相同的哈希值。这是因为哈希函数的输出空间是有限的,而输入空间可能是无限的,因此无法避免不同的输入映射到相同的哈希值。

哈希冲突:

哈希冲突通常用于描述哈希表中的实际问题。当两个不同的键被哈希到相同的桶(即同一个哈希值)时,就发生了冲突。在哈希表中处理这种情况时,通常会使用一些解决策略,比如链地址法开放地址法

解决哈希冲突的方法:

  1. 链地址法:使用链表来存储冲突的元素。多个元素可能会被映射到相同的哈希值,在这种情况下,这些元素会被存储在同一个链表中。
  2. 开放地址法:当发生哈希冲突时,寻找另一个空的桶来存放元素。常见的方法包括线性探测、二次探测和双重哈希。

插入元素

  1. 首先插入了 "apple", "banana""orange",每个元素都映射到哈希表中的不同桶。
  2. 然后 "apple" 被再次插入并赋予新的值 4,这表示在哈希表中发生了哈希冲突。哈希表通过更新已存在的键值对来解决冲突,而不是将其放入不同的位置。

查找操作

  1. 查找 "apple" 返回的是最后插入的值 4,而不是之前的 1。这说明哈希表通过更新操作解决了冲突。
  2. "banana""orange" 的查找操作返回各自正确的值。

哈希冲突的解决

  1. 该示例并没有明确使用链地址法或开放地址法来解决冲突,这部分通常由 std::unordered_map 的实现自动处理。
  2. 对于哈希冲突,std::unordered_map 会根据其内部实现使用合适的方法,如链地址法,来解决键值对存储和查找的问题。

总结

  • 哈希碰撞哈希冲突 都指的是不同的输入映射到相同的哈希值。
  • 哈希冲突在实际的哈希表中被通过链地址法或开放地址法等策略处理。
  • 解决哈希冲突后,哈希表能够继续存储和检索数据,但会有一定的性能影响。

4.12 STL 容器的底层数据结构及复杂度分析

std::vector

底层实现:动态数组

操作复杂度分析

  • 插入:平均情况:O(1)(在尾部插入),因为动态数组的末尾插入不需要移动其他元素。最坏情况:O(n)(需要重新分配和复制),当当前容量不足时,需要分配一个新的更大的内存块,并复制原始数据。
  • 查找:O(1),支持通过下标进行快速随机访问。
  • 删除:O(1)(在尾部删除),只需要减少容器的大小。O(n)(在中间删除),需要移动删除位置后面的所有元素。
  • 空间复杂度:O(n),因为 std::vector 需要存储其元素,并且会有一定的内存预留以减少扩容频率。

std::array

底层实现:固定大小的数组

操作复杂度分析

  • 插入:N/A,因为 std::array 的大小在编译时固定,因此不能插入元素。
  • 查找:O(1),支持通过下标进行随机访问。
  • 删除:N/A,同样因为大小固定,不能删除元素。
  • 空间复杂度O(n),因为它存储固定大小的元素。

std::deque

底层实现:分段的动态数组(块链)

操作复杂度分析

  • 插入:平均情况:O(1)(在尾部和头部插入),因为 deque 使用了分段数组,可以在两端快速插入元素。最坏情况:O(n),当需要重新分配内存时,可能会重新分配整个 deque。
  • 查找:O(1),支持随机访问。
  • 删除:O(1),在两端删除元素。
  • 空间复杂度:O(n),存储分段数组。

std::list

底层实现:双向链表

操作复杂度分析

  • 插入:O(1),插入操作在链表中间或两端非常高效。
  • 查找:O(n),需要遍历链表来找到元素。
  • 删除:O(1),删除操作在链表

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

作者简介:仅用几个月时间0基础天坑急转嵌入式开发,逆袭成功拿下华为、vivo、小米等15个offer,面试经验100+,收藏20+面经,分享求职历程与学习心得。 专栏内容:这是一份覆盖嵌入式求职过程中99%问题指南,详细讲解了嵌入式开发的学习路径、项目经验分享、简历优化技巧、面试心得及实习经验,从技术面,HR面,AI面,主管面,谈薪一站式服务,助你突破技术瓶颈、打破信息差,争取更多大厂offer。

全部评论

相关推荐

AI大模型产品经理的职责和能力要求需要结合技术深度与产品管理的广度。一、职责上1. 产品战略与规划- 制定大模型产品的长期愿景与落地路径,平衡技术可行性、市场需求和商业价值。- 探索垂直场景(如医疗、金融、教育)的应用,定义产品形态(API、SaaS、嵌入式解决方案等)。2. 需求洞察与优先级管理- 深度理解用户痛点(如企业降本增效需求),转化为技术需求(如模型微调、Prompt工程)。- 权衡需求优先级,例如在模型效果(准确率)、成本(算力消耗)和用户体验(响应速度)间找到平衡。3. 技术协同与模型迭代- 与算法团队合作优化模型性能,参与关键决策(如选择基座模型、调整训练数据分布)。- 推动模型迭代闭环,设计评估指标(如任务完成率、幻觉率)并分析用户反馈数据。4. 数据与合规治理- 构建数据飞轮:设计用户反馈→数据标注→模型优化的链路,确保数据合规(如隐私脱敏、版权审查)。- 制定内容安全策略(如敏感词过滤、输出结果审核机制),应对伦理风险(偏见、误导性生成)。5. 商业化与生态建设- 设计盈利模式(按调用量收费、定制化训练服务),探索生态合作(开发者社区、行业伙伴共建场景)。- 推动市场教育,降低用户使用门槛(如提供低代码工具、行业最佳实践案例库)。二、核心能力1. 技术理解力- 掌握大模型核心概念(Transformer架构、RLHF、LoRA微调),能评估技术方案优劣(如选择开源模型 vs 自研)。- 了解工程约束(推理延迟、显存占用)及优化方向(模型压缩、分布式推理)。2. 场景抽象能力- 将碎片化需求抽象为通用能力(如客服场景中的“多轮对话管理”模块),提升模型复用性。- 设计领域适配方案(如法律场景的术语增强训练、医疗场景的检索增强生成)。          
点赞 评论 收藏
分享
评论
5
4
分享

创作者周榜

更多
牛客网
牛客企业服务