热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

哈希表-使用二进制搜索树实现

如何解决《哈希表-使用二进制搜索树实现》经验,为你挑选了1个好方法。

破解编码面试,第71页:

或者,我们可以使用BST实现哈希表.然后我们可以保证O(log n)查找时间,因为我们可以保持树平衡.另外,我们可以使用更少的空间,因为不需要在一开始就分配大型阵列.

我知道链表,哈希表和BST的基础知识,但我无法理解这些行.它究竟意味着什么?这个最终的数据结构会是Trie吗?



1> paxdiablo..:

是部分国家的文字,随着最后一段是你问了一句:

哈希表是一种数据结构,它将键映射到值以进行高效查找.在散列表的非常简单的实现中,散列表具有底层数组和散列函数.如果要插入对象及其键,哈希函数会将键映射到整数,该整数表示数组中的索引.然后将该对象存储在该索引处.

但通常情况下,这不太适用.在上面的实现中,所有可能键的哈希值必须是唯一的,否则我们可能会意外地覆盖数据.数组必须非常大 - 所有可能键的大小 - 以防止这种"冲突".

我们不是制作一个非常大的数组并将对象存储在索引散列(键)中,而是可以使数组更小,并将对象存储在索引散列(键)%array_length的链表中.为了获得具有特定键的对象,我们必须在链表中搜索此密钥.

或者,我们可以使用二叉搜索树实现哈希表.然后我们可以保证0(log n)查找时间,因为我们可以保持树平衡.另外,我们可以使用更少的空间,因为不需要在一开始就分配大型阵列.

所以他们谈论使用BST(二叉搜索树)来处理冲突.使用BST作为唯一的数据结构实际上没有意义,因为正确调整的散列的整个点是查找的顺序O(1),比BST的好得多O(log n).最重要的是,使用BST 完全实现哈希表意味着它实际上不是哈希表:-)

但是,请注意,当您在哈希表中发生冲突时,处理它们的常用方法是让每个存储桶包含其项目的链接列表.在简并的情况下(所有项目都散列到同一个桶),你最终只得到一个链表并且O(1)转入O(n).

因此,您有一个BST,而不是每个桶的链表.然后O(n),在单个存储桶具有多个项目(前面提到的冲突)的情况下,您不再具有搜索复杂性.

您可以使用哈希函数查找存储桶,O(1)然后在O(log n)存在冲突的情况下搜索BST .在最好的情况下(每桶一个项目),它仍然是O(1).最坏的情况然后变得O(log n)而不是O(n).

我最初关心这个理论的唯一问题是,他们还讨论了不再需要大量分配的事实.如果它是共享散列/ BST组合,您仍然需要分配整个散列表,以使其看起来不协调.

但是,从上下文("......因为不再需要分配大型数组......")看来,它们意味着它们可以使哈希表成为双数据结构的一部分,因为冲突更有效处理.换句话说,如果使用BST,则可以使用100个元素的哈希表,而不是具有链接列表的1000个元素哈希表,因为冲突不会对搜索时间造成太大损害.


推荐阅读
  • 文章目录题目:二叉搜索树中的两个节点被错误地交换。基本思想1:中序遍历题目:二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下 ... [详细]
  • 集合类中只能存放对象,而不能存放原始数据类型的元素,所以当有原始数据类型需要存放时,只能将其转换成相应的包装类对象。1)访问和遍历数组元素时,ArrayList的 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 一、HashMap1.HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是 ... [详细]
  • (2.1.8)Java之集合类:set、list、hashmap、hashtable等和迭代器iterator
    一、容器常见的集合类有这些种:实现Collection接口的:Set、List以及他们的实现类。实现Map接口的:HashMap及其实现类编程爱好者学习,下面我我们通过一个图来整体描述一下:这个图片没 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • 要讨论这些常用的默认初始容量和扩容的原因是:当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复 ... [详细]
author-avatar
一起去钓鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有