整理的算法模板合集: ACM模板


目录

  • 单链表
  • 双链表
  • 循环队列
  • 单调栈
  • 单调队列
  • 一般哈希

单链表

// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;// 初始化
void init()
{head = -1;idx = 0;
}// 在链表头插入一个数a
void insert(int a)
{e[idx] = a, ne[idx] = head, head = idx ++ ;
}// 将头结点删除,需要保证头结点存在
void remove()
{head = ne[head];
}

双链表

// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;// 初始化
void init()
{//0是左端点,1是右端点r[0] = 1, l[1] = 0;idx = 2;
}// 在节点a的右边插入一个数x
void insert(int a, int x)
{e[idx] = x;l[idx] = a, r[idx] = r[a];l[r[a]] = idx, r[a] = idx ++ ;
}// 删除节点a
void remove(int a)
{l[r[a]] = l[a];r[l[a]] = r[a];
}

// tt表示栈顶
int stk[N], tt = 0;// 向栈顶插入一个数
stk[ ++ tt] = x;// 从栈顶弹出一个数
tt -- ;// 栈顶的值
stk[tt];// 判断栈是否为空
if (tt > 0)
{}

循环队列

// hh 表示队头,tt表示队尾的后一个位置
int q[N], hh = 0, tt = 0;// 向队尾插入一个数
q[tt ++ ] = x;
if (tt == N) tt = 0;// 从队头弹出一个数
hh ++ ;
if (hh == N) hh = 0;// 队头的值
q[hh];// 判断队列是否为空
if (hh != tt)
{}

单调栈

/*常见模型:找出每个数左边离它最近的比它大/小的数*/
int tt = 0;
for (int i = 1; i <= n; i ++ )
{while (tt && check(stk[tt], i)) tt -- ;stk[ ++ tt] = i;
}

单调队列

/*常见模型:找出滑动窗口中的最大值/最小值*/
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
{while (hh <= tt && check_out(q[hh])) hh ++ ;  // 判断队头是否滑出窗口while (hh <= tt && check(q[tt], i)) tt -- ;q[ ++ tt] = i;
}

// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1
// ph[k]存储第k个插入的点在堆中的位置
// hp[k]存储堆中下标是k的点是第几个插入的
int h[N], ph[N], hp[N], size;// 交换两个点,及其映射关系
void heap_swap(int a, int b)
{swap(ph[hp[a]],ph[hp[b]]);swap(hp[a], hp[b]);swap(h[a], h[b]);
}void down(int u)
{int t = u;if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2;if (u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;if (u != t){heap_swap(u, t);down(t);}
}void up(int u)
{while (u / 2 && h[u] < h[u / 2]){heap_swap(u, u / 2);u >>= 1;}
}// O(n)建堆
for (int i = n / 2; i; i -- ) down(i);

一般哈希

(1) 拉链法

  int h[N], e[N], ne[N], idx;// 向哈希表中插入一个数void insert(int x){int k = (x % N + N) % N;e[idx] = x;//存到邻接表里ne[idx] = h[k];h[k] = idx ++ ;}// 在哈希表中查询某个数是否存在bool find(int x){int k = (x % N + N) % N;for (int i = h[k]; i != -1; i = ne[i])if (e[i] == x)return true;return false;}

(2) 开放寻址法

int h[N];// 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
int find(int x)
{int t = (x % N + N) % N;while (h[t] != null && h[t] != x){t ++ ;if (t == N) t = 0;}return t;
}

以上模板来自yxc

模板 -基础数据结构相关推荐

  1. 算法——常用的数据结构/模板/基础知识

    常用的数据结构/模板/基础知识 (一)c++--优先队列(priority_queue) 最大堆和最小堆的写法 (二)c++中的全排列函数next_permutation() (三)迭代器的使用 (四 ...

  2. 你需要知道的基础算法知识——STL和基础数据结构(六)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  3. 你需要知道的基础算法知识——STL和基础数据结构(七)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  4. 你需要知道的基础算法知识——STL和基础数据结构(五)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  5. 你需要知道的基础算法知识——STL和基础数据结构(四)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  6. 你需要知道的基础算法知识——STL和基础数据结构(二)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  7. 你需要知道的基础算法知识——STL和基础数据结构(一)

    引言 STL是C++的标准模板库,竞赛中很多常用的数据结构.算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程. STL包括容器(container).迭代器(iterator).空间配置 ...

  8. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  9. Algorithms_基础数据结构(03)_线性表之链表_双向链表

    文章目录 大纲图 双向链表 双向链表的基本结构 双向链表的基本操作 头插 尾插 中间部位插入 删除头部 删除尾部 删除中间位置的数据 查找 更新 Code 总结 大纲图 双向链表 Algorithms ...

最新文章

  1. szu 寒训复习day #4数论入门详解[修改]用Mardown再改了一下
  2. (0003) iOS 开发之App 适配iOS 10
  3. Hadoop Streaming编程实例
  4. 鸟哥的Linux私房菜(服务器)- 簡易 OpenWebMail 設定
  5. 根据录入的计算公式计算_工业铝型材承重计算
  6. 当推荐系统遇上多模态Embedding
  7. java nio is例子,Java Buffer isDirect()用法及代码示例
  8. 关于双黑洞和引力波,LIGO科学家回答了这7个你可能会关心的问题
  9. NAS 百科 —— http://baike.baidu.com/item/NAS%E7%BD%91%E7%BB%9C%E5%AD%98%E5%82%A8
  10. php mysql sum用法_mysql怎么使用sum()求id字段的和?
  11. 最速下降法matlab全局最小值_MATLAB实现最速下降法
  12. python如何安装numpy模块?
  13. 不用vpn的谷歌翻译网址
  14. 谷歌地图高清卫星地图
  15. React 还是 Vue: 你应该选择哪一个Web前端框架?
  16. 类和结构体的内存空间占有问题
  17. 【C++】C++中头文件使用双引号与书名号的区别
  18. 【spring】spring 的事务(transaction) 四 嵌套事务PROPAGATION_NESTED
  19. app 评论功能实现
  20. 大学英语(第三册)复习(原文及全文翻译)——Unit 1 - A Brush with the Law(与警察的一场小冲突)

热门文章

  1. BRIEF描述子生成算法
  2. 一文图解卡尔曼滤波(Kalman Filter)
  3. Pytorch 深度学习实战:视频自动打码
  4. 使用OpenCV和Dlib的头部姿态估计
  5. cin、getline的坑
  6. 22.加密与安全相关,证书申请CA(gpg,openssl)
  7. iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?...
  8. Lync 手机客户端登录过程
  9. 哈希一致性、哈希取余、自定义轮询分片的比较
  10. jira 配置自签SSL证书windowsAD域