Python数据结构
作者:互联网
Python数据结构
16.1 数据结构
数据是指能够输入计算机中,由计算机所处理的元素。结构是指数据之间的关系。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。其表现为计算机存储,组织与处理数据的方式。
常用的数据结构有:
- 数组
- 链表
- 堆栈
- 队列
- 树
- 哈希表
说明:堆栈、队列、链表为线性存储结构(线性表),即多个元素的有序序列。堆栈,队列为操作受限的线性表。
16.1.1 数组
数组采用的是连续存储的方式。通过其实地址与偏移量进行访问其中的每个元素。数组具有很好的随机访问特征。
16.1.2 链表
链表存储的数据元素称为结点,在链表中,各个结点是有序的。每个结点分为两个部分:
- 数据域
- 指针域
根据链表指针域的数量,可以将链表分为: - 单向链表
- 双向链表
16.1.3 堆栈
堆栈(简称栈)是一种操作受限的线性表,只能在表头增加或删除元素。我们通常将栈使用竖直的方式来表示,因此,表尾称为“栈顶”,表头称为“栈底”。
栈表现的特征为后进先出。(LIFO——Last In First Out)
16.1.4 队列
队列是一种操作受限的线性表。只能在队尾增加元素,在队头删除元素。
队列表现的特征为先进先出(FIFO)。
当队列的两端都可以增加与删除元素时,这种队列称为双端队列。双端队列可以同时实现队列与堆栈的特征。
16.1.5 树
树是由结点集及连接每对结点的有向边集组成。
如果存在有向边连接A到B,则A为B的父节点(父亲),B为A的子节点(孩子)。没有父节点的结点称为根,没有子节点的结点称为叶子。具有相同父节点的各结点称为兄弟。
从根到某一节点经过的边数称为路径长度。
二叉树是一种树形结构,其特征是任意结点的孩子数不超过两个。一棵二叉树要么为空,要么由根、左子树与右子树组成(左右子树可能为空)。
一棵深度(树的层数)为m,且具有2m-1个结点的二叉树称为满二叉树。
当一棵二叉树的所有结点编号(从上到下,从左到右进行)都与满二叉树一致时,该二叉树称为完全二叉树。
树的遍历可以分为以下三种:
- 先序遍历
- 中序遍历
- 后序遍历
说明:遍历二叉树实际上是将树的非线性结构进行线性化操作。
16.1.6 哈希表
将一组关键字映射到一个有限的地址集上,这种表称为哈希(散列)表。哈希表中,关键字映射到相应的地址需要使用相关的算法,称为哈希函数。关键字映射后所得的存储地址称为哈希(散列)地址。
16.2 算法
16.2.1 算法概述
算法为解决特定问题而给出的一种方案描述。
算法效率的衡量:
- 时间复杂度
- 空间复杂度
16.2.2. 时间复杂度
时间负责度衡量的标准:
- 执行时间
- 执行规模(频度)
- 最好执行次数
- 平均执行次数
- 最坏执行次数
常用的时间复杂度:
O(1) < O(logn) < O(n) < O(nlogn) < O(n ^ 2) < O(n ^ 2 logn) < O(n3)
16.2.3 空间复杂度
空间复杂度为算法所需的存储空间。
16.3 查找
16.3.1 顺序查找
从前到后,顺序进行查找与关键字相符的元素。
时间复杂度:O(n)
16.3.2 折半查找
选择中间的元素,进行比较,每次排除一半的元素。
时间复杂度:O(logn)。
思考:折半查找一定好于顺序查找吗?
16.4 排序
从稳定性上将,排序可以分为两类:
- 稳定排序
- 不稳定排序
16.4.1 冒泡排序
冒泡排序是进行两两比较,每次选出一个最大(小)元素,共执行n – 1次。
时间复杂度:最好:O(n) 平均:O(n2) 最差:O(n2)
稳定性:稳定。
16.4.2 选择排序
每次选择一个最小(大)的元素,放入数组的最前端。共执行n – 1次。
时间复杂度:最好:O(n2) 平均:O(n2) 最差:O(n2)
稳定性:不稳定。
16.4.3 插入排序
从第二个元素开始,插入到现有数组中,每个元素都保证插入之后,数组是有序的。
时间复杂度:最好:O(n) 平均:O(n2) 最差:O(n2)
稳定性:稳定。
从插入排序时间复杂度可知,插入排序适合于基本有序的情况。
16.4.4 希尔排序
希尔排序(也称缩小增量排序),根据一定的增量,将记录分组,然后对每组进行插入排序。
因为在基本有序的情况下,插入排序的时间复杂度可以从O(n2)提升至O(n),故希尔排序是插入排序的一种改进版。
希尔排序的最优增量序列是一个非常复杂的问题,没有固定的选择原则,但通常情况下,应该令增量序列的每次减半,并且增量序列的最后一个值一定是1。
时间复杂度:最好:与间隔相关 平均:与间隔相关 最差:O(n2)
稳定性:不稳定。
16.4.5. 快速排序
从数组中选出一个中心点(pivot),使得中心点左侧的元素都小于(大于)该元素,中心点右侧的元素都大于(小于)该元素。然后针对中心点分割的这两个区间,继续执行递归的快速排序,直到整个数组区间全部有序。
时间复杂度:最好:O(nlogn) 平均:O(nlogn) 最差:O(n2)
稳定性:不稳定。
16.4.6 归并排序
归并排序为将两个有序的数据集合并成一个有序的数据集。
最好:O(nlogn) 平均:O(nlogn) 最差:O(nlogn)
空间复杂度:O(n)
稳定性:稳定
标签:排序,Python,复杂度,元素,链表,16.4,16.1,数据结构 来源: https://blog.csdn.net/PecoHe/article/details/90204531