数据结构可分为四类:集合、线性结构、树形结构、图形结构
线性结构举例:数组、链表、队列、栈
树形结构举例:二叉树、平衡树、排序树等
图形结构举例:有向图、无向图等
链表:可以用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且除了存储每个数据元素 外,还必须存储指示其直接后继元素的信息。
链表分为单链表,双链表
操作有插入、删除。
时间复杂度为O(n)
python中没有指针的概念,python中没有数组的数据结构,我们常用列表来表示有序数组。
栈
栈最显著的特征是LIFO (Last In, First Out, 后进先出)。(像有底的箱子)
操作
1.pop取出栈中最上层元素(8),栈的最上层元素变为早先进入的元素(9)。
2.push将一个新的元素(5)放在栈的最上层。
3.top查看栈的最上层元素(8)。
队列
队列像日常排队买东西的人的队列,先排队的先买,后排队的人后买,是FIFO,(先进先出)
压栈和弹栈的时间复杂度都是O(1)
哈希表
https://python123.io/index/topics/data_structure/hash_table
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
树是一种简单的非线性结构。树型结构的特点:
1.每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。
2.每一个结点可以有多个后件结点,称为该结点的子结点。没有后件的结点称为叶子结点
3.一个结点所拥有的后件个数称为树的结点度
4.树的最大层次称为树的深度。
二叉树的定义及其基本性质
https://blog.csdn.net/u012428012/article/details/79089915
1.二叉树是另一种树型结构,它的特点是每个结点至多只有二棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
具有n 个结点的二叉树,其深度至少为
2.满二叉树:一棵深度为k且有 个结点的二叉树称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。(每个节点都有左子树和右子树)
3.完全二叉树:除最后一层以外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。具有N个结点的完全二叉树的深度为
4.平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
5.二叉树的存储结构
二叉树通常采用链式存储结构
二叉树的遍历:
1.前序遍历DLR 首先访问根结点,然后遍历左子树,最后遍历右子树。
2.中序遍历LDR 首先遍历左子树,然后根结点,最后右子树
3.后序遍历LRD 首先遍历左子树,然后遍历右子树,最后访问根结点。
排序:
冒泡排序:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换其位置,进行一轮比较和换位后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。
例如:
初始状态:【36,25,48,12,25,65,43,57】
1次排序:【25,36,12,25,48,43,57,65】
2次排序:【25,12,25,36,43,48】 57 65
3次排序:【12,25,25,36,43】48 57 65
4次排序:【12,25,25,36】43 48 57 65
5次排序:【12,25,25】36 43 48 57 65
6次排序:【12,25】25,36,43 48 57 65
7次排序:【12】25,25,36,43 48 57 65
def bubble_sort(lists) for i in range(len(list)-1): for j in range(len(lists)-i-1): if lists[j]>lists[j+1]: lists[j], lists[j+1]=lists[j+1], lists[j] return lists if __name__=='__main__': lists==[3,4,2,8,9,5,1] print('排序前序列为:') for i in lists: print(i) print('排序后结果为:') for i in (bubble_sort(lists)): print(i)
算法复杂度:最好的情况下的时间复杂度为O(n),最坏情况下的复杂度为 ,平均情况下的时间复杂度为
,空间复杂度为O(1).
归并排序:
归并排序是利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列。
算法复杂度:最好最坏平均情况的时间复杂度为 ,空间复杂度为O(1).
快速排序:
快速排序是一种非常高效的排序算法,它采用“分而治之”的思想,把大的拆分为小的,小的再拆分为更小的。其原理是:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前部分的所有记录均比后部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。
算法复杂度:最好的情况下的时间复杂度为,最坏情况下的复杂度为
,平均情况下的时间复杂度为
,空间复杂度为O(logn).