• 链表

    • 用数组模拟,不同于结构体加指针
    • 调用new关键字开上万级别的节点非常慢,基本会超时
    • 单链表

      • 来构造邻接表
      • 用于存图与树
      • 基本结构:
        • head 表示头结点的下标
        • e[i] 表示节点i的值
        • ne[i] 表示节点i的下一个节点的下标
        • idx 存储当前已经用到了哪个节点,表示新节点
      • 基本操作:
        • 向链表头插入一个节点
        • 在节点k后面插入一个节点
        • 删除节点k后面的一个节点
      • 模板:
        int head;//头指针,指向头结点
        int e[N];//e[i]表示节点i的值
        int ne[N],//en[i]表示节点i的下一个节点
        int idx;//存储新节点的下标 //初始化
        void init(){
        head = 0; //0代表空节点
        idx = 1;//第一个插入的节点的下标为1
        } //头插法
        void add_to_head(int x){
        e[idx] = x; //存值
        ne[idx] = head; //连接
        head = idx; //转移连接
        idx ++ ; //
        } //在下标为k的节点后面插入一个数
        void add(int k, int x){
        e[idx] = x;
        ne[idx] = ne[k];
        ne[k] = idx;
        idx ++ ;
        } //删除下标为k的节点的后面的数
        void del(int k){
        ne[k] = ne[ne[k]];
        } //头删法,删除头结点
        void del_the_head(){
        head = ne[head];
        } //遍历输出所有节点
        for(int i = head; i; i = ne[i]) cout << e[i];
    • 双链表

      • 用于优化某些问题
      • 基本结构:
        • l[i] 存储下标为i的节点的右边的节点
        • r[i] 存储下标为i的节点的左边的节点
        • e[i] 存储下标为i的节点的值
        • idx 存储新节点的下标
        • 默认0表示空的头结点,1 表示空的尾节点,所有节点在0与1之间插入
      • 模板:
        const int N = 1e5 + 10;
        int l[N], r[N], e[N], idx; //初始化
        void init(){
        //0表示空头节点,1表示空尾节点
        r[0] = 1;
        l[1] = 0;
        idx = 2; //1,0已经被使用,初始化为2,表示第一个插入的节点的下标为2
        } //在下标为k的节点后面插入节点
        void add(int k, int x){
        e[idx] = x; //赋值
        l[idx] = k; //连接左
        r[idx] = r[k]; //连接右
        l[r[idx]] = idx; //转移连接
        r[l[idx]] = idx; //转移连接
        idx ++ ; //更新下标
        } //删除下标为k的节点
        void del(int k){
        r[l[k]] = r[k];
        l[r[k]] = l[k];
        } //遍历输出节点,注意起点与终点
        for(int i = r[0]; i != 1; i = r[i]) cout << e[i]; //以下是统一插入个数与下标的代码
        //初始化
        void init(){
        //0表示空头结点,N - 1表示空尾节点
        r[0] = N - 1;
        l[N - 1] = 0;
        idx = 1; //0,N - 1被使用,下标从1开始,表示第一个插入的节点下标就是1
        }
        //add函数不变
        //遍历输出,注意起点和终点
        for(int i = r[0]; i != N - 1; i = r[i]) cout << e[i];
  • 邻接表

    • 一堆单链表,单链表数组
    • 先进后出
    • 模板:
      int stk[N], tt;//声明栈和栈顶下标
      stk[ ++ tt] = x; //x入栈
      tt --; //出栈
      stk[tt]; //取栈顶元素
      if(tt > 0) not empty //判断是否为空
      else empty
    • 单调栈:
      • 应用:在一段序列中求距离某数最近的最大值/最小值
  • 队列

    • 先进先出
    • 模板:
      int q[N], hh, tt = -1; //声明队列,队首下标,队尾下标
      q[ ++ tt] = x; //入队只能从队尾
      hh --; //出队只能从队首
      q[hh];//取队首
      q[tt];//取队尾
      if(hh <= tt)not empty //判断是否为空
      else empty
    • 单调队列(单调双端队列):
      • 引用:求固定大小的滑动窗口的最大值/最小值
  • KMP

    • 模式串匹配算法
    • 模板:
      int s[N], p[M];//主串和模式串,下标从1开始
      
      //求next数组
      void get_next(){
      for(int i = 2, j = 0; i <= m; ++ i){
      while(j && p[i] != p[j + 1]) j = ne[j];//j可以回跳并且匹配不成功时, j回跳
      if(p[i] == p[j + 1]) j ++ ; //匹配成功
      ne[i] = j; //存i可以回跳的位置
      }
      } //KMP
      for(int i = 1, j = 0; i <= n; ++ i){
      while(j && s[i] != p[j + 1]) j = ne[j]; //同上
      if(s[i] == p[j + 1]) j ++ ;
      if(j == n){ //当j等于模式串的长度时匹配成功
      j = ne[j]; //继续进行下一次匹配
      cout << i - n << endl; //输出匹配的起点下标
      }
      }
      //j = ne[j] ,j往前跳,相当于字串往后移

链表/栈/队列/KMP的更多相关文章

  1. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  2. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  3. Java 容器之 Connection栈队列及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  4. java面向对象的栈 队列 优先级队列的比较

    栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...

  5. 栈 队列 hash表 堆 算法模板和相关题目

    什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...

  6. 栈&队列&并查集&哈希表(julyedu网课整理)

    date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...

  7. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  8. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  9. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  10. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

随机推荐

  1. [C++提高编程] 3.6 queue 容器

    文章目录 3.6 queue 容器 3.6.1 queue 基本概念 3.6.2 queue 常用接口 3.6 queue 容器 3.6.1 queue 基本概念 概念:Queue是一种先进先出(Fi ...

  2. RedisTemplate在拦截器前没有注入的问题

    RedisTemplate为null的问题 最近在搭建一个项目,然后项目框架采用的是spring boot,然后登录我就使用新学习的JWT嘛,然后就想着在请求进来的时候使用拦截器先对传进来的token ...

  3. 2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行。请用go语言调用libx265.dll,将yuv文件编码成h265文件。

    2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行.请用go语言调用libx265.dll,将yuv文件编码成h265文件. 答案2023-03-08: 使用 ...

  4. 2022-04-05:golang中go.mod文件,做框架开发需要解析,请问如何解析?

    2022-04-05:golang中go.mod文件,做框架开发需要解析,请问如何解析? 答案2022-04-05: go.mod解析可参考这个.做框架开发主要是用到require和replace.具 ...

  5. 2022-02-19:安装栅栏。 在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。

    2022-02-19:安装栅栏. 在一个二维的花园中,有一些用 (x, y) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏. ...

  6. 【Vue2.x源码系列08】Diff算法原理

    什么是虚拟DOM DOM是很慢的,其元素非常庞大,当我们频繁的去做 DOM更新,会产生一定的性能问题,我们可以直观感受一下 div元素包含的海量属性 在Javascript对象中,虚拟DOM 表现为一 ...

  7. LLM探索:GPT概念与几个常用参数 Top-k, Top-p, Temperature

    前言 上一篇文章介绍了几个开源LLM的环境搭建和本地部署,在使用ChatGPT接口或者自己本地部署的LLM大模型的时候,经常会遇到这几个参数,本文简单介绍一下~ temperature top_p t ...

  8. 用BP软件 批量注册用户

    第五步:查看管理员后台----用户界面, 有没有批量添加进用户

  9. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...

  10. Docker 的安装及常用命令

    CentOS Docker 安装 参看链接 Windows安装 Docker Desktop 官方下载地址: https://hub.docker.com/editions/community/doc ...