一、常用的数据结构
数据结构:相互之间存在一种,或者多种特定关系的数据元素的集合
数据:能够输入计算机中,由计算机处理的元素
结构:数据之间的关系
例如:点状,线性,星形,树形
1. 数组
连续存储的数据结构,通过起始数组和偏移量来对其中每一个元素进行访问
优势:随机访问性好,占用空间较小
时间复杂度:O(1)
线性存储:每个元素都有一个前驱元素和后续元素,连续存储
插入和删除耗费资源
2. 链表
也是线性存储的数据结构,但和数组不同的是不连续的数据结构
链表中的每一个点称为节点,每个节点都包含两个部分
数据域:元素
指针域:下一个元素的地址
随机访问差,占用空间大
插入和删除效率好,只需要修改指针
单向链表和双向链表(有三个区域,中间是数据域,前驱元素地址,后续元素地址)
3. 堆栈
受限的线性表:只能从栈顶添加、删除元素
栈顶,栈底
先进后出。栈顶元素先出 LIFO last in first out
应用场合:函数调用,异常的传播和抛出
4. 队列
受限的线性表:只能从队头删除,从队尾添加
先进先出。队头元素先出 FIFO first in first out
双端队列:同时实现队列和堆栈的特性
5. 树
树是由节点集和连接每对节点的有向边集组成
根、父节点,子节点、叶子节点
二叉树:任何一个节点的孩子数不超过两个,最多只有两个子节点
满二叉树: 所有的节点都有两个子节点(除叶子节点以外)
完全二叉树:编号跟满二叉树一致
二叉树的遍历:(从上到下,从左到右)
先序:根,左,右
中序:左,根,右
后序:左,右,根
6. 哈希表
通过哈希函数(映射关系),将无限的数据映射到有限的地址集
Python字典使用的是哈希存储
二、算法的衡量标准
1. 时间复杂度:
以最坏时间复杂度为准
常用的时间复杂度
O(1)< O(logn)<O(n)<O(nlogn)<O(n^2)
2. 空间复杂度
以空间换时间的方式。
三、查找
1. 顺序查找:从头到尾
2. 折半查找:每次查找中心点,通过判断大小,来进行重新获取start和end
注意:只适合排好序的列表
四、排序
1. 冒泡排序
掌握
俩俩元素比较,I i+1
外循环的界限:n-1
内循环的界限:n-1-i
时间复杂度:最好O(n) O(n^2)
稳定:稳定
2. 选择排序
每次选择最大或者最小元素,放到前面,排序
时间复杂:O(n^2)
稳定性:不稳定
3. 插入排序
从第二个元素开始,插入先有排好队的队伍中,保证每个元素插入之后还是有序的
时间复杂度:最好O(n) O(n^2)
稳定性:稳定
4. 希尔排序
插入排序的升级,加入了增量,来分组
时间复杂度:不定
稳定性:不稳定
5. 快速排序
递归的执行查找中心点,将比中心点小的元素放左侧,比中心点大的放右侧
时间复杂度O(nlogn)
稳定性:不稳定
6. 归并排序
分久必合合久必分:将两个有序的数据集合合并成一个有序的数据集
时间复杂度:O(logn)
稳定性:稳定