• 简单数据结构


    简单数据结构

    单链表

    1、用途

    快速维护数据的添加与删除

    2、原理

    每个节点由数据与指针两部分组成,指针指向该节点后一个元素所在的位置。

    头指针指向链表的第一个元素。如果有尾指针的话尾指针指向链表的最后一个元素。

    利用数组模拟链表,原因是new操作太慢。

    3、复杂度

    插入/删除:(O(1))

    查询/遍历:(O(n))

    4、模板

    初始化
    const int MAXN = 1e5 + 10;
    int e[MAXN], ne[MAXN], idx = 0;
    ne[0] = -1;
    

    注意:

    (0)号节点作为头指针,里面不放值,只存放第一个元素开始的地址;

    (e[i])表示地址为(i)的元素的值,(ne[i])表示地址为(i)的元素后一个元素的地址;

    ③以(-1)作为链表结束的标志。

    添加元素
    e[++idx] = x, ne[idx] = ne[0], ne[0] = idx;
    

    注意:

    ①该模板在链表头添加元素。

    e[++idx] = x, ne[idx] = ne[k], ne[k] = idx;
    

    注意:

    ①该模板在链表指定位置后添加元素。

    删除元素
    ne[k] = ne[ne[k]];
    

    注意:

    ①该模板在链表指定位置后删除元素。

    遍历链表
    for (int i = ne[0]; i != -1; i = ne[i]) cout << e[i] << ' ';
    

    5、备注

    ①若需要创建多个链表则需要使用(h)数组记录每个链表头结点的地址。

    1、用途

    维护一个先进后出的序列

    2、原理

    利用top指针,加入元素时++top,把元素放入新开辟的空间内;删除时--top,把栈顶元素弹出。

    3、复杂度

    添加/删除/访问栈顶元素:(O(1))

    4、模板

    初始化
    const int MAXN = 1e5 + 10;
    int st[MAXN], top = 0;
    
    添加元素
    st[++top] = x;
    
    删除元素
    --top;
    
    访问栈顶元素
    return st[top];
    
    判断栈是否为空
    if (!top) return "empty";
    else return "not empty";
    

    5、备注

    ①在删除元素或访问栈顶元素的时候要先判断栈是否为空。

    队列

    1、用途

    维护一个先进先出的序列

    2、原理

    利用头尾指针,加入元素时++r,把元素放入新开辟的空间内;删除时++l,把队首元素弹出。

    3、复杂度

    添加/删除/访问队首队尾元素:(O(1))

    4、模板

    初始化
    const int MAXN = 1e5 + 10;
    int que[MAXN], l = 1, r = 0;
    
    添加元素
    que[++r] = x;
    
    删除元素
    ++l;
    
    访问队首元素
    return que[l];
    
    访问队尾元素
    return que[r];
    
    判断队列是否为空
    if (l > r) return "empty";
    else return "not empty";
    

    5、备注

    ①在删除元素或访问队首/队尾元素的时候要先判断队列是否为空。

    单调栈

    1、用途

    维护某个元素之前/之后第一个满足某条件的数

    2、原理

    在栈的基础上保证栈内元素的有序性

    3、复杂度

    添加/删除/访问栈顶元素:(O(1))

    4、模板

    初始化
    const int MAXN = 1e5 + 10;
    int st[MAXN], top = 0;
    

    注意:

    ①单调栈内存放的是该元素在原数组中的下标。

    添加元素
    while (top && check(st[top], i)) --top;
    //此时st[top]为i前第一个满足某性质元素的下标
    st[++top] = i;
    
    删除元素
    --top;
    
    访问栈顶元素
    return st[top];
    
    判断栈是否为空
    if (!top) return "empty";
    else return "not empty";
    

    5、备注

    ①在删除元素或访问栈顶元素的时候要先判断栈是否为空。

    单调队列

    1、用途

    维护某个长度固定的区间内满足某条件的数

    2、原理

    在双端队列的基础上保证队列内元素的有序性

    3、复杂度

    添加/删除/访问队首队尾元素:(O(1))

    4、模板

    初始化
    const int MAXN = 1e5 + 10;
    int que[MAXN], l = 1, r = 0;
    

    注意:

    ①单调队列内存放的是该元素在原数组中的下标。

    添加元素
    while (l <= r && check(que[r], i)) --r;
    while (l <= r && que[l] <= i - k) ++l;
    que[++r] = i;
    if (i >= k) ... //此时que[l]为区间内满足某条件的数,对其进行操作
    
    删除队首元素
    ++l;
    
    删除队尾元素
    --r;
    
    访问队首元素
    return que[l];
    
    访问队尾元素
    return que[r];
    
    判断队列是否为空
    if (l > r) return "empty";
    else return "not empty";
    

    5、备注

    ①在删除元素或访问队首/队尾元素的时候要先判断队列是否为空。

    例题

    牛客2020暑期多校2 F Fake Maxpooling

    HDU 6759 Leading Robots

  • 相关阅读:
    dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
    人脸识别FaceNet+TensorFlow
    人体姿态估计(骨骼关节点检测)发展历程回顾
    基于人脸的用户识别方案及思路
    人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)
    基于opencv+ffmpeg的镜头分割
    如何让两个线程交替打印整数1-100?你的答案呢?
    Ubuntu16.04+TensorFlow r1.12环境搭建指南
    在Eclipse中打jar包
    Linux常用快捷键
  • 原文地址:https://www.cnblogs.com/Lecxcy/p/13602584.html
Copyright © 2020-2023  润新知