链表(Linked list)比数组稍微复杂一点,在咱们生活中用到最多见的应该是缓存,它是一种提升数据读取性能的技术,常见的如cpu缓存,浏览器缓存,数据库缓存等。今天咱们就来学习一下链表html
1.一种线性表(数据排成像一条线同样的结构。每一个线性表上的数据最多有先后两个方向);
2.从存储结构来看,经过“指针”,将一组零散的内存块串联起来使用的数据结构;
3.链表中的每个内存块被称为结点Node,结点除了存储数据外,还需记录链上下一个节点的地址(next)算法
1.插入、删除数据效率高,时间复杂度为O(1)(只需更改指针指向便可),随机访问效率低,时间复杂度为O(n)级别(须要从链头至链尾进行遍历)。
2.和数组相比,内存空间消耗更大,由于每一个存储数据的节点都须要额外的空间存储后继指针。数据库
1)每一个节点只包含一个指针,即后继指针。
2)单链表有两个特殊的节点,即首节点和尾节点。数组
用首节点地址表示整条链表,尾节点的后继指针指向空地址null。浏览器
3)性能特色:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。缓存
1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。
2)适用于存储有循环特色的数据,好比约瑟夫问题。数据结构
1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。
2)当此“链接”为第一个“链接”时,指向空值或者空列表post
当此“链接”为最后一个“链接”时,指向空值或者空列表)性能
3)性能特色:
和单链表相比,存储相同的数据,须要消耗更多的存储空间。
插入、删除操做比单链表效率更高O(1)级别。学习
以删除操做为例,删除操做分为2种状况:
给定数据值删除对应节点和给定节点地址删除节点。
对于前一种状况,单链表和双向链表都须要从头至尾进行遍历从而找到对应节点进行删除,时间复杂度为O(n)。
对于第二种状况,要进行删除操做必须找到前驱节点,单链表须要从头至尾进行遍历直到p->next = q,时间复杂度为O(n),而双向链表能够直接找到前驱节点,时间复杂度为O(1)。
对于一个有序链表,双向链表的按值查询效率要比单链表高一些。
由于咱们能够记录上次查找的位置p,每一次查询时,根据要查找的值与p的大小关系,决定是往前仍是日后查找,因此平均只须要查找一半的数据。
首节点的前驱指针指向尾节点,尾节点的后继指针指向首节点。
块状链表自己是一个链表,可是链表储存的并非通常的数据,而是由这些数据组成的顺序表。每个块状链表的节点,也就是顺序表,能够被叫作一个块。
块状链表经过使用可变的顺序表的长度和特殊的插入、删除方式,能够在达到{\displaystyle O({\sqrt {n}})}的复杂度。块状链表另外一个特色是相对于普通链表来讲节省内存,由于不用保存指向每个数据节点的指针。
数组:插入、删除的时间复杂度是O(n),随机访问的时间复杂度是O(1)。
链表:插入、删除的时间复杂度是O(1),随机访问的时间复杂端是O(n)。
1)若申请内存空间很大,好比100M,但若内存空间没有100M的连续空间时,则会申请失败,尽管内存可用空间超过100M。
2)大小固定,若存储空间不足,需进行扩容,一旦扩容就要进行数据复制,而这时很是费时的。
1)内存空间消耗更大,由于须要额外的空间存储指针信息。
2)对链表进行频繁的插入和删除操做,会致使频繁的内存申请和释放,容易形成内存碎片,若是是Java语言,还可能会形成频繁的GC(自动垃圾回收器)操做。
数组简单易用,在实现上使用连续的内存空间,能够借助CPU的缓冲机制预读数组中的数据,因此访问效率更高,而链表在内存中并非连续存储,因此对CPU缓存不友好,没办法预读。
若是代码对内存的使用很是苛刻,那数组就更适合
CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中。而CPU每次从内存读取数据并非只读取那个特定要访问的地址,而是读取一个数据块(这个大小我不太肯定。。)并保存到CPU缓存中,而后下次访问内存数据的时候就会先从CPU缓存开始查找,若是找到就不须要再从内存中取。这样就实现了比内存访问速度更快的机制,也就是CPU缓存存在的意义:为了弥补内存访问速度过慢与CPU执行速度快之间的差别而引入。
对于数组来讲,存储空间是连续的,因此在加载某个下标的时候能够把之后的几个下标元素也加载到CPU缓存这样执行速度会快于存储空间不连续的链表存储。
相关文章
以上内容为我的的学习笔记,仅做为学习交流之用。
欢迎你们关注公众号,不定时干货,只作有价值的输出
做者:Dawnzhang
出处:http://www.javashuo.com/article/p-husxtogo-gp.html
版权:本文版权归做者转载:欢迎转载,但未经做者赞成,必须保留此段声明;必须在文章中给出原文链接;不然必究法律责任