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)
稳定性:稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值