算法与数据结构(part4)--顺序表
学习笔记,仅供参考,有错必纠
文章目录
- 算法与数据结构–基于python
- 顺序表
- 什么是线性表
- 什么是顺序表
- 顺序表的基本形式
- 顺序表的结构与实现
- 顺序表的结构
- 顺序表的两种基本实现方式
- 扩容策略
- 顺序表的操作
- 插入元素
- 删除元素
- Python中的顺序表
- 列表的基本实现
算法与数据结构–基于python
顺序表
什么是线性表
在程序中,经常需要将一组数据元素作为整体管理和使用,我们需要创建一种元素组,并用变量记录它们。
一组数据中包含的元素个数可能发生变化(增加或删除元素)。
对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示数据之间的某种关系。
这样的一组序列元素的组织形式,我们可以将其抽象为线性表。
一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。
线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础。
什么是顺序表
根据线性表的实际存储方式,分为两种实现模型:
顺序表,将元素有顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
链表,将元素存放在通过链接构造起来的一系列存储块中。
顺序表的基本形式
- 基本存储形式(
L = [1, 2, 3]
)
- 元素外置的顺序表(
L = [1, 2.5, true]
)
顺序表的结构与实现
顺序表的结构
一个顺序表的完整信息包括两部分:
一部分是表中的元素集合;
另一部分是有关表的整体情况的信息,这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项.
顺序表的两种基本实现方式
- 一体式存储,类似于数组,不可变长度
- 分离式存储,类似于列表,可变长度
扩容策略
每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。
每次扩充容量加倍,如每次扩充增加一倍存储空间。
顺序表的操作
插入元素
在顺序表中插入新元素111的三种方式:
解释:
- a: 在顺序表的末尾插入111
- b: 在顺序表中索引为1处存入111,将索引1处原来的元素693放入顺序表末尾
- c: 在顺序表中索引为1处放入111,并将后面的元素向后依次移动1格
复杂度:
- a: O(1)O(1)O(1)
- b: O(1)O(1)O(1)
- c: O(n)O(n)O(n)
删除元素
删除顺序表中元素的三种方式:
解释:
- a:删除顺序表的末尾的元素
- b: 删除顺序表中索引为1处的元素,并将末尾的元素154存放在索引1处
- c: 删除顺序表中索引为1处的元素,并将索引1后的元素向前依次移动1格
复杂度:
- a: O(1)O(1)O(1)
- b: O(1)O(1)O(1)
- c: O(n)O(n)O(n)
Python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的性质;
tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似;
列表的基本实现
Python标准类型list就是一种元素个数可变的线性表,可以添加和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:
基于下标(位置)的高效元素访问和更新,时间复杂度为O(1)O(1)O(1),为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。
允许任意加入元素,而且在不断加入元素的过程中,表对象(
id()
方法得到的值)不变,为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。
在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x)或list.insert(len(list), x),即尾部插入,比在指定位置插入元素效率高。
在Python的官方实现中,list实现采用了如下的策略:
在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区。
在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。
但如果此时的表已经很大(目前的阈值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。
算法与数据结构(part4)--顺序表相关推荐
- 【数据结构】顺序表的应用(4)(C语言)
[数据结构]顺序表的应用(1)(C语言) [数据结构]顺序表的应用(2)(C语言) [数据结构]顺序表的应用(3)(C语言) 设计一个算法,将一个顺序表倒置,即如果顺序表各个节点值存储在一维数组a中, ...
- 【数据结构】顺序表的应用(3)(C语言)
问题: 已知一个顺序表中的各节点值是从大到小有序的,设计一个算法,插入一个值为x的节点,使顺序表中的节点仍然是从小到大有序的. 头文件与该头文件一样:[数据结构]顺序表的实现(C语言) #includ ...
- 【数据结构】顺序表的应用(2)(C语言)
问题: 2.有顺序表A和B,其元素均按从小到大的升序排列,编写一个算法,将它们合并成一个顺序表C,要求C的元素也按从小到大的升序排列. 头文件与该头文件一样:[数据结构]顺序表的实现(C语言) #in ...
- 数据结构25 ————顺序表查找
数据结构25 ----顺序表查找 一. 目录 文章目录 数据结构25 ----顺序表查找 一. 目录 二. 顺序表查找 三. 顺序表查找代码 1.基本算法 2.进行优化 四. 参考资料 二. 顺序表查 ...
- 【数据结构】顺序表的应用(1)(C语言)
问题: 1.将顺序表(a1,a2,-,an)重新排列以a1为界的两部分:a1前面的值均比a1小,a1后面的值均比a1大(这里假设数据元素的类型具有可比性,不妨设为整型). 头文件与该头文件一样:[数据 ...
- 数据结构 创建顺序表
3.18数据结构--创建顺序表 运行结果截图: #define _CRT_SECURE_NO_WARNINGS #define MAXSIZE 100 #include<stdio.h> ...
- 数据结构之顺序表的删除、查找、遍历
一.引言 本篇文章作为顺序表新的篇章延续上一篇文章(数据结构之顺序表构造.插入.扩容操作)的内容. 二.顺序表的删除.查找.遍历操作 注:代码实现均为C语言 1.顺序表的删除(erase)操作 当我们 ...
- 数据结构_顺序表SeqList(C++
数据结构_SeqList顺序表(C++实现 文章目录 数据结构_SeqList顺序表(C++实现 前言&注意事项 顺序表实现方法 总结 结束 前言&注意事项 有些函数没有修改成员数据的 ...
- Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...
最新文章
- IHttpModule
- Asp.net+Jquery实现用户信息异步验证
- 重启中的武汉:烟火气息回来了,消费疯狂增长
- 黑马程序员—————— 随机访问流
- python keyboard库_python库 pywinio虚拟键盘使用
- Linux的重定向与管道
- p2p - cdn传输技术杂谈
- Postgresql源码(33)Btree索引读——整体流程_bt_first
- 商贸宝显示连接不到服务器,登录T1商贸宝就提示 服务器链接失败 请重新登录 这个怎么解决?...
- 浏览器 本地html 图片不显示图片,网页图片显示不出来几种常见的解决方案
- python爬虫语句_Python爬虫练手之爬句子迷
- android svg 线条动画教程,【Web动画】SVG 实现复杂线条动画
- pyqt创建透明窗体
- 会议OA之我的会议(排座送审)
- python输入一个浮点数、输出其整数部分和小数部分_输入一个浮点数,并输出该数的整数部分和小数部分...
- 程序员笔试题收集汇总(三)
- 实习僧网站字体反爬破解思路及步骤分享
- 一般各类模具开模周期
- 程序员中前10%,我认识的这些老司机是怎么突破年薪百万
- 腾讯投的柠萌影视上市破发:公司市值97亿港元 曾创作《三十而已》
热门文章
- ubuntu16.04字体安装
- graphicsmagick im4java,GraphicsMagick+im4java 图片处理
- 【机器学习】线性回归之梯度下降、多元线性回归概述
- 计算机主板硬件术语,电脑硬件扫盲帖---主板术语详解
- 如何切换 SVN 用户名
- ArcEngine10.0三维开发
- Thread.currentThread().getContextClassLoader().getResourceAsStream()读取配置文件
- 别放任这些小毛病不管!它会扩大还会造成重大危险
- 《51单片机应用开发范例大全(第3版)》——第1章 单片机C语言开发基础
- 现代程序设计 学生情况调查