#1思维导图
#2重要概念及代码
##1.线性表:数据元素的排列方式是线性的。
###1.线性表分为顺序表和链表,链表又分为单链表、双链表和循环链表。
####1。它们三者的区别:
##### 1、它们都有数据域(data(p))和指针域(next(p)),但是从图中可以看出双链表有两个指针域,一个指向它的前节点,一个指向它的后节点。
#####2、单链表最后一个节点的指针域为空,没有后继节点;循环链表和双链表最后一个节点的指针域指向头节点,下一个结点为头节点,构成循环;
#####3、单链表和循环链表只可向一个方向遍历;双链表和循环链表,首节点和尾节点被连接在一起,可视为“无头无尾”;双链表可以向两个方向移动,灵活度更大。
##2.栈:先进后出,只能在栈顶进行插入和删除的操作。
###1.栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
弹栈:栈的删除操作,也叫做出栈。
###2.栈的应用:表达式求值,内存分配,缓冲处理,迷宫等
##3.队列:先进先出(FIFO)
###1.队列又分为顺序队列和循环队列
###2.生活实例:买车票排队,排头最先买到车票,新来的排的队尾;进车站时,安检行李,先进去的最先出来,后进去的后出来。
##3.串:字符串一旦创建不可再改变。
··· //初始化表 void InitList(SqList *&L) { L=new SqList;//为线性表分配空间 L->length=0; } //销毁线性表 void DestoryList(SqList* &L) { delete L;//释放L指向的内存空间 } //获取元素 bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } //插入元素 bool ListInsert(SqList *&L,int i,ElemType e) { if(i<1||i>L->length) return false; i--; for(int j=L->length;j>i;j--) L->data[j] = L->data[j-1];
#3.时间复杂度的求解##1.定义:一个程序的空间复杂度是指运行完一个程序所需内存的大小。
##2.大O表示法:用O(n)来体现算法时间复杂度的记法。
##3有三种规则:
用常数1取代运行时间中的所有加法常数
只保留最高阶项
去除最高阶的常数
##4.如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
##5.如果算法的执行时间随着问题规模n的增长而增长,则时间复杂度可通过计算得到为O(n)、O(log n)、O(n2)……
##6.常见时间复杂度的比较
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)
##7KMP算法是一个模式匹配算法,他最原始的方法就是从主串进行一个个的进行匹配,然后返回主串中模式串的第一个字母在主串中的位置,依次进行返回就能查出有多少子串。然后对于有些模式串返回时会有一些无必要的比较,所以要用算法进行优化处理,使其算法的时间复杂度由O(n*m)简化为O(n+M);