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-从本质层面了解数据结构与算法的主要内容,如果未能解决你的问题,请参考以下文章