1、线性表

来源:互联网 发布:java compareto() 编辑:程序博客网 时间:2024/06/08 14:33

线性表:由0个或者多个数据元素组成的有限序列。属于1vs1的关系

强调:

1.首先是序列,元素之间有先后顺序。

2.第一个元素无前驱,最后一个无后继。其它元素都有且一个前驱和后继。

3.线性表是有限的,事实上,无论计算机发展到多强大,它处理的元素都是有限的。


数据类型:指一组性质相同的值的集合以及定义在此集合上的一些操作的总称。

例如:很多编程语言的整形,浮点型,字符型 这些就是数据类型。


为什么开辟数据类型?

内存不是无限大的,可以按照数据类型开辟不同的空间。所以可以按照数据类型适应不同的条件。


抽象:指抽像出事物具有普遍性的本质。抽象是思考问题的方式,隐藏了繁杂的细节内容。

例如:计算机计算1+1=2 我们不用考虑计算机内部进行的操作。

抽象数据类型ADT:实质一个数学模型已经定义在该模型上的一组操作。也就是把数据类型和相关操作进行整合,捆绑在一起。

例如:一个3D游戏中定义一个位置,我们就可以抽象出一个(x,y,z)的坐标


抽象数据类型的格式:

ADT 抽象数据类型名

Data

数据元素之间逻辑关系的定义

Operation

操作 (创建,判断为空,清空,删除,插入,返回第I个位置的元素,返回第i个元素的位置)

endADT


线性表的顺序存储结构用一段地址连续的存储单元依次存储线性表的数据。

物理上讲:就是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素一次放在这块空地中。

特点:如果是顺序,即使没有数据,该位置为了连续,空着位置也不会被占用。

属性:起始位置,最大存储容量,线性表的当前长度。

各种编程语言中的数组即是一种线性表。

地址计算方法:loc(ai)=loc(a1)+(i-1)*c,这个地址的时间性能属于o(1),所以速度最快。


线性表的操作算法

插入算法的思路:从最后一个数组元素开始遍历到需要插入的位置,往后移动一个位置

删除算法:从删除的位置开始遍历到最后,向前移动一个位置。

对比时间复杂度。

如果插入和删除的位置都是在最后一个位置:o(1)

都在第一个位置:o(n),n指长度


存和读数据都是o(1),插入和删除都是o(n),所以线性表适合元素个数比较稳定,不经常插入和删除操作。


优点:可以快速的存储表中任意位置的元素,无需为表中元素之间的逻辑关系而增加额外的存储空间。

缺点:插入和删除需要需要移动大量元素,当线性表长度变化较大时难以 确定存储空间的容量,容易造成存储空间的碎片。



线性表的链式存储结构:

特点:一组在内存中未被占用的任意存储单元。存储数据元素,同时存储它的后继元素的存储地址。

在链式存储结构的存储单元上。我们把存储数据元素信息的域叫做数据域,把存储直接后继位置的与成为指针与。指针域中存储的信息成为指针或链。这两部分组成数据元素称为存储映像,成为结点。

分类:

单链表:头节点数据域无信息但也可以存放链表的长度,头指针冠以链表的名称,是必须存在的



链表的读取:时间复杂度最坏为o(n)

插入:此时要在插入位置的指针做一下改变即可。时间复杂度o(n)

删除:在删除的位置对指针做改变。时间复杂度o(n)

效率对比:从时间复杂度来讲,时间复杂度都是o(n)。效率并没有提升,可是如果插入多条元素,单链表的第一次插入时间复杂度为o(n),以后每一次都是O(1),而顺序存储结构每次都为o(n),很显然,对于插入和删除频繁的操作,单链表的效率就越是明显。


单链表的整体创建:单链表是一个动态生成的过程。从空表的初始状态开始,依次建立。分为头插法和尾插法。


单链表结构与顺序存储结构优缺点:

存储分配方式,时间性能,空间性能三个方面总结。



静态链表:是为了给没有指针的编程语言设计的一种实现单链表功能的方法。


循环链表:将单链表中的终结结点指针由空指针指向头结点,问题就解决了。


判断单链表是否有坏的算法:p,q指针向前走,p一直走,q从头走。只要不相等时,说明存在环。单链表有坏。


双向链表:记单链表的基础上实现相互指针指向。

0 0
原创粉丝点击