Android-从本质层面了解数据结构与算法

Posted 天津 唐秙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-从本质层面了解数据结构与算法相关的知识,希望对你有一定的参考价值。

从本质层面了解数据结构与算法

技术点

  1.计算机存储单元与存储结构分析
  2.算法与数据结构的关系
  3.基础存储单元与连续存储单元
  4.ArrayList与LinkedList结构分析
  5.HashMap底层存储原理详解
  6.Hash算法详解与Hash冲突
  7.HashMap头插法与尾插法的优缺点
  8.HashMap导致100%CPU解密

容器与结构

  数据结构是计算机存储、组织数据的方式。数据结构是指相互之间一种或多种特定关系的数据元素的集合,通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率,数据结构往往同高效的检索算法和索引技术相关。
  本质:容器的设计规则
  用处:运行效率的提升
  程序系统中基础容器提供了两个变量和数组,变量是单个存储的介质,硬件中就是1010101,内存或者磁盘上的表示形式就是一堆的地址指向某一组空间。当我们出现一定的业务场景出现,系统提供的两种容器不能满足我们,所以需要做出一些额外的容器。
  我现在要接受一个消息,但是我不知道消息的数据量多大,也不知道接受的数据类型,可能有多种。

容器类别与结构本质

在Java中实际的数据容器有两种
  1.基本存储单元(单个数据存储,包含两块基本数据类型,对象)
  2.连续数据存储(数组)
数组=Java提供出来的数据结构
数据结构的特种:
  1.对于数据类型设计
  2.对于数据存储与提取设计
  3.对于数据物理结构设计
数据结构的本质是一个管理类他是对于上面三点的一个维护

ArrayList

优点和缺点:
效率
  查询:用空间去换时间,一次性先把你要的空间给你,查询的时候使用下标,一步到位
  增删改:增删改方便,一旦超过容量,需要进行复制数组,如果要在整个记录中进行插入,后面的数据都要跟着动
关于数据结构算法效率:
  时间复杂度:
  空间复杂度:
  加大空间的消耗,换取运算速度的提升
  加大运算速度的消耗,换取存储性能的提升

LinkedList

  思路:我选择用单个存储,变量,想要变成一组数据有序,那么需要逻辑控制,双链表在单链表的基础上,在每组变量的引用中多了一组引用,一组引用占位32位空间,在增删改的时候速度快,但是查询慢。
效率

HASH表


  综合一下,用数组解决查询慢的问题,底层还是用链表对数据进行存储,空间不用开辟,用多少开多少,不浪费。
  HashMap底层hash表,通过k-v,因为内存地址或者是磁盘地址,在计算机中是唯一的,底层的话对于地位的截取采用的方式不是取模,而是通过&运算,依照上面这个结果,必须做出妥协,妥协是数组的长度必须是2的幂次方-1。

HashMap死环问题

  HashMap每次扩容都是2倍,为了保持2的幂次方,为了妥协数组长度

1.7版本问题最大的地方

进行一次扩容之后,里面的数据会进行一次颠倒

hashMap中存在死环问题:
  死环问题的产生是,头插法会调换两个对象的引用位置,如果存在另一个对他进行提前更改,会出现死环

  1.8的HashMap
  将哈希值向右移动了16位,产生一个高位和低位,

HashMap问题:
1.为什么扩容是两倍扩容?
  因为2的幂次方,一定程度上解决了hash冲突,但是并没有完全解决,没有完全解决的方案
2.为什么出现死环,怎么解决?
  因为头插法会出现,完成数据替换后,前后顺序颠倒,如果出现线程切换问题,造成相互引用,出现死环
  1.8解决方案:不进行头插,同时加入高低位,在结束后,断掉末尾,高低位分开插入
3.为什么用异或?
  解决哈希冲突

总结

数据结构本质:
   一个管理类

计算机提供出来的计算单位:
   变量,数组

以上是关于Android-从本质层面了解数据结构与算法的主要内容,如果未能解决你的问题,请参考以下文章

Android-从本质层面了解数据结构与算法

什么是数据结构与算法

学术|张欣:算法行政的架构原理本质特征与法治化路径

数据结构第一节 递归

前端性能优化成神之路-总结

数据库与数据仓库的本质区别是什么?