IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 什么是线性表 -> 正文阅读

[数据结构与算法]什么是线性表

1 什么是线性表

首先,我们从名字就可以看出来,他是一个拥有着和线一样性质的表,那具体又是什么意思呢,就相当于你有一堆零零散散的小珠子,这个时候,你拿一根线把这些小珠子穿起来,那么他们就变成一条珠子,这个时候他就相当于一根线对吧,里面的小珠子都是有序排列的,那么线性表是什么呢?线性表,全名为线性存储结构。使用线性表存储数据的方式,可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。我们上面的例子中小珠子就是数据,物理空间就相当于我们放我们做好的小珠子链的地方。
线性表就是 n(n ≥ 0) 个具有相同性质的数据元素的有限序列,其中当n=0的时候,那我们的线性表就是一个空表,是一个最常见的线性结构(线性结构就是一个有序元素的集合),队列,栈,串和数组都是线性结构。

对于非空的线性表或者线性结构的特点:

(1)线性表中第一个元素称为表头元素,有且只有一个。

(2)线性表中最后一个元素称为表尾元素,有且只有一个。

(3)除表头元素外,结构中的每个数据元素有且只有一个直接前驱;

(4)除表尾元素外,结构中的每个数据元素有且只有一个直接后继;

2 线性表的实现方式

线性表有两种实现方式:

  • 顺序存储结构,简称顺序表
  • 链式存储结构,简称链表
    线性表
    链表

3 基本方法和他的时间复杂度

这个地方,我就不写具体的代码了,就写一些概念性的东西了。

时间复杂度如何计算

对于时间复杂度一般来说我们是很难去准确计算的,所以说我们对于时间复杂度我们是抽象的来计算的,对于时间复杂度的表示我们一般是O(),又称大O表示法
设解决一个问题的规模为n,基本操作被重复执行次数是n的一个函数f(n),则时间复杂度可记作: T(n)=O(f(n)) 。它表示随着问题规模n的增长,算法执行时的增长率和f(n)的增长率相同。其中T(n)叫算法的渐进时间复杂度,简称时间复杂度。算法的时间复杂度考虑的只是对于问题规模n的增长率,则在难以精确计算的情况下,只需考虑它关于n的增长率或阶即可。也就是说时间复杂度只与我们的操作重复次数有关,与其他无关。

执行的操作举列描述时间复杂度
1+2常数阶O(1)
2n+3线性阶O(N)
3n2+10n对数阶O(N2)
5n3+2n2+3立方阶O(N3)
6log8n对数阶O(logN)
3nlog2n+19nlogn阶O(nlogN)
6^n指数阶O(2^N)

从上面我们可以看出,时间复杂度只与最大的一个操作次数有关,和其他附加的操作是无关的。
时间复杂度从高到低为:

O(1)<O(logn)<O(n)<O(nlogn)<O(n2 )<O(n3)<O( n^ K)<O(2^n)<O(n!)

读取数据

  • 线性表读取数据:时间复杂度为O(1),因为线性表的数据存储他的物理地址是连续的,而且存储的数据结构又是已知的,当我们读取第n个数据时,我们可以直接计算出来他的物理地址,直接找到对应的数据,所以时间复杂度是O(1)。
  • 链表读取数据:时间复杂度为O(n),我们知道链表的物理地址是不连续的,所以说我们是不能直接找到对应数据的物理地址的,所以说我们需要从第一个数据开始一个一个往后面找,要执行n次,所以我们的时间复杂度是O(n)。

插入数据

  • 线性表插入数据:这个时候我们就要分情况讨论了
    • 线性表末尾添加数据 :O(1),我们直接在线性表尾部添加即可,无需任何操作,所以是最小的时间复杂度,就是常数阶O(1)。
    • 在线性表中间添加数据:O(n),我们在线性表中间插入数据时,虽然我们可以快速定位到我们要插入位置的数据,但是我们在该位置插入一个数据时,该位置的后面的数据需要全部往后移动一位,要移除一个空间出来,假设我们插入位置为n,线性表的大小为100,这个操作就是要执行(100-n)次,所以他的时间复杂度是O(n)。
  • 链表插入数据:这个时候我们就要分情况讨论了
    • 链表在已知位置添加数据 :O(1),先给一个节点的数据域赋值,然后让旧链表的最后一个节点的指针域指向新创建的节点,让他们形成一个新的链表,这个操作的步骤是固定的两部,所以他的时间复杂度是O(1)。
    • 链表在中间位置添加数据:O(n),这个时候时间复杂度为什么还是O(n)呢,明明他插入数据只需要两个步骤呀,改变一下指针域的指向就好了,就算是新插入的那个数据的指针域也要指向原先断开的地方,那也只要三步呀,是的没错,这个步骤的时间复杂度是O(1),但是他插入数据的时候要找到对应的数据的位置呀,找到对应数据位置的时间复杂度是O(n)呀,所以时间复杂度是O(n)。

也就是说,链表的插入数据这个操作的时间复杂度是O(1),但是我们在进行这个操作前一般是要进行遍历的,加上遍历的操作时间复杂度就是O(n)了,但是我们还是一般认为链表插入的时间复杂度是O(1)

删除数据

和上面的插入数据的描述是一样的,也要分成两个情况,线性表的依然分为两个情况,尾部 O(1 )和中间 O(n),链表的删除操作也是的,如果看总体的过程的话,就是O(n),只看删除操作就是 O(1),删除操作 就是找到对应的节点和他的前驱节点,让他的前驱节点的指针域指向自己当前节点的后面哪一个,这样就把我们这个节点删除了。

遍历数据

遍历数据的时间复杂度都是O(n)。

小结

写的不是很好,因为这个是写给我的好兄弟看的,他不太清除线性表时间复杂度的概念,所以我在这里就写了 这个,其他的代码都没写,当然如果我的好兄弟需要的话,我会继续写上去的,当然如果你们看到了感觉不太行少内容了,我也会继续加的,上面的分析只是很简单的分析了一下,应该还有双向链表的呀,还有方法的参数。但是总而言之,就是遍历复杂度O(n),删除插入复杂度O(1),如果看总体的话,就要加起来了,就是O(n),当然如果你写的方法不需要遍历就可以得到数据的话那就另说了。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:10:50  更:2021-09-01 12:12:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:29:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码