随笔分类 - 数据结构与算法
记录一下数据结构与算法的学习历程
摘要:原题 : 数字三角形 https://www.acwing.com/problem/content/900/ 题意 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 分析 对于每一个位置
阅读全文
摘要:今天在 DSA 课上提到了这道题,我就搜来做了一下。 题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 暴力枚举什么的思路就不提了,肯定超时了。 思路1:DP 这个题看到我的第一想法就是用 DP,用 f[j] 表示以 j 结尾的连续子序
阅读全文
摘要:Overview Prim's Algorithm Prim' Algorithm 的主要思路就是维护两个集合 T, V-T,其中 V 是所有顶点组成的集合,T 是当前在正在形成的树的顶点的集合。 先随便选一个点作为根节点。 循环进行如下操作,直到 V = T. 在连接 T 内顶点和 V-T 内顶点
阅读全文
摘要:What is topological sort? 有向无环图(DAG)可以表示某种偏序关系,比如要学习 X 知识,我需要先学习 Y 知识和 Z 知识,这在图上表示为 Y → X 以及 Z-> X 这两条有向边。拓扑排序就是要在这种偏序关系之上加以拓展,建立一个全序关系,且不能破坏原先的偏序关系,也
阅读全文
摘要:并查集是什么 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题。 它支持两种操作: 查找(Find):确定某个元素处于哪个子集; 合并(Union):将两个子集合并成一个集合。 简单来说就是用树的形式来维护集合,支持合并和查询。 基本原理 每个集合用一棵树来表示,树
阅读全文
摘要:Graph Theory Intro 图是计算机科学中一种常用的数据结构,用来表示对象和对象之间的关系,直观上我们用圆点来表示对象,点之间的边表示对象之间的关系。我们将一张图 G 记作,其中 是点集(Vertex), 是边集(Edge),一条从点 u 指向
阅读全文
摘要:堆简介 堆是一棵完全二叉树,其每个节点都有一个键值,且每个节点的键值都大于等于/小于等于其父亲的键值。 每个节点的键值都大于等于其父亲键值的堆叫做小根堆,否则叫做大根堆。STL 中的 priority_queue 其实就是一个大根堆。 (小根)堆主要支持的操作有:插入一个数、查询最小值、删除最小值、
阅读全文
摘要:二叉搜索树 二叉搜索树满足这样的性质: 每个节点 x 有一个键值。 节点 x 的键值大于等于左子树的任意节点 y 的键值. 节点 x 的键值小于等于右子树的任意节点 z 的键值. 二叉搜索树的表达 struct Node{ int key; Node*parent ; Node*left; Node
阅读全文
摘要:有根树 基本概念 如果一棵树有一个名为"根"的节点,那么它是一棵有根树。 有根树的节点之间具有父子关系,没有父亲节点的是根节点,没有儿子节点的是叶节点。 一个节点的深度是它与根节点之间的距离。 有根树的表达 有根树的表达可以用左子右兄弟表示法,这种表示法中各节点具有如下信息: 节点 u 的父亲节点
阅读全文
摘要:Trie树(字典树) 什么是trie树 字典树,顾名思义,就是像字典一样的树,用来快速存储和查找字符串集合的数据结构。 就像下面这张图这样。 应用 Trie 树不止可以应用于字符串,只要某种信息表示可以以这种方式存储,都可以应用 Trie 树来存储,查找,或者维护某些信息。 检索字符串,如 AcWi
阅读全文
摘要:KMP 算法最基本的应用场景是字符串的模式匹配,然而其应用远不止于此,在匹配字符串的过程中用到的一部分思想本身在一些场景中也可以得到应用,比如下面的这道求循环节的题。 题目大意就是给出一个字符串,然后求它的某个长度的前缀是否由循环节组成,若有则输出这个前缀的长度和循环节个数。 附上题目链接:[POJ
阅读全文
摘要:寒假自学了一点数据结构,最近又看了《挑战2》来复习了以下基本的数据结构,以此随笔简单记录之。 数据结构 Intro 数据结构是计算机中存储,组织数据的方式,通常来说,它并不是单指数据集合本身,而是包含以下内容: 数据集合,如数组,结构体等。 操作,比如栈有压栈,弹出等操作。 规则,规定了某种数据结构
阅读全文
摘要:Intro 搜索差不多也可以说算是一种暴力枚举策略,从初始状态开始,逐渐扩大寻找范围,直到找到答案。但是和直接枚举相比减少了一些无效状态,提高了效率,在数据规模不大时搜索仍然是一种有效的办法。根据搜索的特性可以分为深度优先搜索和广度优先搜索。 深度优先搜索 在枚举某种填空方式时,我们先枚举这个空所有
阅读全文
摘要:Definition 贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。简单来说就是模拟一个贪心的人的想法,每一步都只顾眼前的利益,取得局部的最优解,而局部最优解加起来能得到全局最
阅读全文
摘要:struct Bigint{ int len,a[MAXN]; Bigint(int x = 0){ memset(a,0,sizeof(a)); for(len = 1;x;len++) a[len] = x%10,x/=10; len --; } int &operator [](int i){
阅读全文
摘要:学习单调栈的心得,以此随笔简记之。 Intro 我们由这样一个问题来引入单调栈:给定一个 N 个元素的数组,输出每一个数左边离它最近的比它小的数,没有则输出-1。 Solution 我们一下子就想出了暴力法,对于每个数都向前回溯,直到找到或者到数组头。这样的做法是 的,效率比较
阅读全文
摘要:学的晕乎乎的单调队列,记录一下这次学完的理解以便日后审视和复习。 单调队列 Intro 我们从这样一个问题来引入单调队列,给定一个数组,长度为 N,一个长度为 k 的窗口从左到右滑动,求每个时刻滑动的窗口中所有元素的最值。 POJ 2823 滑动窗口 Solution 那么如何解决本题?一个简单又暴
阅读全文
摘要:初等排序 这篇随笔写于阅读《挑战程序设计竞赛2》初等排序一章后,记录一下心得以便日后的复习与回顾。 插入排序 思路 插入排序的想法很简单,就像模拟我们打牌时把牌从小到大排序一样,我们将元素依次放到适当的位置,就完成了排序。 具体的过程如下: 我们将数组分为两部分,已经排好序的和未排好序的。初始时所有
阅读全文