算法
文章平均质量分 96
WavenZ
北航硕士
展开
-
Algo~
熟读并背诵全文。1. 并查集int find(int x) { return pre[x] == x ? x : pre[x] = find(pre[x]); }void merge(int a, int b){ pre[find(a)] = find(b);}2. 快排稳定性:不稳定时间复杂度:O(n2)/O(nlgn),空间复杂度:O(1)int partition(int* vec, int start, int end){ int pos = star原创 2020-06-09 20:05:10 · 309 阅读 · 0 评论 -
算法导论学习笔记15_最短路径
最短路径1. 单源最短路径1.1 Bellman-Ford算法1.2 有向无环图的单源最短路径1.3 Dijkstra算法2. 所有结点对的最短路径问题2.1 Floyd-Warshall算法3. 算法实现(C++)3.1 Bellman-Ford算法3.2 有向无环图的单源最短路径3.3 Dijkstra算法3.4 Floyd算法1. 单源最短路径1.1 Bellman-Ford算法Bel...原创 2019-11-17 16:13:52 · 558 阅读 · 0 评论 -
算法导论学习笔记11_红黑树
红黑树原创 2019-04-07 15:23:36 · 205 阅读 · 0 评论 -
算法导论学习笔记6_线性时间排序
线性时间排序 \space\space\space\space 在常见的排序算法中,插入排序的最坏情况运行时间为Θ(n2)\Theta(n^2)Θ(n2);快速排序的最坏情况运行时间虽然也为Θ(n2)\Theta(n^2)Θ(n2),但其在平均情况下的运行时间为Θ(nlgn)\Theta(n\lg ...原创 2019-04-03 11:28:31 · 385 阅读 · 0 评论 -
算法导论学习笔记13_贪心算法
贪心算法1. 贪心算法定义及性质2. 实例1:活动选择问题3. 实例2:霍夫曼编码4. 附录(代码)4.1 活动选择代码4.2 霍夫曼编码代码1. 贪心算法定义及性质贪心算法(Greedy Method),又称为“贪婪算法”。是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而导致结果是最好或最优的算法。贪心算法的两个要素是:最优子结构、贪心选择性质。最优子结构:如果一个问题的最...原创 2019-04-15 22:38:31 · 429 阅读 · 0 评论 -
算法导论学习笔记7_中位数和顺序统计量
中位数和顺序统计量1. 最大最小值2. 线性时间的选择算法3. 附录3.1 最大最小值代码3.2 快速选择代码1. 最大最小值在一个nnn个元素的集合中,至少需要做n−1n-1n−1次比较才能确定其最小元素或最大元素。下面的伪代码给出了最朴素的一种方式:MINMUM(A) min = A[1] for i = 2 to A.length if min > A[i] mi...原创 2019-04-03 17:47:17 · 329 阅读 · 0 评论 -
算法导论学习笔记15_最小生成树
最小生成树MST1. 最小生成树(MST)2. 贪心选择性质3. Kruskal算法4. Prim 算法5. 附录(代码)5.1 Kruskal 算法代码5.2 Prim 算法代码1. 最小生成树(MST)定义:图G=(E,V)G=(E, V)G=(E,V)的生成树是包含其所有结点的无环连通子图,有权图的最小生成树是其权值之和最小生成树。下图展示了有权图的最小生成树:其中,加粗的边和所...原创 2019-04-26 22:03:06 · 559 阅读 · 0 评论 -
算法导论学习笔记14_基本图算法
基本图算法1. 图的表示1.1 邻接链表1. 图的表示对于一个图G=(V,E)G=(V, E)G=(V,E),通常由两种表示方法:邻接链表和邻接矩阵。对于稀疏图(边的条数∣E∣|E|∣E∣远远小于∣V∣2|V|^2∣V∣2的图),通常用邻接链表表示,而对于稠密图(∣E∣|E|∣E∣接近∣V∣2|V|^2∣V∣2),通常采用邻接矩阵的形式表示。1.1 邻接链表对于图G=(V,E)G=(V,...原创 2019-04-25 15:23:51 · 779 阅读 · 0 评论 -
Learn_PyTorch_4_神经网络结构
PyTorch入门总结41.1 神经元1.2 神经网络基本结构1.1 神经元神经网络中,神经元模型如下:用公式表示为:a=σ(z)=σ(a1w1+a2w2+⋯+aKwK+b)a = \sigma(z) = \sigma(a_1w_1 + a_2w_2 + \cdots+a_Kw_K + b)a=σ(z)=σ(a1w1+a2w2+⋯+aKwK+b)其中,[a1,...,ak,....原创 2019-06-15 16:38:14 · 431 阅读 · 2 评论 -
Learn_PyTorch_5_卷积神经网络A
PyTorch入门总结51 卷积1.1 一维卷积1 卷积1.1 一维卷积原创 2019-06-17 21:51:35 · 602 阅读 · 0 评论 -
算法导论学习笔记5_快速排序
快速排序1. 快速排序1. 快速排序快速排序是一种最坏情况时间复杂度为Θ(n2)\Theta(n^2)Θ(n2)的排序算法,虽然最坏情况时间复杂度很差,但是它的平均性能非常好,其期望时间复杂度为Θ(nlgn)\Theta(n\lg n)Θ(nlgn),而且Θ(nlgn)\Theta(n\lg n)Θ(nlgn)中隐含的常数因此非常小。此外,快速排序是一种原址排序算法。与归并排序相同,...原创 2019-04-01 20:31:35 · 243 阅读 · 0 评论 -
算法导论学习笔记3_分治策略
目录1. 分治策略基本步骤1. 分治策略基本步骤分治法的基本思想是:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。分治法的三个步骤是:分解原问题为若干子问题,这些子问题都是原问题的规模较小的实例。解决这些子问题,递归地求解各个子问题。当子问题足够小时,直接求解子问题。合并这些子问题的解构成原问题的解。...原创 2019-03-28 11:03:17 · 775 阅读 · 0 评论 -
算法导论学习笔记4_堆排序与优先队列
目录1. 堆的定义及性质2. 堆排序3. 优先队列1. 堆的定义及性质堆和栈是计算机科学中两种常见的数据结构,另外堆区和栈区是C++中内存分配的两个区域,需要注意它们与堆、栈两种数据结构之间的区别。二叉堆通常分为两种形式:最大堆和最小堆。在这两种堆中,结点的值要满足堆的性质(以最大堆为例):除根节点以外的所有节点iii都要满足:A[PARENT(i)]≥A[i]A[PARENT(i)]\...原创 2019-04-01 17:04:46 · 219 阅读 · 0 评论 -
暴力求解法之回溯法
回溯法1. 枚举法的局限2. 回溯法1. 枚举法的局限在解决问题的时候,我们经常需要用到枚举法来枚举出所有可能的结果,然后判断枚举出的结果是否满足条件,如果满足条件则接受,不满足则拒绝。下面是一个非常经典的例子:例:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?简单的来说就是解下列方程组:{x+y+z=1005x+3y+z/3=100\begin{...原创 2018-11-26 11:51:16 · 775 阅读 · 0 评论 -
暴力求解法之枚举排列
枚举排列1. 生成{1, 2, ..., n}的排列2. 生成含重复元素的排列3. 解答树总结1. 生成{1, 2, …, n}的排列由数学公式Ann=n!A_n^n=n!Ann=n!可知,{1, 2, …, n}的排列共n!种可能,当n取3时,3!=6,而当n取6时,6!=720。下面讨论如何按字典序升序输出{1, 2, …, n}的所有排列。考虑用递归的思想,下面以n=3为例分析。大致...原创 2018-11-25 12:46:22 · 283 阅读 · 0 评论 -
暴力求解法之子集生成
子集生成1. 增量构造法2. 位向量法3. 二进制法总结本文的主要内容是讨论对于特定的集合,如果生成它的所有子集问题,其中涉及到了枚举和递归的思想,我在另一片博文暴力求解法之枚举排列中具体讲解了递归的过程以及解答树相关内容,有兴趣的可以查看。当然,本文也会详细的讨论如何通过枚举和递归来求解子集的问题。1. 增量构造法增量构造法顾名思义就是逐个增加元素个数来构造子集。下面简单描述利用增量构造...原创 2018-11-25 14:50:03 · 398 阅读 · 1 评论 -
算法导论学习笔记1_循环不变式
循环不变式1. 循环不变式和数学归纳法2. 循环不变式的三条性质3. 利用循环不变式分析插入排序1. 循环不变式和数学归纳法在数学中,数学归纳法常用于证明给定命题在自然数范围内的正确性,它是一种严谨的演绎推理法。而在计算机科学中,循环不变式同样作为一种演绎推理法用于理解和证明算法的正确性。从下文的介绍中可以看出,循环不变式和数学归纳法有着许多的相似之处。2. 循环不变式的三条性质循环不变式...原创 2019-03-23 16:29:40 · 2626 阅读 · 0 评论 -
算法导论学习笔记8_基本数据结构
基本数据结构1. 栈和队列4.附录4.1 栈代码4.2 队列代码1. 栈和队列栈和队列是两个基本的动态集合,其中栈遵循后进先出(LIFO)的原则,队列遵循先进先出(FIFO)的原则。下图展示了元素入栈出栈的过程:下列是与栈有关的操作:stack.push() 将元素压入栈中stack.pop() 将栈顶元素弹出stack.empty() 判断栈是否为空stack.top()...原创 2019-04-04 11:27:46 · 178 阅读 · 0 评论 -
算法导论学习笔记2_渐近记号
渐近记号1. 算法运行时间2. 渐近记号渐近上界(O记号)1. 算法运行时间在分析算法的效率时,常用用时间复杂度和空间复杂度来描述其运行时间和临时占用的存储空间大小。在多数情况下,我们更加关心一个算法的时间复杂度,当我们在分析算法的效率时,大多数情况下是指的时间效率。如果一个算法的最坏情况运行时间有比另一个算法更低的增长量级,那么我们通常认为前者比后者更加有效。例如,当一个算法的运行时间随输入...原创 2019-03-26 21:34:05 · 747 阅读 · 0 评论 -
算法导论学习笔记9_散列表
散列表1. 散列表1. 散列表散列表(Hash Table,又称哈希表)是一种根据关键字直接访问内存存储位置的数据结构。在链表或者有根树等结构中,如果我们知道一个对象的关键字(key),我们需要与链表或者树中对象的关键字进行逐一比较,从而找到该对象的位置。散列表则不同,它通过将对象的关键字映射为一个地址,将该地址作为对象的存储地址,从而在查找对象时不需要进行关键字的比较。假设所有关键字在...原创 2019-04-05 20:41:37 · 618 阅读 · 0 评论 -
算法导论学习笔记12_动态规划
动态规划1. 动态规划的定义1. 动态规划的定义动态规划(英语:Dynamic Programming,简称DP)常用于求解最优化问题。它与分治法相似,都是通过组合子问题的解来求解原问题。分治法(Divide and Conquer)将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。动态规划用于子问题重叠的情况,而子问题重叠的含义是不同的子问题有公共的子...原创 2019-04-10 15:29:46 · 474 阅读 · 0 评论 -
算法导论学习笔记10_二叉搜索树
二叉搜索树1. 二叉搜索树的定义及特点2. 二叉搜索树的建立及基本操作2.1 插入2.2 建树2.3 遍历2.4 查找2.5 删除3. 附录(代码)1. 二叉搜索树的定义及特点二叉搜索树(英语:Binary Search Tree),也称二叉查找树、有序二叉树、排序二叉树。它具有如下性质:若任意结点的左子树不为空,则左子树上所有结点的值均小于其根节点上的值。若任意结点的右子树不为空,则...原创 2019-04-06 17:39:04 · 354 阅读 · 0 评论 -
暴力求解法之简单枚举
简单枚举枚举是暴力求解法最基本最简单的一种方法,许多问题通过枚举就能找到解。当然,暴力求解法也不是无脑求解问题,通过对问题的分析减少枚举的规模可以使得算法更加的简洁和高效。例1. 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a-j恰好为数字0-9的一个排列(可以有前导0),2≤n≤792\le n\le 792≤n≤79。分析问题可知,abcde和f...原创 2018-11-25 10:29:49 · 438 阅读 · 0 评论