1.线性表

一.时间复杂度

  1. 去掉运行时间中的所有加法常数。(例如 n2+n+1,直接变为 n2+n)
  2. 只保留最高项。(n2+n 变成 n2)
  3. 如果最高项存在但是系数不是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)

猜你喜欢

转载自www.cnblogs.com/hornets/p/12457732.html