【数据结构】线性结构:存储&运算&时间复杂度

来源:互联网 发布:爽肤水作用 知乎 编辑:程序博客网 时间:2024/06/04 19:24


逻辑结构:表内元素的关系,共有集合、线性结构(线性表、栈、队列、数组)、树形结构(树、二叉树、森林)、图结构(图)四种;

存储结构:是数据在计算机中的实现,也叫物理结构,常用的是顺序存储和链式存储。


顺序存储指的是所有存储结点放在一个连续的存储区中;

链式存储指的是存储结点不一定存放在一个连续的存储区,结点间的逻辑关系靠结点中的指针来确定。


线性表的顺序存储,我们称之为顺序表。


顺序表的所有数据都存储在一个连续的存储区,当执行插入、删除等操作的时候,一个结点有变化就会影响后面的所有结点。

计算算法的时间复杂度,一个重要的指标是数据元素的比较和移动的次数。


顺序表的读表元素求表长算法,只运行一次就能出结果,时间复杂度为O(1)。

顺序表的定位算法:1、遍历表中数据,查找所求值;2、找到则返回结点需要的最小值;3、找不到则返回0。

要遍历表,时间复杂度与表长有关,时间复杂度为O(n)。

顺序表的插入算法:1、确定插入结点位置(定位);2、将该结点及后面所有位置的结点后移;3、将插入结点放入空出来的位置;4、表长增加。

最好的情况下是插入到表尾,没有数据移动,最坏的情况下是插入到表头,所有均数据移动。平均下来(0+n)/2,插入算法的时间复杂度是O(n)。

顺序表的删除算法:1、确定原被删除结点位置;2、将其后的结点左移,覆盖被删除结点;2、表长减少。

情况插入步骤相同,其时间复杂度为O(n)。


线性表也可以使用链式存储,根据指针的指向,线性表的链式存储划分成单链表、循环链表、双向循环链表三类。


单链表指针方向是唯一的,直接前驱指向该结点,该结点再指向直接后继;

循环链表就是单链表的最后一个结点的指针指向第一个结点,形成环结构;

双向循环链表在循环链表的基础上,每个结点再添加一个指针,这类指针均用于指向直接前驱(每个结点含两个指针)。


单链表任何相邻的结点都通过一个指针(相当于火车的车钩)相连,因此要想获取后一个结点必须遍历前面所有的结点。


单链表的初始化算法:1、创建头结点;2、指针域为NULL;3、用一个LinkList类型变量指向新创建的结点。

单链表的求表长算法:1、带计数器的工作指针p,指向头结点;2、工作指针移动一个结点,计算器加1;3、p=p→next时计算器的值。

单链表的读表元素算法:1、遍历该元素前面所有结点,2、读操作。时间复杂度为O(n)。

单链表的定位算法:1、从头至尾访问结点;2、返回序号。时间复杂度为O(n)。

单链表的插入运算:1、找到前一个结点(定位);2、生成目标结点;3、目标结点链接后继结点;4、目标结点链接前驱结点。时间复杂度为O(n)。

单链表的删除运算:1、找到待删结点的直接前驱(定位);2、删除待删结点;3、待删结点的直接前驱指向直接后继。时间复杂度为O(n)


单链表的建表过程:1、建含头结点的空表(初始化);2、建立新结点,将新结点链接头结点;3、复建立新结点,将新结点链接到表尾……

实现单链表建表过程有三种方法:

方法一(插入算法):新增结点插入到表尾,新增插入都会遍历表。

整个建表过程的计算量为[n(n-1)]/2,时间复杂度是O(2^2);

方法二(尾插):设置指针指向尾结点,新增结点插入到尾结点即可,形成链表数据顺序与输入顺序相反。

整个建表过程,时间与元素个数成正比,时间复杂度是O(n);

方法三(前插):新增结点插入到表头,每次插入到第一个数据结点之前,形成链表数据顺序与输入数据顺序相同。其时间复杂度也是O(n)。


顺序表与单链表时间复杂度的比较:

按位置查找,顺序表执行一次操作即可O(1),单链表要遍历到该位置才能找到,O(n);

定位算法,均需要遍历全表才能返回最小的序号,时间复杂度均为O(n)。

插入算法,顺序表,先定位O(1),新增结点后的右移,时间复杂度为O(n);单链表,先定位O(n),其他结点不移动,时间复杂度也为O(n)。

删除算法与插入算法相同。

0 0
原创粉丝点击