数据结构初步学习
数据结构目前学习总结
1.思维导图
2.重要概念的笔记
1. 计算递归算法的时间复杂度时要分情况分步骤进行运算,计算空间复杂度时要计算递归深度
2. 建立链表时头结点留置放空,并且要进行动态内存的创建
3. 头插法建表
void CreateListF(LinkList &L,int n){//头插法建链表,L表示带头结点链表,n表示数据元素个数
int i;
LinkList p;
L=new LNode;
L->next=NULL;
for(i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
4. 尾插法建表
void CreateListR(LinkList &L, int n){//尾插法建链表,L表示带头结点链表,n表示数据元素个数
L=new LNode;
LinkList p,q;
p=new LNode;
p=L;
L->next=NULL;
int i;
for(i=0;i<n;i++){
q=new LNode;
cin>>q->data;
p->next=q;
p=q;;
}p->next=NULL;
}
5. 链表的插入
q->data=e;
q->next=p->next;
p->next=q;
6. 链表的删除
q=p->next;
p->next=q->next;
delete q;
7. 栈为先进后出,队列为先进先出,下面内容为STL--stack/queue的使用方法
stack模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。
定义stack对象的示例代码如下:
stack<int> s1;
stack<string> s2;
stack的基本操作有:
入栈,如例:s1.push(x);
出栈,如例:s1.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s1.top()
判断栈空,如例:s1.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s1.size()
queue模板类的定义在<queue>头文件中。
与stack模板类很相似,queue模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型。
定义queue对象的示例代码如下:
queue<int> q1;
queue<double> q2;
queue的基本操作有:
入队,如例:q1.push(x); 将x接到队列的末端。
出队,如例:q1.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q1.front(),即最早被压入队列的元素。
访问队尾元素,如例:q1.back(),即最后被压入队列的元素。
判断队列空,如例:q1.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q1.size()
8. 使用顺序队时需留有一个位置为空,方便区分判断队空还是队满
顺序队出队后头指针操作为front=(front+1)%maxsize
顺序队入队后尾指针操作为rear=(rear+1)%maxsize
9. 串的KMP匹配模式的next[j]代码
i=1,next[1]=0;j=0
while(i<T[0]){
if(j==0||T[i]==T[j])
{++i,++j,next[i]=j;}
else j=next[j];
}
10. 串的KMP匹配模式的nextval[j]代码
i=1,nextval[1]=0;j=0
while(i<T[0]){
if(j==0||T[i]==T[j])
{++i,++j;
if(T[i]!=T[j])nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
11. 二维数组可以看作为数组名为一维数组的一维数组
3.疑难问题及解决方案
1.
Q:刚开始在写pta上的题目的时候通常会遇到“段错误”
A:记得去检查是否有给链表定义动态内存
2.
Q:递归函数不会去编写该怎么办
A:首先呢可以使用我们学习过的栈来代替,如果一定需要使用的话,那么请将整个过程展开,从后往前推回去,找到合适的递归方式,认清每一段共同的结合方式是很重要的,然后呢再回到最前方把代码整合。还要注意递归要有结束出口的嗷
3.
Q:时间空间复杂度不会计算怎么办呢
A:首先时间复杂度哇我们要注重循环的次数和什么有关,然后将前几段循环次数的规律整合下来,捡起你高中的数学,这些一般会和什么前n项和有关联,记得计算公式就好了。或者尝试去设置一个数M为循环的次数,带入计算循环的等式当中,就可以把一些对数指数类的时间复杂度算出来。如果遇到递归的话,需要列举不同情况,然后先展开几项递归式,发现之中蕴含的规律,就可以总结出来。而空间复杂度相对来说会简单一些,我们去注重作为中间传递值的“工具”式的变量就好了,如果是递归函数的话,那么请耐心的把递归式展开,或者发现递归展开的规律,得出递归的深度,就可以算出来啦。
4.
Q:感觉栈好难理解怎么办嘞
A:初学这一块内容的话,强烈建议要去画图,跟着程序一步一步画图这样才方便理解,因为会有些抽象,大脑可能对信息的总结会不够,这个时候画图就会让问题的解决更为清楚地展现在你面前,而勤加练习更是重中之重。
5.
Q:串的KMP匹配模式好难理解,有什么简洁的解释吗
A:在我这里呢,对KMP匹配模式的理解就是,在这个不匹配的字符之前的一整个串中,在前缀和后缀中寻找长度内容相同的项,因为在此字符之前的内容匹配都是相同的,如果模式串开头的一部分子串和不匹配的字符之前一段相同长度的子串相等的话,那么就可以省去开头相同子串的匹配,若是没有相同则证明主串回溯也匹配不到相同串,所以主串的回溯是没有必要的。而Nextval[j]函数则是在next[j]的算法上更进一步的差缺补漏,懂了前者,距离后者的理解也就不远了。