0(1) < O(logn) < O(n) < O(nlogn) < 0(n2) < 0(n3) < 0(2" ) < O(n!) < O(n")
推导大O 阶方法
推导大O 阶:
1.用常数1 取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1 ,则去除与这个项相乘的常数。
得到的结果就是大O 阶。
线性表:零个或多个数据元素的有限序列
顺序存储结构:
在任意时刻,线性表的长度应该小于等于数组的长度。
线性表 顺序存储结构 的优缺点 ---例如:数组
优:
可以根据序号查找
无需更多空间来表示元素之间的关系
缺:
插入删除慢
长度变化比较多时,无法确定存储空间大小
链式存储结构:
每个单元叫一个结点
结点包括两部分,一个叫数据域,一个叫指针域
数据域存储数据元素信息 指针域存储直接后继的位置(内存地址)
n个结点为连接为一个链表
每个结点只有一个指针域 称为单链表
链表的第一个结点的存储位置叫头指针
最后一个结点指针为null(^)
单链表的第一个结点叫头结点,这不是必须的
头结点的建立是为了使第一个结点前的插入和删除与其他位置操作一致
它的数据域可以不存储信息 也可以存储长度等数据
它的指针域指向第一个结点的指针
单链表读取第i个元素
计数器j,从头开始找,每找一个j++,工作指针后移,找到第i个元素为止
单链表插入结点s
s->next=p->next p->next=s;
注:两句不能交换
优点:插入/删除结点比较频繁时效率高
(不知道第i个位置的地址时,插入/删除一个结点时和顺序结构效率一致,因为要遍历链表找到第i个位置)
链表整体删除
不能直接循环然后free(p),这样的话free之后就找不到下一个节点了,要创建一个q先把下一个结点放进去,free(p),再把q放回p,循环
静态链表
我们让数组的元素都是由两个数据域组成, data和cur。也就是说,数组的每
个下标都对应一个data和一个cur 数据域data ,用来存放数据元素, 也就是通常我
们要处理的数据;而游标cur 相当于单链表中的next 指针,存放该元素的后继在数组
中的下标。
我们把这种用数组描述的链表叫做静态链表,这种描述方法还有起名叫做游标实
现法。
其实是为了给没有指针的高级语言设计的一种实现单链表能力的方法
优点:
在插入和删除操作时,只需要修改游标,不需要移动元素
循环链表
将单链表最后一个结点的指针指向头结点
循环链表解决了一个很麻烦的问题:如何从当中一个结点出发,访问到链表的全部结点
双向链表
增加一个指针域 存放指向上一个结点的指针
注意:插入和删除时需要改两个指针
栈又称为后进先出( Last In Filrst Out) 的线性表,简称LlFO 结构。
栈顶可以进行插入删除,栈底不可以
对于栈来说,如果是两个相同数据类型的栈,则可以用数组的两端作栈底的方法
来让两个栈共享数据,这就可以最大化地利用数组的空间。
中缀表达式转后缀表达式
规则:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出, 并将当前符号进栈,一直
到最终输出后缀表达式为止。
队列是一种先进先出( First 10 First Out) 的线性表,简称FIFO 。
允许插入的一端称为队尾,允许删除的一端称为队头。
队列顺序存储
缺陷: 假溢出;
解决:循环队列
在可以确定队列长度最大值的情况下,建议用循环队列,如果你无法预估队列的长度时,则用链队列。