| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> ACwing:算法基础课 第二章单链表,双链表,队列,栈以及KMP听课笔记 -> 正文阅读 |
|
[数据结构与算法]ACwing:算法基础课 第二章单链表,双链表,队列,栈以及KMP听课笔记 |
前言 本次课程的前半部分讲链表和栈队列的时候都有多种的实现方式,比如可以通过用指针和结构体的方式去实现链表,也可以通过STL库直接实现栈和队列。但是本次课程主要就是讲用数组进行模拟,原因如下: 效率问题。通过数组模拟的效率比较高,如果利用结构体和指针实现链表的话,每次存进去的时候都要new一个结点,但是这个效率非常慢。一般都是有十万级别的,所以用动态链表去实现的时候,太耗时间了,全部都花在新建结点上面了。 如上图所示的这个动态存储的方式一般不用。但是如果进行优化一下还是可以用这个来实现的,优化的方式就是直接先初始化有多少个结点,就是不要去new了,这样的话这个原理就和数组差不多,省去了new的时间。 一。链表与邻接表 1。用数组模拟单链表,考得最多的是模拟邻接表的情况 (1)邻接表的作用 (2)数组模拟单链表的方法 首先需要两个数组e和ne,前者是用来存元素的,e的下标就表示结点的序号,内容就是表示该结点存的元素。ne 数组存的是下一个指向结点的位置,它的下标表示该结点的序号,里面存的是该结点指向的下一个结点的序号。 (3)模版代码如下: 第一种插入情况:插入为头结点。分三步,第一步将数据存入到当前idx指向的结点e[idx]=new。第二步将新点的ne指向原来head指向的下一个结点位置。第三步head指回到新的头结点。第四步,idx++ 第二种插入情况:将点插入到结点为k的点的后面。分四步走。第一步将新结点的数据存进来,e[idx]=new;第二步将新结点的ne 指向k结点的ne;第三步将k结点的ne指向新结点;第四步idx++ 4??编写删除结点函数。 第二种情况的代码如下: 总的代码如下:
2。用数组模拟双链表,考得最多的是用来优化某些问题 (1)用数组模拟双链表的方法 首先需要三个数组,e,l,r,e用来存这个该结点的元素是什么,l用来存该结点左边指向的是谁,r用来存该结点右边指向的是谁。然后还要一个 idx是用来作为遍历链表的指针,注意,我们直接将e[o]作为head,将最后一个结点作为tail (2)模版代码如下: 2??编写初始化函数。 3??编写插入函数。插入的时候可以插入右边也可以插入左边。 第一个情况:在k的右边插入一个新结点;分为五步走:第一步将结点的数据存进来e[idx]=new;第二步将新结点的右边指向原结点的右边;第三步将新结点的左边指向原结点的左边;第四步将原结点的下一个结点的左边指向新结点;第五步将原结点的右边指向新结点。 第二种情况,在k的左边插入一个新结点。直接变成在k的前一个结点的右边插入一个新结点就行,然后调用第一种情况的。 4??编写删除函数。 总的代码如下:
二。栈与队列 1。栈与队列的定义:栈是先进后出,队列是先进先出。 2。栈的各种操作:直接用数组模拟,然后在用一个指针to 来指示。插入操作:stk[tt++]=x。弹出操作:tt—。判断栈是否为空:if(tt>0) not empty else empty 。栈顶:skt[tt]
3。队列的各种操作:在队尾插入元素,队头弹出元素。q[N],hh,yy=-1。插入操作:q[++tt]=x;
循环队列:
4。单调栈: (1)对应题型:给定一个序列,找出每个数的左边(右边)离他最近的,且比它小(大)的数在什么地方,例题如下: (2) 暴力做法: (3)优化做法: 首先,考虑是否具有单调性,假设从头开始出发的指针去扫描,因为找的是某个元素左边离他最近的最小的元素,所以扫描的时候如果新的元素比他大就不往前走了,因此,这具有单调性,我们可以用栈来实现,我们可以设置一个单调栈,就是,每次读入一个元素的时候,先将栈头的指针定位到比该元素小的最近的那个,如果栈顶指针不为空的话就说明已经找到最小的那个了,直接把结果输出去就行,然后把它加进单调栈里面,如果没找到的话,就输出-1即可然后比较一下,如果这个元素小的话就把它加进站里面 (4)本节学到的知识点(重点): 第一:单纯的cin,cout要比scanf慢十倍左右,所以如果输入输出很多的的话,还是非常建议用scanf才好 第二:在main函数中或者要用到cin ,cout的地方之前加上:
这样读入读出时间可以比拟 scanf (5)总的代码如下:
5。单调队列: 模板题:滑动窗口的是最大最小值 用队列来维护滑动窗口:第一步将滑动队列向右滑动滑动一位队头进来,然后队尾出去一位。发现单调性:依次遍历的时候,只要前面的点比后面的点要大那么就不可能被选上,所以就可以直接删去。这样就变成了一个单调队列。 单调队列和单调栈的一个思路都是: 注意:STL的容器若不开O2优化,则会比数组模拟的要2慢
滑动窗口例题的代码如下: 三。KMP 1.定义: 2.思考方向: 3.暴力算法:
对模板串P[N]进行一个预处理,找出其以一个点的后缀与该点前缀相同的位置;这样子模板串去匹配长串的时候,如果匹配到长串的某一个位置失败了,那么就知道可以移动的最大长度了,因为我们找出了模板串中某个点后缀与该点前缀相同的位置。 这个就是KMP中next数组的含义,next[i]表示的这一段的字符串中后缀与以1为起点的前缀相等长度最长是多少 匹配过程如下: 5。代码如下: 注意点: 代码如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:39:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |