1.线性表
Posted hornets
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.线性表相关的知识,希望对你有一定的参考价值。
一.时间复杂度
- 去掉运行时间中的所有加法常数。(例如 n2+n+1,直接变为 n2+n)
- 只保留最高项。(n2+n 变成 n2)
- 如果最高项存在但是系数不是1,去掉系数。(n2 系数为 1)
时间复杂度排序:
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n2)平方阶 < O(n3)(立方阶) < O(2n) (指数阶)
特性:拿时间换空间,用空间换时间
二.数据的逻辑结构和物理结构
数据的存储方式可分为线性表、树和图三种存储结构
物理结构就是集中存放或者散装;
集中存放便于遍历。
分散存放便于增加或者删除操作。
三.线性表
把所有数据用一根线儿串起来,再存储到物理空间中, 一对一关系
线性表分为以下两种
????顺序存储结构(顺序表) ? ??????????????????????????链式存储结构(链表)
术语表示:
某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;
四.顺序表
俗称数组
使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:
顺序表申请的存储容量;
顺序表的长度,也就是表中存储数据元素的个数;
插入:
将要插入位置元素以及后续的元素整体向后移动一个位置;
将元素放到腾出来的位置上;
??????????????????????????????????????????????????????
删除:
后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。
??????????????????????????????????????????????????????
查找
查找算法,后面章节介绍(..)
修改
找到目标元素
直接修改该元素的值
五.链表
与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。
链表中每个数据的存储都由以下两部分组成:
数据元素本身,其所在的区域称为数据域;
指向直接后继元素的指针,所在的区域称为指针域;
??????????????????????????????????????????????????????
所示的结构在链表中称为节点
头指针:
一个普通的指针,它的特点是永远指向链表第一个节点的位置。
很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;
节点:
链表中的节点又细分为头节点、首元节点和其他节点:
头节点:
其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;首元节点:
由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只
是对链表中第一个存有数据节点的一个称谓,没有实际意义;
其他节点: 链表中其他的节点;
????????????????????????????????????????????
六.顺序表和链表的区别以及优缺点:
顺序表存储数据,需预先申请一整块足够大的存储空间,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙
链表的存储方式与顺序表截然相反,什么时候存储数据,什么时候才申请存储空间,数据之间的逻辑关系依靠每个数据元素携带的指针维持
开辟空间的方式:
顺序表:存储数据实行的是 "一次开辟,永久使用",即存储数据之前先开辟好足够的存储空间,空间一旦开辟后期无法改变大小(使用动态数组的情况除外)。
链表:存储数据时一次只开辟存储一个节点的物理空间,如果后期需要还可以再申请。
因此,若只从开辟空间方式的角度去考虑,当存储数据的个数无法提前确定,又或是物理空间使用紧张以致无法一次性申请到足
够大小的空间时,使用链表更有助于问题的解决
空间利用率
从空间利用率的角度上看,顺序表的空间利用率显然要比链表高
这是因为,链表在存储数据时,每次只申请一个节点的空间,且空间的位置是随机的,
这种申请存储空间的方式会产生很多空间碎片,一定程序上造成了空间浪费。不仅如此,由于链表中每个数据元素都必须携带至
少一个指针,因此,链表对所申请空间的利用率也没有顺序表高。
空间碎片: 指的是某些容量很小(1KB 甚至更小)以致无法得到有效利用的物理空间。
时间复杂度
查找
顺序表中存储的元素可以使用数组下标直接访问,无需遍历整个表,因此使用顺序表
访问元素的时间复杂度为 O(1);而在链表中访问数据元素,需要从表头依次遍历,直到找到指定节点,花费的时间复杂度为 O(n)
插入、删除:
链表中数据元素之间的逻辑关系靠的是节点之间的指针,当需要在链表中某处插入或删除节点时,
只需改变相应节点的指针指向即可,无需大量移动元素,因此链表中插入、删除或移动数据所耗费的时间复杂度为 O(1);而顺序表中,插入、删除和移动数据可能会牵涉到大量元素的整体移动,因此时间复杂度至少为 O(n)
以上是关于1.线性表的主要内容,如果未能解决你的问题,请参考以下文章