
数据结构经典算法
JackZhangNJU
未来的路还很长
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
随机抽样算法:蓄水池抽样
先选取数据流中的前k个元素,保存在集合A中;从第j(k + 1 <= j <= n)个元素开始,每次先以概率p = k/j选择是否让第j个元素留下。若j被选中,则从A中随机选择一个元素并用该元素j替换它;否则直接淘汰该元素;重复步骤2直到结束,最后集合A中剩下的就是保证随机抽取的k个元素。伪代码:Init : a reservoir with the size: ...原创 2018-03-01 14:25:03 · 734 阅读 · 0 评论 -
数据结构:活动选择问题
活动选择问题问题是这样的,给定一系列的活动,给出可以完成的最多的活动的数量。做法直接贪心即可,按照结束时间排序,然后选择即可代码如下#include <iostream>#include <vector>#include <map>#include <unordered_map>#include <set>#incl...原创 2018-02-25 16:45:08 · 419 阅读 · 0 评论 -
数据结构:最短路径算法之Floyed算法
Floyed算法Floyed-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子路径来得到最佳路径。 注意单独一条边的路径也不一定是最佳路径。时间复杂度O(n^3),只要有存下邻接矩阵的空间,时间一般没问题,并且不必担心负权边的问题。代码如下#include &lt;iostream&gt;#include &lt;vecto...原创 2018-02-25 17:27:12 · 756 阅读 · 0 评论 -
数据结构:最短路径算法之Bellman-Ford算法
Bellman-Ford算法Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。注意本算法是可以处理负边的代码如下#include &lt;iostream&gt;#include &lt;vector&g...原创 2018-02-25 17:22:53 · 637 阅读 · 0 评论 -
数据结构:最短路径算法之Dijkstra算法
Dijkstra算法Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。dijkstra算法是解决带权重的单元最短路径问题,要求权重是非负,和Bellman-Ford算法很像,但是不一样,注意Bellman-Ford算法是可以处理负边,但是Dijkstra不可以代码如下#i...原创 2018-02-25 17:37:29 · 858 阅读 · 0 评论 -
数据结构:最大流算法Ford Fullerson 算法
最大流算法Ford Fullerson 算法主要思路如下: 1:寻找增广路径path,若path不存在迭代结束 2:找到path上的最小增长量minIncrement 3:根据minIncrement去增加流两,返回步骤1这个问题的核心就是寻找增光路径,其实就是找一条源点到终点的路径, 可以使用BFS或者DFS寻找,不可以使用dijkstra算法,因为存在权值为负数的边,使用flo...原创 2018-02-25 17:49:38 · 1092 阅读 · 1 评论 -
经典图算法:二分图匹配——匈牙利算法和KM算法 + 我觉得这个算法要背下来
二分图的概念二分图又称作二部图,是图论中的一种特殊模型。 设G=(V, E)是一个无向图。如果顶点集V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在X中,另一个在Y中,则称图G为二分图。 二分图的性质定理:当且仅当无向图G的每一个回路的次数均是偶数时,G才是一个二分图。如果无回路,相当于任一回路的次数为0,故也视为二分图。二分图的判定如果一个图是...转载 2018-04-02 10:49:41 · 639 阅读 · 0 评论 -
老鼠与毒药问题
大家应该都听说过这个老题目:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?这个问题的答案也堪称经典:把瓶子从 0 到 999 依次编号,然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子,让第二只老鼠喝掉所有二进制数右...原创 2018-04-05 13:47:36 · 1058 阅读 · 0 评论 -
字典树Trie树 + 深度优先遍历DFS
字典树是非常藏剑的数据结构,一定要学会使用。这个时一定要学会手写的代码!!!!!C++版本如下:class TrieNode {public: // Initialize your data structure here. TrieNode *child[26]; bool isWord; TrieNode() : isWord(false) ...原创 2018-05-01 19:30:26 · 3197 阅读 · 0 评论 -
动态求解中位数
题意是这样的,给你一个序列寻找中位数?其实这个可以转化为TopK问题,但是假如这个数组不断的变化呢?这个时候可以考虑使用堆来解决。这是一个很经典的问题,值得反思和学习。参考这一道题leetcode 295. Find Median from Data Stream 双优先级队列 + 中位数查找代码如下:#include <iostream>#include <...原创 2018-05-01 20:05:58 · 1111 阅读 · 0 评论 -
汉诺塔问题
汉诺塔比较经典的实现是利用递归,但也可以利用堆栈。题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从大到小排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从大到小。1、递归实现 假设只有一个盘子,那么只需实现 A->C 这个动作; 如果有两个盘子,那么需要 (1)A->B; (2)A->C; (3)B-&g...原创 2018-05-02 11:08:19 · 566 阅读 · 0 评论 -
深度优先遍历DFS总结:两种常见的结构 + 全排列
在leetcode的题中经常要使用DFS深度优先遍历来求解问题,做得多了就会发现这也是有套路的,我这里总结两个套路,以及对应的输出:代码如下:#include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2017-12-15 09:54:44 · 2538 阅读 · 0 评论 -
LeetCode上一道经典的面试题-O(1)实现LRU Cache
参考这个博客这里写链接内容 思路: 每次数据项被查询到时,都将此数据项移动到链表头部(O(1)的时间复杂度) 这样,在进行过多次查找操作后,最近被使用过的内容就向链表的头移动,而没有被使用的内容就向链表的后面移动。 当需要替换时,链表最后的位置就是最近最少被使用的数据项,我们只需要将最新的数据项放在链表头部,当Cache满时,淘汰链表最后的位置就是了。 还有这个博客简单的LRU Ca...原创 2018-08-09 15:42:12 · 848 阅读 · 0 评论 -
数据结构:Huffman哈弗曼编码长度
Huffman哈弗曼编码长度直接排序然后做即可代码如下#include <iostream>#include <vector>#include <map>#include <unordered_map>#include <set>#include <unordered_set>#include <...原创 2018-02-25 16:28:35 · 924 阅读 · 0 评论 -
数据结构:topK 第K大数
第K大数这个是借助快速排序来做的,是快排的一个变形代码如下#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;map&gt;#include &lt;unordered_map&gt;#include &lt;set&gt;#include &原创 2018-02-25 16:20:57 · 425 阅读 · 0 评论 -
数据结构:堆排序
堆排序就是构建堆,然后取出堆顶元素即可代码如下#include&lt;iostream&gt;#include&lt;ctime&gt;#include&lt;cstdlib&gt;using namespace std;void adjust(int* a,int index,int SIZE);void HeapSort(int* a,int SIZE);v...原创 2018-02-25 15:31:53 · 290 阅读 · 0 评论 -
数据结构:LISS最长递增子序列 动态规划DP
问题是什么这道题是求最长的递增序列,同样也是一个十分经典的动态规划DP解决的做法。代码如下#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;map&gt;#include &lt;unordered_map&gt;#include &lt;set&gt原创 2018-02-24 17:44:04 · 356 阅读 · 0 评论 -
数据结构:LCS最长公共子串 动态规划DP + DFS深度优先遍历
问题是什么这道题和上一道题不一样的地方就是寻找最长的子串,而不是子序列,这是一个典型的动态规划DP问题代码如下string a="qwertyuiopasdfghjkl";string b="afdstyuio555pasdf7y5i5h8";int lena=a.length();int lenb=b.length();int lcs(int i,int j){...原创 2018-02-24 17:36:27 · 431 阅读 · 0 评论 -
数据结构:LCS 最长公共子序列 动态规划DP + DFS深度优先遍历
问题是什么?就是求解两个字符串的最长的公共子序列,这是一个经典的DP动态规划问题代码如下#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;map&gt;#include &lt;unordered_map&gt;#include &lt;set&gt;原创 2018-02-24 17:32:07 · 635 阅读 · 0 评论 -
数据结构:KMP字符串匹配算法
问题是这样的:字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 如下面两个字符串:string str = "bacbababadababacambabacaddababacasdsd";string ptr = "ababaca";str有两处包含ptr,分别在str的下标10,26处包含ptr。 算法说明一般...转载 2018-02-24 17:07:46 · 470 阅读 · 0 评论 -
数据结构:整数划分问题 + DFS递归解决
问题是什么整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。如果{m1,m2,…,mi}中的最大值不超过m,即max(m1,m2,…,mi)<=m,则称它...原创 2018-02-24 20:52:57 · 721 阅读 · 0 评论 -
数据结构:二叉树前序、中序和后序遍历的非递归表示
二叉树遍历方法对于递归形式的前序、中序和后序遍历,这里就不说了,这里主要是介绍非递归形式的做法,对于二叉树的BFS层次遍历这里就不介绍了,直接使用队列做即可。前序遍历前序遍历的非递归形式很简单,直接按照stack的方式存储相关节点遍历即可。伪代码如下:使用stack做遍历,curr = rootwhile(true){ while(curr!=null)...原创 2018-02-25 10:16:27 · 557 阅读 · 0 评论 -
数据结构:最大子段和问题
最大字段和问题是这样的,在一个给定的数组中寻找子数组之和的最大值,暴力肯定是超时的,这个是个典型的动态规划DP代码详解#include &amp;lt;iostream&amp;gt;#include &amp;lt;vector&amp;gt;#include &amp;lt;map&amp;gt;#include &amp;lt;unordered_map&原创 2018-02-25 15:16:27 · 439 阅读 · 0 评论 -
数据结构:归并排序 && 逆序对统计
归并排序要注意归并排序需要一个辅助空间,别的直接递归即可代码如下#include <iostream>#include <vector>#include <map>#include <unordered_map>#include <set>#include <unordered_set>#inc...原创 2018-02-25 15:52:41 · 335 阅读 · 0 评论 -
数据结构:快速排序
快速排序思路是这样的,找到一个key然后对数组做遍历比key小的都放到key的左边,比key大的都在key的右边,然后依次递归即可代码如下#include <iostream>#include <vector>#include <map>#include <unordered_map>#include <set>...原创 2018-02-25 15:46:59 · 248 阅读 · 0 评论 -
数据结构:背包问题
背包问题对于0-1背包,也即每一个背包只能选择放入和不放入,不可以部分放入,这就是0-1的含义,这个时候直接DP即可,贪心算法可能无法得到最优解,对于其他背包问题,允许部分放入,可以使用贪心算法,正对背包的密度做一个排序即可就可以了,这个时候贪心算法得到的就是最优解,代码详解#include &lt;iostream&gt;#include &lt;vector&gt;...原创 2018-02-25 15:09:28 · 1074 阅读 · 0 评论 -
数据结构:LDP最大回文子序列
最长回文子序列这是一个典型的DP动态规划解决的问题代码如下#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;map&gt;#include &lt;unordered_map&gt;#include &lt;set&gt;#include &原创 2018-02-25 16:10:32 · 315 阅读 · 0 评论 -
数据结构:LDP最大回文子串
最长回文子串这是一个很经典的DP动态规划问题代码如下#include &amp;lt;iostream&amp;gt;#include &amp;lt;vector&amp;gt;#include &amp;lt;map&amp;gt;#include &amp;lt;unordered_map&amp;gt;#include &amp;原创 2018-02-25 16:06:45 · 289 阅读 · 0 评论 -
一般递归与尾递归
参考这个博客一般递归与尾递归原创 2018-08-15 14:15:07 · 390 阅读 · 0 评论