![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法分析
文章平均质量分 93
从流域到海域
此人不懒,但他除了干货什么都没有留下。
展开
-
N皇后问题如何写出简洁的最优解 - 回溯法及LeetCode应用详解
backtracking(回溯),是LeetCode上比较常见的一类典型题。本博文所有的代码均可在https://github.com/Hongze-Wang/LeetCode_Javahttps://github.com/Hongze-Wang/LeetCode_Python中找到,欢迎star。回溯法之所以称之为回溯法,是因为它其实是DFS/BFS+回溯操作进行的穷举。回溯和DFS/BFS的区别在于回溯操作。也有人把回溯法BFS/DFS,这是不太准确的,回溯法是特殊的DFS或者BFS,因为.原创 2021-01-11 19:17:51 · 550 阅读 · 0 评论 -
贪心算法及Jump Game系列题详解
贪心算法属于比较难的算法,一般用于求解最优解或者极限情况下判断可能性。贪心和动态规划的区别在于,贪心算法的解题过程中会展现出最优子结构,子问题的最优解构成了全局的最优解,而动态规划则是考虑所有子问题,针对这些子结构求解,从中选取出最优解。贪心算法有两个重要组成部分:贪心策略最优子结构贪心策略的选取将对贪心算法能否得到最优解起到了决定性的作用。最优子结构指的是,大问题分解成小问题时,使用拟定好的贪心策略一样能得到小问题的最优解。详见Greedy Analysis Strategies,摘自.原创 2021-01-06 17:16:59 · 461 阅读 · 0 评论 -
单调队列及其LeetCode应用详解
队列(Queue)是另一种操作受限的线性表,只允许元素从队列的一端进,另一端出,因为具有先进先出(FIFO)的特性。单调队列(Monotonic Queue)是一种特殊的队列,它首先是一个队列,其次队列内部的元素单调递增(递增队列)或者单调递减(递减队列)。注意:单调队列是基于双端队列(Deque)实现的。单调队列在算法中的应用在于可以求区间内的最大或者最小值。// 递增队列for(int i=0; i<nums.length; i++) { while(!deque.isEmpty()原创 2020-12-12 21:25:38 · 493 阅读 · 0 评论 -
单调栈详解及其LeetCode应用详解
**栈(Stack)是一种操作受限的线性表,只允许一端进,同一端出,因而具有后进先出(LIFO)**的特性。原创 2020-12-12 19:22:10 · 325 阅读 · 2 评论 -
二叉树的前序、中序、后序遍历 非递归解法
数据结构二叉树遍历基础,递归解法在很早之前的博客就以C语言的形式总结了,这篇博文聚焦非递归解法。二叉树的前序、中序、后序遍历都可以借助栈来实现,因为递归本质也是靠栈来实现的,中序遍历还有一种比较难想的镜像法。前序遍历 leetcode 144. Binary Tree Preorder Traversal直接使用栈,入栈顺序先右子树在左子树。class Solution { public List<Integer> preorderTraversal(TreeNode roo.原创 2020-11-06 13:46:24 · 370 阅读 · 2 评论 -
树状数组及其LeetCode应用详解
树状数组又称二叉索引树(Binary Indexed Tree),以其发明者又命名为Fenwick树,最早由Peter.M.Fenwick以A New Data Structure for Cumulative Frequence Tables作为论文题目发表在期刊Software Practice and Experience(目前SCI 三区)。如题,是用来计算数据压缩时的累计频率(cumulative frequency)的计算问题,现在常用于高效计算数列的前缀和,区间和。-百度百科。树状数组.原创 2020-10-31 10:39:41 · 637 阅读 · 1 评论 -
Redis常用数据类型及其对应的底层数据结构
Redis数据库Redis是一种键值(Key-Value)数据库。相较于MySQL之类的关系型数据库,Redis是一种非关系型数据库。Redis存储的数据只包含键和值两部分,只能通过键来查询值。这样简单的存储结构,能让Redis的读写效率非常高(HashMap读写效率都是O(1))。除此之外,Redis主要作为内存型数据库来使用。也即是说,Redis的数据存储在内存中。尽管如此,它也支持通过持久化机制将内存中的数据保存在硬盘中。作为一种键值数据库,Redis键的数据类型一般是字符串,值的类型则有很多中原创 2020-10-08 22:03:38 · 1956 阅读 · 0 评论 -
Bellman-Ford algorithm
Bellman-Ford algorithmBellman-Ford algorithm用于在有负权值的图上求最短路径,是动态规划的一个应用,所以你需要阅读之前的一片介绍动态规划的博文Dynamic Programming,抱歉,期末复习中,没有空闲翻译成中文。Pseudocoded[s] &amp;amp;lt;- 0for each v ∈ V-{s} do d[v] &amp;amp;lt;- ∞f...原创 2019-01-11 14:47:45 · 352 阅读 · 0 评论 -
Dynamic Programming
Compare to Greedy and Divide_and_conquerGreedy.Build up a solution incrementally, myopically optimizing some local criterion.Divide-and-conquer.Break up a problem into sub-problem into sub-problem...原创 2019-01-10 21:36:02 · 697 阅读 · 0 评论 -
Divide and Conquer
Divide and Conquer: OverviewDivide and conquerBreak up problem into several partsSolve each part recursivelyCombine solutions to sub-problems into overall solutionMost common usageBreak up pr...原创 2019-01-10 21:23:41 · 373 阅读 · 0 评论 -
Greedy Analysis Strategies
Greedy Analysis StrategiesGreedy algorithm stays ahead.Show that after each step of the greedy algorithm, its solution is at least as good as other algorithm’s.Ex.Interval schedulingStructural...原创 2019-01-10 13:28:00 · 418 阅读 · 0 评论 -
NP-Completeness
NP-CompletenessThe “First” NP-Complete problemTheorem. CIRCUIT-SAT is NP-complete. [Cook 1971, Levin 1973]Pf.(sketch)Any algorithm that takes a fixed number of bits n as input and produces a ye...原创 2018-12-16 14:54:43 · 631 阅读 · 0 评论 -
Dynamic Programming中的 Bellman-Ford算法
Shortest Paths with negative weightsDynamic ProgrammingPseudocode// Shortest paths with negative edgesShortest-Path(G, t) { foreach node v ∈ V M[0, v] <- infinity ...原创 2018-11-20 16:36:00 · 561 阅读 · 0 评论 -
Kosaraju算法
SCCSCC = strong connected component.即强连通分量。In the mathematical theory of directed graphs, a graph is said to be strongly connected or diconnected if every vertex is reachable from every other vert...原创 2018-11-20 16:25:11 · 1206 阅读 · 0 评论 -
校招必考:根据二叉树遍历序列确定二叉树
根据二叉树的前序遍历和中序遍历求其后序遍历或者根据二叉树的后序遍历和中序遍历求其前序遍历是腾讯等校招的必考题,下面我们就来分析一下解题思路。 这道题本质上是要我们根据二叉树遍历序列确定二叉树,只要二叉树确定了,求它的任何遍历序列都是易如反掌的。理论基础: 由二叉树的先序遍历序列(PreorderTraverse)和中序遍历序列(InorderTraverse)或由其后序遍历序列(Posto原创 2017-04-26 23:32:06 · 4302 阅读 · 0 评论 -
《数据结构》 队列(Queue)操作代码集合
队列基本操作代码集合,来自《数据结构-用C语言描述》(第二版) 高教社 队列是受限制的链表或顺序表(只能从队首取结点,先进先出FIFO),相关操作可以查看之前的博客。/*链队列*/typedef struct { QueueElemType data; struct Node *next;} LinkQueueNode;typedef struct { LinkQu原创 2016-03-30 17:51:50 · 2929 阅读 · 1 评论 -
《数据结构》 顺序表常用操作代码集合
Ps:每段代码中,添加了署名Solo的是博主自己写的,其余来自课本或者老师。//定义线性表的存储结构#define MAXSIZE 100typedef struct{ ElemType elem[MAXSIZE]; //ElemType自定义 int last;} SeqList;//线性表按查找内容运算 Locate(L,e)函数int Locate(SeqList原创 2016-03-23 18:07:20 · 2825 阅读 · 1 评论 -
《数据结构》 单链表常用操作代码集合
Ps:每段代码中,添加了Solo署名的是博主自己写的,其余来自课本或老师。//单链表存储结构typedef struct Node //结点类型定义{ ElemType data; struct Node *next; //LinkList为结构体指针类型} Node, *LinkList;//初始化单链表InitList(LinkList *L){ *L = (原创 2016-03-23 18:12:53 · 1555 阅读 · 0 评论 -
《数据结构》 循环链表和双向链表常用操作代码集合
Ps:每段代码中,添加了署名Solo的代码为博主本人所写,其余来自课本或者老师。大量操作等同于单链表。重复的操作不再贴出,可以查看之前的博文。循环链表//结构体部分同单链表 略//初始化循环链表InitCLinkList(LinkList *CL){ *CL = (LinkList)malloc(sizeof(Node)); //建立循环链表的指针 (*CL)->next原创 2016-03-23 21:00:21 · 985 阅读 · 0 评论 -
《数据结构》 定长顺序串常用操作代码集合
代码来自老师上课使用的ppt或者课本/*定长顺序串*/#define MAXLEN 40typedef struct { char ch[MAXLEN]; int len;} SString/*插入函数*//*在串S中下标为pos的字符之前插入串t*/int StrInsert(SString *S, int pos, SString t) { int i;原创 2016-04-06 20:49:44 · 1009 阅读 · 0 评论 -
二叉排序树(BSTree)关于查找算法结合
/*基于树的顺序查找法*//*二叉排序树的存储结构*/typedef struct node { KeyType key; /*关键字的值*/ struct node *lchild, *rchild; /*左右指针*/} NSTNode, *BSTree;/*二叉排序树插入递归算法*/void InsertBST(BSTr原创 2016-05-19 21:06:14 · 1490 阅读 · 2 评论 -
图(Graph)的常用代码集合
图的相关概念请查阅离散数学图这一章或者数据结构中对图的介绍。代码来自课本。/*Graph存储结构*///邻接矩阵表示法#define MAX_VERTEX_NUM 20 /*最多顶点个数*/#define INFINITY 32768 /*表示极大值,即∞*//*图的种类:DG表示有向图,DN表示有向网,DUG表示无向图,UDN表示无向网*/typedef enum {DG原创 2016-05-12 17:48:56 · 3680 阅读 · 0 评论 -
二叉树的性质和常用操作代码集合
二叉树的性质和常用操作代码集合性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1原创 2016-04-20 19:37:09 · 2272 阅读 · 0 评论 -
普利姆(prim)算法和克鲁斯卡尔(kruskal)算法
连通网的最小生成树算法: 1.普里姆算法——”加点法”。 假设N=(V,{E})是连通网,TE为最小生成树的边集合。 (1)初始U={u0}(u0∈V),TE=φ; (2)在所有u∈U, v∈V-U的边(u,v)中选择一条代价最小的边(u0,v0)并入集合TE,同时将v0并入U;(并修正U-V中各顶点到U的最短边信息) (3)重复步骤(2),直到U=V为止。 此时,TE中含有n-原创 2016-05-18 17:36:53 · 4313 阅读 · 0 评论 -
迪杰斯特拉(Dijkstra)算法求图中最短路径
迪杰斯特拉(Dijkstra )算法: 对于图G=(V,E),将图的顶点分为两组: 顶点集S:已求出的最短路径的顶点集合(初始为{v0}); 顶点集V-S:尚未求出最短路径的顶点集合(初始为V-{v0} )。 算法按最短路径长度的递增顺序逐个将V-S的顶点加入S中,直到所有顶点均被加入S为止。 算法需借助辅助数组dist[N], dist[i]表示目前已经找到的、从开始点v0到终点v原创 2016-05-19 00:08:26 · 4737 阅读 · 0 评论 -
弗洛伊德(Floyd)算法
弗洛伊德(Floyd)算法求图中两点的最短路径 佛罗依德(Floyd )算法的基本思想: 设图g用邻接矩阵法表示,求图g中任意一对顶点vi与vj间的的最短路径。 (-1)将vi到vj的最短的路径长度初始化为g.arcs[i][j].adj,进行如下n次比较和修正: (0)在vi与vj间加入顶点v0,比较(vi, v0, vj )和(vi, vj)的路径的长度,取其中较短的路径作为vi到vj原创 2016-05-19 11:41:17 · 1042 阅读 · 0 评论 -
《数据结构》 栈代码操作集合
栈的基本操作代码,来自《数据结构-用C语言描述》(第二版)高教社 栈的数据结构相当于受限制(只能从栈顶取元素)的顺序表或单链表,可以参考之前的博客。/*以下为顺序栈*/#define Stack_Size 50 /*设栈中元素为50*/typedef struct { StackElemType elem[Stack_Size]; int top; //用来存放栈原创 2016-03-30 16:33:50 · 646 阅读 · 0 评论