• 算法学习


    数据结构

    并查集

    主要功能

    查询是否为一个集合

    主要变量

    pre[]:表示某个点的祖先

    主要函数

    find(int index)

    merge(int a,int b)

    树状数组

    主要功能

    区间求和

    单点更新

    主要变量

    V[]:表示往左lowbit长度的区间的内值的总和

    主要函数

    lowbit(int index):x&-x得到最低位的1的值,表示区间长度

    add(int index):往上+lowbit

    sum(int index):往下-lowbit

    线段树

    基于分治思想的二叉树结构。

    主要功能

    区间求和

    区间更新

    主要变量

    STree{

    int l,r;

    int dat;

    }t[n*4]

    主要函数

    build(int l,int r,int p):给结构体赋值区间和值。递归build,当l==r时,赋值。不相等时,从p*2,p*2+1取值。

    change(int p,int x,int v):从根节点出发,根据x与mid的大小关系选择左右分支,找到x==x,则更新,然后往上更新。

    ask(int p,int l,int r):根据情况分为左重叠,右重叠和完全重叠。

    字典树

    主要功能

    实现字符串快速检索

    主要变量

    int pos = 1;//每新增一个前缀字符(树上多一个节点),则+1

    int trie[1000010][26];//存储下一个字符的位置

    int num[1000010];//以此为前缀的单词的数量

    bool tail[1000010]; 标记某个字符是否为单词结尾

    int p = 0;局部变量,表示该前缀字符在num中的位置

    主要函数

    void insert(char str[]){

    int p = 0;

    for(int i = 0; str[i]; ++i){

    int n = str[i] - 'a';

            //该位置为0。则为他在num中新开辟一个空间,以记录数量

    if(trie[p][n] == 0){

    trie[p][n] = pos++;

    }

    p = trie[p][n];

    num[p]++;

    //根据需要打上标记

    if(!str[i + 1]){

    tail[p] = true;

    }

    }

    }

    int find(char str[]){//查找以某个字符串为前缀的单词数量

    int p = 0;

    for(int i = 0; str[i]; ++i){

    int n = str[i] - 'a';

    if(trie[p][n] == 0){

    return 0;

    }

    p = trie[p][n];

    }

    return num[p];

    }

    二叉堆

    主要功能

    查询最值

    主要变量

    树的数组实现

    主要函数

    insert,最后一个节点插入,进行up操作

    extract,最后一个节点替代顶点,进行down操作

    removed,最后一个节点替代,进行up或down操作。

    up

    down

     

    算法

    dijkstra

    每次优先队列pop,即最短路点集,flag【i】=1,队列存储的是节点。每次pop之后都要根据dist【i】+map[i][j]更新dist[j]

    主要变量

    dist【】,源点到某点的最短距离

    map【】【】,点到点之间的距离

    flag【】,是否已经在最短路点集中

    主要函数

    struct Node

    {

    int u, step;

    Node() {};

    Node(int a, int sp)

    {

    u = a, step = sp;

    }

    bool operator<(const Node& a)const {//重载 <

    return step > a.step;

    }

    }

     

    技巧

    差分

    给定一个数列A,差分数列为B

    B[1]=A[1],B[i]=A[i]-A[i-1] (2<=i<=n)

    实际上与前缀和序列为互逆运算,前缀和的差分即原序列,差分的前缀和即原序列

    主要功能

    区间更新:当区间[l,r]想要加1时,只需差分序列a[l]-1,a[r]+1,得到前缀和运算时,原序列该区间就会加1。

    哈希打表

    查看不同start的ans是否会重复,超时考虑打表。

    主要变量

    head[val]=tot;表示以某个哈希值为参数的第一个节点

    next[tot]=tot;表示以雪花下标为参数的下一个节点的下标

    snow[val];存储每个雪花的数据

    主要函数

    insert

    hash

    equal

  • 相关阅读:
    VTemplate模板引擎的使用--入门篇
    VTemplate模板引擎的使用--进阶篇
    装载当前页面的模板文档
    学习平台判断是否是手机端
    畜禽免疫系统使用LODOP打印
    关于.NET编译的目标平台(AnyCPU,x86,x64)(转)
    ConcurrentHashMap原理分析(1.7与1.8)
    Synchronized方法锁、对象锁、类锁区别
    谈谈线上CPU100%排查套路
    java-虚拟机-索引
  • 原文地址:https://www.cnblogs.com/MiraculousB/p/16478606.html
Copyright © 2020-2023  润新知