线性表

1:
数据结构与算法
线性表

2:
报告人:XXX
线性表
目标
链表
本章目标

  1. 掌握线性表及其基本操作

  2. 掌握线性表的顺序存储及其实现

  3. 掌握线性表的链式存储及其实现

4.了解时间复杂度

3:
01
第一节绪论
The first chapter
数据结构与算法

4:
报告人:XXX
1 绪论
1.1 为什么要学习数据结构
目标
绪论
线性表
在计算机的世界里,数据结构无处不在
操作系统
文件压缩
寻路算法

5:
报告人:XXX
1 绪论
1.2 课程设置
目标
绪论
线性表
数组
线性表
顺序表
链表

二叉树
avl树

排序
查找

6:
报告人:XXX
1 绪论
1.3 什么是数据结构
目标
绪论
线性表
Algorithm + Data Structures = Programs
( 算 法 + 数 据 结 构 = 程 序 )
数据结构:

算 法:

程 序:
问题的数学模型,它反映数据及其之间关系。
(存储结构和逻辑结构)
处理问题的策略
(是对数据运算的描述,是程序的逻辑抽象)

为计算机处理问题而编制的一组指令集

7:
1 绪论
1.3 什么是数据结构
目标
绪论
线性表
数据结构(Data Structure) :
是相互之间存在一种或多种关系的数据元素的集合

逻辑结构
存储结构
数据操作
线性结构
(1:1的关系)
树形结构
(1:n的关系)
图状结构
(m:n的关系)
集合结构
(松散关系)

顺序存储
链式存储
索引存储
散列存储

非线性结构
:创建、销毁、插入、删除、修改等

8:
第二节线性表

The second chapter
内容展示
02

9:
2 线性表
2.1 线性表概述
目标
线性表
绪论
2.2.1 线性表基本概念
所谓的线性表,就是将数据排成像一条长线一样的结构,数组,链表,栈,队列都 是线性表结构,线性表上的数据最多只有前后两个方向,下面以一幅图的形式来展现一下线性表结构
线性表:数据排成一条线一样的结构,注意此处我们并没有说是数据连续,线是直线等字眼

10:
2 线性表
2.1 线性表概述
目标
线性表
绪论
2.2.1 线性表基本概念
与这种线性结构对应的就是非线性结构,比如后续要学习的树,堆,图等,在这些非线性数据结构中,数据之间并不是简单的前后关系,如下图:
非线性数据结构:树、图等

11:
报告人:XXX
2 线性表
2.1 线性表概述
目标
线性表
绪论

  1. 它由n个同类型的元素组成;
  2. 每个元素除第一个元素和最后一个元素之外,有且仅有一个前驱和一个后继;
  3. 其长度可以动态的增长或减少
  4. 可以对线性表中任何数据元素进行访问
  5. 数据元素的插入和删除操作可以在线性表中的任何位置进行
  6. 可以求线性表中指定元素的前驱和后继。
    线性表的特点

12:
报告人:XXX
2 线性表
2.2 线性表的基本操作
目标
线性表
绪论

  1. 线性表的置空操作:clear()
  2. 线性表判空操作:isEmpty()
  3. 求线性表元素的个数:length()、getSize()
  4. 求线性表的容量:getCapacity()
  5. 取元素操作:get(i)
  6. 插入操作:insert(i,x)
  7. 删除操作:remove(i)
  8. 查找操作:indexOf(i)
  9. 输出操作:toString()

13:
报告人:XXX
2 线性表
2.1 线性表概述
目标
线性表
绪论
顺序存储结构
链式存储结构
顺序存储结构表示的线性表称为顺序表

链式存储结构表示的线性表称为链表,链表又分为单链表、双向链表、循环链表。
线性表存储结构

14:
报告人:XXX
2 线性表
2.3 线性表-顺序存储结构
目标
线性表
绪论
2.3.1 数组复习
1 数组的定义方式
2 数组的赋值方式
3 数组的遍历方式
4 修改数组中的值

15:
报告人:XXX
2 线性表
2.3 线性表-线性存储结构
目标
线性表
绪论
线性表的线性存储结构:物理空间上采用连续的区域存储

16:
报告人:XXX
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
什么是时间复杂度?
抛开算法运行的软硬件环境,只考虑算法与问题规模之间的关系。

算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。

算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。

17:
报告人:XXX
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
一般使用O 表示时间复杂度,O(1)、O(n)、O(n2)、O(n3)、O(log2n)
public static int sum(int[] nums){
int sum = 0;
for(int num:nums) sum+=num;
return sum;
}
O(n)

n是nums中元素的个数

算法和n呈线性关系

为什么要用大O,叫做O(n)? 忽略常数。实际时间T = c1*n+c2

18:
报告人:XXX
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
为什么要用大O,叫做O(n)? 忽略常数。实际时间T = c1n+c2
T = 2
n + 2 O(n)
T = 2000n + 10000 O(n)
T = 1
nn + 0 O(n^2)
T = 2
nn + 300n + 10 O(N^2)
渐进时间复杂度

描述n趋近于无穷的情况

19:
O(n)

最坏情况 resize() O(n)
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
分析动态数组的时间复杂度
添加操作
addLast(e)
addFirst(e)
add(index,e)
O(1)
O(n)
O(n/2)=O(n)

20:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
分析动态数组的时间复杂度
删除操作
removeLast(e)
removeFirst(e)
remove(index,e)
O(1)
O(n)
O(n/2)=O(n)

O(n)

最坏情况 resize() O(n)

21:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
分析动态数组的时间复杂度
修改操作
set(index,e)
O(1)

22:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
分析动态数组的时间复杂度
查询操作
get(index)
O(1)
contains(e)
O(n)
find(e)
O(n)

23:
报告人:XXX
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
分析动态数组的时间复杂度
增: O(n)

删: O(n)

改: 已知索引 O(1);未知索引O(n)

查: 已知索引 O(1);未知索引O(n)

如果只对最后一个元素操作,依然是O(n)
因为有可能resize()

24:
O(n)

最坏情况 resize() O(n)
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
resize的复杂度分析
添加操作
addLast(e)
addFirst(e)
add(index,e)
O(1)
O(n)
O(n/2)=O(n)

25:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
resize的复杂度分析

resize O(n)
假设当前capatity=10
1 1 1 1 1 1 1 1 1 1

11次操作,触发resize,总共进行了21次基本操作

26:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
resize的复杂度分析-均摊时间复杂度

11次操作,触发resize,总共进行了21次基本操作

平均,每次addList操作,进行2次基本操作
假设capacity = n,n+1次addLast,触发resize,总共进行2n+1次基本操作
addLast的均摊复杂度为O(1)
removeLast的均摊复杂度为O(1)

27:
报告人:XXX
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
复杂度震荡capacity = n

但是,当我们同时看addLast和removeLast操作:

capacity = n

addLast
O(n)
removeLast
O(n)
addLast
O(n)
removeLast
O(n)

28:
2 线性表
2.3 线性表-时间复杂度分析
目标
线性表
绪论
复杂度震荡
出现问题的原因:removeLast时resize过于着急
解决方案:lazy

当size==capacity/4时,才将capacity减半

29:
报告人:XXX
2 线性表
2.3 线性表-链式存储结构
目标
线性表
绪论
线性表的链式存储结构:物理空间上可以不采用连续的区域存储,通过指针的指向,连接前后元素。

30:
Thank You!
力学笃行 志存高远