程序 = 数据结构+算法
算法:接收有限个输入经过有限个指令处理在有限时间内产生确定的输出(时间和空间复杂度)
数据结构 = 线性结构+非线性结构
线性结构:数组,列表,栈,队列
非线性结构:树,堆,图,散列表hashing
数组:数据是存储在连续空间内,可以通过角标直接访问任意数据。容易访问,增删麻烦要移动其他数据位置。
链表:访问麻烦,增删简单
需要从第一个开始读取,直达目标节点
增加:a和c之间添加b,把a指针修改指向b,b的指向c,即完成b添加
删除:a和c之间删除b,把a指针指向c,即完成删除链表内的b。
单链表(每一个节点包含了数据块和指向下一个节点的指针)
双链表(每一个节点不仅存储指向下一个节点的指针,而且存储指向前一个节点的指针) 循环链表(在链表的尾部有一个指向头结点的指针,头结点也有一个指向尾节点的指针,第一个结点有指向头节点的指针)
栈:后进先出,先进后出,类似堆积木,只能在最上面放(push)和拿(pop),只能访问最上面的数据
队列:类似与排队,一端出(取出元素--删除)一端进(添加元素),先入先出FIFO
非线性结构:
堆:一棵完全二叉树数组,堆中某个节点的值总是不大于或不小于其父节点的值(大头堆--下图,小头堆),注意数组从1开始存,也就0位置是空的。(每层是最多是2的n-1次方个)
树:树是n(n>=0)个结点的有限集
图:有向图【(v,w) != (w,v)】,无向图【(v,w)=(w,v)】
散列表hashing:key输入一个散列函数内得到value
直接地址法:H(Key) = a*Key+b
除留余数法:H(Key) = Key%p
平方取中法