美文网首页iOS高级技术文章
iOS 数组、链表、Hash

iOS 数组、链表、Hash

作者: tanghaiyang | 来源:发表于2020-03-03 10:21 被阅读0次
  • 数组是将元素在内存中连续存放。
  • 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。
  • 数组必须事先定义固定的长度,不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
  • 链表动态地进行存储分配,可以适应数据动态地增减的情况。
  • (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
  • 链表从堆中分配空间, 自由度大但是申请管理比较麻烦。
数组和链表在存储数据方面到底孰优孰劣呢?根据数组和链表的特性,分两类情况讨论。

一、当进行数据查询时,数组可以直接通过下标迅速访问数组中的元素。而链表则需要从第一个元素开始一直找到需要的元素位置,显然,数组的查询效率会比链表的高。

二、当进行增加或删除元素时,在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样,如果想删除一个元素,需要移动大量元素去填掉被移动的元素。而链表只需改动元素中的指针即可实现增加或删除元素。

那么,我们开始思考:有什么方式既能够具备数组的快速查询的优点又能融合链表方便快捷的增加删除元素的优势?HASH呼之欲出。

所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个key值,输入的数据存储到数组中下标为key值的数组单元中去。

我们发现,不相同的数据通过hash函数得到相同的key值。这时候,就产生了hash冲突。解决hash冲突的方式有两种。一种是挂链式,也叫拉链法。挂链式的思想在产生冲突的hash地址指向一个链表,将具有相同的key值的数据存放到链表中。另一种是建立一个公共溢出区。将所有产生冲突的数据都存放到公共溢出区,也可以使问题解决。

hash表其实是结合了数组和链表的优点,进行的折中方案。平衡了数组和链表的优缺点。hash的具体实现有很多种,但是需要解决冲突的问题。​

不相同的数据通过hash函数得到相同的key值。这时候,就产生了hash冲突。解决hash冲突的方式有两种。一种是挂链式,也叫拉链法。挂链式的思想在产生冲突的hash地址指向一个链表,将具有相同的key值的数据存放到链表中。另一种是建立一个公共溢出区。将所有产生冲突的数据都存放到公共溢出区,也可以使问题解决。

相关文章

  • iOS 数组、链表、Hash

    数组是将元素在内存中连续存放。链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。 数组必须事...

  • 面试容器

    hashmap实现的数据结构,数组、桶等。 如图所示 JDK 1.7,是以数组+链表组成的,链表为相同hash的键...

  • 数据结构和算法总结

    常用数据结构: 数组,栈,队列,链表(单向链表,双端链表,双向链表),哈希表(hash table),树(二叉树,...

  • HashMap浅析

    数据结构 JDK1.7数组+链表JDK1.8数组+链表+红黑树 为什么使用链表产生Hash冲突的常见做法有两种拉链...

  • FAQ-HashMap & ConcurrentHashMap

    HashMap数组+链表非同步,可使用 Collections.synchronizedMap 构造同步 Hash...

  • HashMap1.8源码分析

    使用的数据机构 Node[] 链接结构 TreeNode[] 红黑树结构 使用hash表(数组+链表),当链表过长...

  • redis-hash

    hash 字典 类似于java中的hashmap,数组加链表,碰撞进链表 区别: rehash过程不同,redis...

  • Java HashMap

    HashMap数据结构 数组+链表,如果产生hash冲突,后进的值放入链表的头,默认数组的大小为16,加载因子为0...

  • 数据结构-Hash

    1. 什么是Hash表 先看一下hash表的结构图: 数组 + 链表 哈希表(Hash table,也叫散列表),...

  • 笔记-数据结构之 Hash(OC的粗略实现)

    什么是Hash表 先看一下hash表的结构图: 数组 + 链表 哈希表(Hash table,也叫散列表),是根据...

网友评论

    本文标题:iOS 数组、链表、Hash

    本文链接:https://www.haomeiwen.com/subject/jioflhtx.html