首页
学习
活动
专区
圈层
工具
发布

经典面试题-说明链表、哈希表、数组的特点

本文链接:https://blog.csdn.net/weixin_42528266/article/details/103106190 1、链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的...a)链表的存储在内存中可以是非连续性的,因为链表结构可以通过自身节点中的数据域指针域来找到下一个节点。...b)对链表进行删除插入操作时,只需要将其指针域进行修改即可(相对于数组来说内部操作更便捷) c)链表本身不存在下标,所有查询效率略低。...2、散列表(Hashtable,也叫哈希表),是根据关键码值(Key Value)而直接进行访问的数据结构 a)哈希表最大的优势,就是把数据的存储和查询消耗的时间大大降低,几乎可以看成是常数时间。...b)散列表查询速度快的原因: i.将键值保存在某处,以便于能很快找到(数组中,这里保存的不是键本身而是键的信息,数组的下标就是这个对象的hashCode) ii.查询的过程就变成了,首先生产该对象的HashCode

87110

java常用的几种数据结构,堆栈,队列,数组,链表,哈希表

哈希表 概念:底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置...而这样的数组就称为哈希数组,即就是哈希表。 当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。...即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法...,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。...在哈希表中,每个哈希码值位置上可以存放多个元素。 总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。

88140
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Redis面试(三):底层数据结构(二)

    跳跃表就是在链表的基础上,增加多级索引提升查找效率。...,指向一个字符串对象,而字符串对象则保存着一个SDS值。.....k2,-k2当有相同的键需要插入时,在哈希桶中,就会行成一个链表,链表的节点上记录的就是每个键的值。...具体步骤如下:如果执行扩展操作,会基于原哈希表创建一个大小等于 ht[0].used * 2n 的哈希表(也就是每次扩展都是根据原哈希表已使用的空间扩大一倍创建另一个哈希表)。...相反如果执行的是收缩操作,每次收缩是根据已使用空间缩小一倍创建一个新的哈希表。重新利用上面的哈希算法,计算索引值,然后将键值对放到新的哈希表位置上。所有键值对都迁徙完毕后,释放原哈希表的内存空间。

    57340

    【数据结构进阶】

    二、链表(Linked List)—— 内存中的“指针网络” 核心本质 节点分散:每个节点包含数据和指向下一个节点的指针(引用)。 通过指针链接,形成逻辑上的“链”。 ️...桶数组:一个数组,每个位置是一个“桶”(Bucket)。 解决冲突:当多个键映射到同一个桶时,如何存储? ️... 指针,头尾操作 O(1) HashSet 哈希表(HashMap 的 key 集合) 哈希函数、拉链法、equals() 判断重复 HashMap 数组 + (链表/红黑树) 哈希函数 hash(key...每一个 new 出来的对象,每一个指针的跳转,每一次哈希的计算, 都在内存中真实地发生着。...只有当你能“看见”数组的连续、链表的指针、哈希的冲突、红黑树的旋转, 你才算真正掌握了集合框架的“灵魂”。 这篇深度解析,希望能成为你通往 Java 高手之路的坚实基石!

    20810

    【C++】解决哈希冲突的核心方法:开放定址法 & 链地址法

    哈希冲突的解决 实践中哈希表⼀般还是选择除法散列法作为哈希函数,当然哈希表⽆论选择什么哈希函数也避免不了冲突,那么插⼊数据时,如何解决冲突呢?主要有两种两种⽅法,开放定址法和链地址法。 1....链地址法 概念 开放定址法中所有的元素都放到哈希表⾥,链地址法中所有的数据不再直接存储在哈希表中,哈希表中存储⼀个指针,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成...链接:一个指向下一个节点的指针 next,用于构建链表结构解决哈希冲突。 在哈希表初始化时,所有桶的位置都应被设置为 nullptr,表示空的链表头。...这种必要性源于哈希桶的特殊内存布局:vector容器仅负责管理指针数组本身的空间,而每个指针所指向的链表节点都是在堆上动态分配的独立内存块。...当哈希表对象生命周期结束时,vector的析构函数会自动释放指针数组占用的内存,但对于数组中每个指针所指向的链表节点内存,系统无法自动识别和释放。

    26510

    Redis的设计与实现-链表字典跳跃表

    head,表尾指针tail,长度计数len,特定类型的函数等 5.链表表头前置和表尾后置都是指向null,所以是无环链表,设置不同类型特定函数,可以用于保存不同类型的值 字典 1.字典,又称为符号表/关联数组...的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存了字典中的一个键值对 4.redis字典所使用的哈希表由dict.h/dictht结构,table属性是一个数组,每个元素都是指向...,next属性是指向另一个哈希表节点的指针,以此解决键冲突,通过next指针将两个索引值相同的键k1和k0连接在一起 6.Redis字典由dict.h/dict结构表示,type属性和privdata属性是针对不同类型的键值对...,为创建多态字典设置;ht属性是一个包含两个项的数组,每一项都是dictht哈希表,一般只使用ht[0],ht[1]只会在哈希表进行rehash的时候使用,rehashidx记录rehash的进度 7....9.哈希表保存的键值对逐渐增多或者减少,为了让哈希表的负载因子维持在一个合理的范围内,程序对大小进行扩展或者收缩 redis的设计与实现-跳跃表 1.跳跃表(skiplist)是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针

    1.6K30

    万字长文,38 图爆肝 Redis 基础!

    在 Java 中 LinkedList 的底层数据结构就是链表 + 数组实现的。那 Redis 中的链表是怎样的呢? 按照惯例,上源码。...获取带表头指针、表尾指针、节点数量的时间复杂度均为 O (1)。 链表使用 void * 指针来保存节点值,可以保存各种不同类型的值。 2.3 哈希表 哈希表,大家也都不陌生吧?...在 Java 中哈希表的底层数据结构就是数组 + 链表实现的。那 Redis 中的哈希表是怎样实现的呢? 按照惯例,上源码。...**next 则是执行下一个哈希表节点的指针,可以将多个哈希值相同的键值对连接在一起作为一个链表,以此来解决键冲突(collision)的问题。...而 Redis 解决哈希冲突的手段很 Java 一样,都是链式哈希:同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。 ?

    86870

    《闲扯Redis七》Redis字典结构的底层实现

    next 属性是指向另一个哈希表节点的指针, 这个指针可以将多个哈希值相同的键值对连接在一次, 以此来解决键冲突(collision)的问题。..., 为创建多态字典而设置的 type 属性是一个指向 dictType 结构的指针, 每个 dictType 结构保存了一簇用于操作特定类型键值对的函数, Redis 会为用途不同的字典设置不同的类型特定函数...k0 和 v0 的节点应该被放置到哈希表数组的索引 0 位置上, 结构图解:图 4-5 ?...Redis 的哈希表使用链地址法(separate chaining)来解决键冲突: 每个哈希表节点都有一个 next 指针, 多个哈希表节点可以用 next 指针构成一个单向链表, 被分配到同一个索引上的多个节点可以用这个单向链表连接起来...因为 dictEntry 节点组成的链表没有指向链表表尾的指针, 所以为了速度考虑, 程序总是将新节点添加到链表的表头位置(复杂度为 O(1)), 排在其他已有节点的前面。

    1.6K42

    一网打尽面试中常被问及的8种数据结构

    每个节点都包含一个密钥和一个指向其后继节点(称为next)的指针。 名为head的属性指向链接列表的第一个元素。 链表的最后一个元素称为尾。 Fig 2....双链表-可以在前进和后退方向上遍历项目。节点由一个称为上一个的附加指针组成,指向上一个节点。 循环链接列表—链接列表,其中头的上一个指针指向尾部,尾号的下一个指针指向头。...链表操作 搜索:通过简单的线性搜索在给定的链表中找到键为k的第一个元素,并返回指向该元素的指针 插入:在链接列表中插入一个密钥。...5.哈希表 哈希表是一种数据结构,用于存储具有与每个键相关联的键的值。此外,如果我们知道与值关联的键,则它有效地支持查找。因此,无论数据大小如何,插入和搜索都非常有效。...我们可以通过选择合适的哈希函数h并使用链接和开放式寻址等技术来解决冲突。 哈希表的应用 用于实现数据库索引。 用于实现关联数组。 用于实现"设置"数据结构。

    63910

    为了拿捏 Redis 数据结构,我画了 40 张图(完整版)

    Redis 采用了「链式哈希」来解决哈希冲突,在不扩容哈希表的前提下,将具有相同哈希值的数据串起来,形成链接起,以便这些数据在表中仍然可以被查询到。 接下来,详细说说哈希表。...struct dictEntry *next; } dictEntry; dictEntry 结构里不仅包含指向键和值的指针,还包含了指向下一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对链接起来...哈希冲突 哈希表实际上是一个数组,数组里多每一个元素就是一个哈希桶。...实现的方式就是每个哈希表节点都有一个 next 指针,用于指向下一个哈希表节点,因此多个哈希表节点可以用 next 指针构成一个单项链表,被分配到同一个哈希桶上的多个节点可以用这个单项链表连接起来,这样就解决了哈希冲突...还是用前面的哈希冲突例子,key1 和 key9 经过哈希计算后,都落在同一个哈希桶,链式哈希的话,key1 就会通过 next 指针指向 key9,形成一个单向链表。

    58510

    Java中常见的八种数据结构

    数组类型的数据结构在插入和删除时时间复杂度高;链表类型的数据结构在查询时时间复杂度高;而哈希表结合了数组与链表的优势。 在jdk8中,Java中经典的HashMap,以数组+链表+红黑树构成。...哈希值并不是具有唯一性,在某些情况下Hash值会冲突,HashMap在Hash冲突时,会将元素在数组的位置上添加为链表元素结点,当链表长度大于8时,链表会转换为红黑树。...所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接...数组(Array) 数组是一种线性表的数据结构,连续的空间存储相同类型的数据。 优点:查询速度快。 缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。...循环链表:循环链表与双向链表相似,不同的地方在于:在链表的尾部增加一个指向头结点的指针,头结点也增加一个指向尾节点的指针,以及第一个节点指向头节点的指针,从而更方便索引链表元素。

    2.3K20

    每个程序员都必须知道的8种数据结构

    · 每个节点都包含一个密钥和一个指向其后继节点(称为next)的指针。 · 名为head的属性指向链接列表的第一个元素。 · 链表的最后一个元素称为尾。 ? Fig 2....· 双链表-可以在前进和后退方向上遍历项目。节点由一个称为上一个的附加指针组成,指向上一个节点。 · 循环链接列表—链接列表,其中头的上一个指针指向尾部,尾号的下一个指针指向头。...链表操作 · 搜索:通过简单的线性搜索在给定的链表中找到键为k的第一个元素,并返回指向该元素的指针 · 插入:在链接列表中插入一个密钥。...5.哈希表 哈希表是一种数据结构,用于存储具有与每个键相关联的键的值。此外,如果我们知道与值关联的键,则它有效地支持查找。因此,无论数据大小如何,插入和搜索都非常有效。...我们可以通过选择合适的哈希函数h并使用链接和开放式寻址等技术来解决冲突。 哈希表的应用 · 用于实现数据库索引。 · 用于实现关联数组。 · 用于实现"设置"数据结构。

    1.9K10

    Redis字典的实现方式和冲突处理

    Redis字典是一个用来存储键值对的数据结构,它使用哈希表来实现。图片哈希表的内部实现Redis的哈希表是一个数组,数组的每个元素都是一个指向哈希表节点的指针。...每个哈希表节点包含一个键和值的对,同时还有指向下一个节点的指针,从而形成一个链表。哈希表通过将键映射到数组的索引位置来实现高效的查找和插入操作。...首先,使用哈希函数将键映射到一个索引槽位上,然后该槽位上存储了一个指向链表的指针,链表中保存了哈希值相同的所有键值对。如果两个键的哈希值相同,它们会被插入到同一个索引槽位上的链表中。...Redis中的字典实际上使用了一个比较复杂的数据结构,称为哈希表(hash table)。哈希表中的每个槽并不直接存储链表指针,而是存储一个指向字典节点(dictEntry)的指针。...具体实现方式是在哈希表的每个槽中存储一个指向链表的指针,并且使用字典节点存储具体的键值对内容。这种方式可以在哈希表中高效地存储大量的键值对,并且解决键冲突的问题。

    72951

    Java中常见的八种数据结构

    数组类型的数据结构在插入和删除时时间复杂度高;链表类型的数据结构在查询时时间复杂度高;而哈希表结合了数组与链表的优势。 在jdk8中,Java中经典的HashMap,以数组+链表+红黑树构成。...哈希值并不是具有唯一性,在某些情况下Hash值会冲突,HashMap在Hash冲突时,会将元素在数组的位置上添加为链表元素结点,当链表长度大于8时,链表会转换为红黑树。...所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接...数组(Array) 数组是一种线性表的数据结构,连续的空间存储相同类型的数据。 优点:查询速度快。 缺点:数组在创建时大小确定,无法扩容。数组只能存储一种类型的数据。添加、删除元素慢。...循环链表:循环链表与双向链表相似,不同的地方在于:在链表的尾部增加一个指向头结点的指针,头结点也增加一个指向尾节点的指针,以及第一个节点指向头节点的指针,从而更方便索引链表元素。

    49830

    Redis 字典

    但是,链表因为要存储指针,所以对于比较小的对象的存储,是比较消耗内存的,而且链表中的结点是零散分布在内存中的,不是连续的,所以对CPU缓存是不友好的,这对于执行效率有一定的影响。...2.1.2 散列表 typedef struct dictht{ //哈希表数组,C语言中,*号是为了表明该变量为指针,有几个* 号就相当于是几级指针,这里是二级指针,理解为指向指针的指针...; //该哈希已有节点的数量 unsigned long used; }dictht; table属性是一个数组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,...next属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对连接在一起,解决键冲突问题。...2.2 Redis如何解决散列冲突 2.2.1 链表法 当有两个或以上的键被分配到散列表数组同一个索引上时,就发生了键冲突。Redis使用链表法解决散列冲突。

    2.2K84

    Redis系列之底层数据结构字典Dict

    Redis系列之底层数据结构字典Dict Dict数据结构 Dict是Redis数据结构中使用最为频繁的复合型数据结构,本质上是一个哈希表 查看redis6.0版本的源码,链接:https://github.com...//哈希表已有节点的数量 unsigned long used; }dictht 哈希表由数组table组成,table 中每个元素都是指向dictEntry这种数据结构,key用来保存键,val...redis中的dict采用的是链地址法,也可以说使用链表来解决hash冲突。...redis 中的dict通过next指针,可以将多个哈希值相同的键值对连接起来,用来解决哈希冲突 Dict拓展知识点 redis中计算哈希值和索引值的方法 # 使用字典设置的哈希函数计算哈希值 hash...哈希冲突的解决方法是采用链地址法,通过*next指针指向下一个具有相同索引值的hash表节点

    23000

    聊聊它的数据结构

    key和val的指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希值相同的键值对链接在一起,由此来解决哈希冲突问题(链地址法)。...实际上,redis常用5中类型都是以redisObject来存储的;而redisObject中的type字段指明了Value对象的类型,ptr字段则指向对象所在的地址。...上面源码可以简化成如下结构: 这个结构类似于JDK7以前的HashMap,当有两个或以上的键被分配到哈希数组的同一个索引上时,会产生哈希冲突。...Redis也使用链地址法来解决键冲突。即每个哈希表节点都有一个next指针,多个哈希表节点用next指针构成一个单项链表,链地址法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位。...跳跃表(skiplist)是一种有序数据结构,它通过在某个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。

    1.1K20

    从数据存储角度分析Redis为何这么快?

    ,里面有着key和val的指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希值相同的键值对链接在一起,由此来解决哈希冲突问题(链地址法)。...实际上,redis常用5中的类型都是以redisObject来存储的;而redisObject中的type字段指明了Value对象的类型,ptr字段则指向对象所在的地址。...前面说过,Redis每个对象由一个redisObject结构表示,它的ptr指针指向底层实现的数据结构,而数据结构由encoding属性决定。...,会产生哈希冲突。...Redis也使用链地址法来解决键冲突。即每个哈希表节点都有一个next指针,多个哈希表节点用next指针构成一个单项链表,链地址法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位。

    1K10

    Redis 为什么这么快?

    dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val的指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希值相同的键值对链接在一起...实际上,redis常用5中类型都是以redisObject来存储的;而redisObject中的type字段指明了Value对象的类型,ptr字段则指向对象所在的地址。...这个结构类似于JDK7以前的HashMap,当有两个或以上的键被分配到哈希数组的同一个索引上时,会产生哈希冲突。 Redis也使用链地址法来解决键冲突。...即每个哈希表节点都有一个next指针,多个哈希表节点用next指针构成一个单项链表,链地址法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位。...跳跃表(skiplist)是一种有序数据结构,它通过在某个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。

    1.2K30

    《C++进阶之STL》【哈希表】

    它的核心思路是:用数组 + 链表(或其他动态结构)的组合,让冲突元素 “链” 在一起,既简单又高效。...链地址法的原理: 哈希表底层是一个数组(称为 “哈希桶数组” ),每个数组元素对应一个链表 / 动态结构(如:链表、红黑树、跳表 ) 插入元素时: 通过哈希函数计算 key 的哈希值,确定要放入数组的哪个...而链地址法不同,数据不再直接存储于哈希表,哈希表的每个位置存的是一个指针。 当没有数据映射到该位置时,指针为空 若有多个数据映射到同一位置,就把这些冲突数据链成链表,挂在哈希表对应位置下。...,影响性能 { /* //////////////////方法一:创建新哈希表对象并复用Insert函数////////////////// //2.创建新哈希表,容量为大于当前...6.定义一个指针指向当前节点的下一个节点的指针 ---> 暂存下一节点避免链表断裂 Node* next = current->_next; //7.实例化哈希函数

    21910
    领券