线性表:有限序列,除了第一个表项和最后一个表项之外,都有一个唯一的前驱和后继,第一个表项只有后继,最后一个表项只有前驱
顺序表:把线性表中所有的表项按照其逻辑顺序一致存储到一块(物理顺序)连续的存储空间中,即各个表项的逻辑顺序与其存放的物离顺序一致,对于顺序表中的所有表项,既可以顺序访问也可以随机访问
可用三元组<row,column,value>三元组来表示
广义表:递归定义的表结构,允许表中有表,称其第一个元素为表头,之后的为表尾,表长定义为最外层表的元素个数
表中只有一个元素的时候,这个元素是表头,表尾为空集
栈有两种存储表示:基于数组的顺序栈和基于链表的链式栈
顺序栈的栈顶未知由数组下标指针表示,栈非空时,下标为0的是栈最底部的元素,栈顶下标非负;栈为空时,栈顶下标为-1
链式栈的栈顶在链表的表头(表头一般不存储元素),新节点的插入和栈顶节点的删除都在链表的表头即栈顶进行
队列是一种先进先出(FIFO)的线性数据结构,只允许从队尾入队,队首出队
循环队列采用数组下标表示队首和队尾,队首为队首元素所在位置的下标,队尾为队尾元素的下一块存储空间的下标
对于存储在数组中的队列,为了充分利用出队后的剩余的存储空间,采用循环队列
出队时:front=(front+1)%maxSize
入队时:rear=(rear+1)%maxSize
注意maxSize为数组容量,下标为0,...,m的数组,大小为m+1,这个数组作为循环队列最多能存储m个元素,剩下一个单位的存储空间用做判断队列是否已满,下标为rear
队列的队头指针指向链表的第一个节点,队尾指针指向单链表的最后一个节点
散列是一种通过hash函数将值映射到键的线性数据结构
设地址数为m,p为不大于m的最大的质数,散列函数定义为
各个位置上符号出现次数的方差,方差小的位被选取用作确定hash地址
其中k是第k位,num_i是可能出现的符号的个数,n/r是出现个数的期望
将值(或者值的内码)按照hash地址的位数折叠相加并去掉多出的高位得到hash地址
插入:从i=0开始,i<m-1,若发生冲突则检查下一个地址,若对于i=0,...,m-1都有冲突,则插入失败
搜索:从i=0开始,i<m-1,若该地址非空且不为目标值,则检查下一个地址;若为空,返回搜索失败;若检测到目标值,返回搜索成功
删除:从i=0开始,i<m-1,若该地址非空且不为目标值,则检查下一个地址,若为空,返回删除失败;若检测到目标值,在另一个hash表中将此元素标记为删除,但仅仅是逻辑删除
当表长为质数且装载因子不超过0.5时,新表项一定能够插入,且任何一个位置不会被探查两次
将相同hash值的元素按照用链表存储到同一个hash地址
装填因子α=表中已有的最大记录数/表中预设的最大记录数