Data Structure and Algorithm
Data structure and algorithm
一只工程狮
对于深度学习较为感兴趣,研究范围包括但不限于图像分类、目标检测、图像分割、视频异常检测、动作识别、AI部署与优化加速等
展开
-
全排列问题的细节讲解(递归:DFS、非递归实现)
全排列问题的细节讲解(递归:DFS、非递归实现)在这里插入代码片package Permutation;/** * @Description Full Permutation Algorithm * @author zhuwei * @Email zhu_wei2019@163.com * @version v1.0 */public class FullPermutaion { public static void main(String[] args) { int[] n原创 2020-12-24 10:10:40 · 995 阅读 · 2 评论 -
剪枝思想
剪枝思想一、剪枝策略的寻觅的方法微观方法:从问题本身动身,发现剪枝条件宏观方法:从整体动身,发现剪枝条件。注意提高效力,这是关键,最重要的。总之,剪枝策略,属于算法优化范畴;通常利用在DFS 和 BFS 搜索算法中;剪枝策略就是寻觅过滤条件,提早减少没必要要的搜索路径。二、剪枝算法(算法优化)1、简介在搜索算法中优化中,剪枝,就是通过某种判断,避免一些没必要要的遍历进程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。利用剪枝优化的核心问题是设计剪枝判断方法,即肯定哪些枝条应当舍弃原创 2020-12-07 10:59:16 · 641 阅读 · 1 评论 -
如何使用递归?
如何使用递归?「递归」这个词语我们经常在很多地方看到,在很多地方用到。但是初学递归时可能会有些难以理解。本文从一些易懂、常见的例子中介绍一下「递归」。当我们看到「递归」时,不要把它看成一个词语,而是分开看成两个字「递」和「归」。举一个生活中的例子 有几个人在柜台前排队,现在甲想知道他排到第几个了,所以他会问排在他前面的乙是第几个,然后加1即可。 但是乙也不知道他是第几个,所以乙会问排在他前面的丙是第几个,然后加1即可。 这样一直向前问…… 直到问到戊了,此时戊就站在柜台前,所以戊知道转载 2020-12-03 10:37:45 · 1726 阅读 · 0 评论 -
计算二叉树的深度(高度):深度优先遍历(DFS递归)、广度优先遍历(BFS,层次遍历)
计算二叉树的深度(高度):深度优先遍历(DFS递归实现)、广度优先遍历(BFS,层次遍历)先简要概述两种遍历的优缺点:深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作,运行速度慢。广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作,运行速度快。通常深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。广度优先搜索算原创 2020-11-30 15:14:59 · 2872 阅读 · 2 评论 -
图的两种存储方式:邻接表、邻接矩阵
图的两种存储方式:邻接表、邻接矩阵图的存储结构主要分两种,一种是邻接矩阵,一种是邻接表。1.邻接矩阵图的邻接矩阵存储方式是用两个数组来表示图:一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。设图G有n个顶点,则邻接矩阵是一个 n∗nn*nn∗n 的方阵,定义为:arg[i][j]={1,若(vi,vj)∈E<vi,vj>∈E0,若(vi,vj)∉E<vi,vj>∉Earg[i][j]=\left\{\begin{aligned}1 ,原创 2020-11-23 10:38:14 · 6317 阅读 · 0 评论 -
快速幂求余算法
快速幂求余算法为了防止在快速幂乘中导致溢出,我们往往需要对计算结果取余,下面介绍在快速幂算法过程以及如何防止溢出。公式:aba^bab modmodmod cccres = 1;for(int i=1; i <= b; i++){ res = res*a;}res = res % c;改进一:前提: aba^bab modmodmod ccc = (a mod c)b(a \ mod \ c)^b(a mod c)b原创 2020-11-03 14:56:14 · 2196 阅读 · 1 评论 -
确定有限自动机DFA&非确定有限自动机NFA
确定有限自动机DFA&非确定有限自动机NFAPart 1_自动机介绍:有穷自动机(finite state automata)是一个识别器,它对每个输入的字符做识别和判断,以确定其能到达的最终状态或状态集和路径,有穷自动机分为两类,即不确定的有穷自动机NFA和确定的有穷自动机DFA[1].例子1:红绿灯系统: G(绿灯亮了的状态);R(红灯亮的状态);Y(黄灯亮的状态)例子2:零售机(vending machine)。它接受五角和一块的硬币,但是要至少积累到3元才能按下选择,并且只有作出选择才会执转载 2020-10-27 16:12:13 · 6665 阅读 · 1 评论 -
哈希表概述
哈希表概述本文对哈希表进行大体上的概述和分析,如果你之前没有学过相关知识,可以参考哈希表以及哈希表这两篇文章,有详细的例子介绍,本文只提供快速回忆和浏览。一、什么是哈希表?哈希表本质就是支持随机查询的数组,即可以根据关键字快速查找值的一种数组,也就是散列表。哈希表实现的关键就是哈希函数,所谓的哈希函数是一种建立查询表的方法,它将 key 值映射为一种索引号的方法。二、为什么要使用哈希表?我们可以利用 key 关键字,就可以快速的找到我们想要的 value 值,而不需要循环遍历比较整个数组。例原创 2020-10-27 14:36:58 · 325 阅读 · 0 评论 -
二分查找算法细节详解
二分查找算法细节详解 我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky...这句话可以这样理解:思路很简单,细节是魔鬼。本文就来探究几个最常用的二分查找场景:寻找一个数转载 2020-10-09 10:18:27 · 392 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。为防止溢出,答案需要取模 1e9+7(1000000007)。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21示例 3:输入:n = 0输出:1本题和斐波那契函数相似,思路一致,可以使用动态规划的思想来解题,具体可以参考斐波那契题解下面只给出C++的写法,python写法可以参考以上链接:c原创 2020-09-30 10:09:50 · 226 阅读 · 0 评论 -
二维数组中的查找
二维数组中的查找题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16,22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]给定 target = 5,返回tr原创 2020-09-29 13:54:38 · 412 阅读 · 0 评论 -
斐波那契数列
斐波那契数列题目说明:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),防止内存溢出示例 1:输入:n = 2 输出:1示例 2:输入:n = 5 输出:5思路一:递归调用这种方法的时原创 2020-09-28 14:02:49 · 737 阅读 · 0 评论 -
算法-动态规划 Dynamic Programming
算法-动态规划 Dynamic Programming前言最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic Programming)算法的题目很多。相对于我来说,算法里面遇到的问题里面感觉最难的也就是动态规划(Dynamic Programming)算法了,于是花了好长时间,查找了相关的文献和资料准备彻底的理解动态规划(Dynamic Programming)算法。一是帮助自己总结知识点,二是也能够帮助他人更好的理解这个算法。后面的参考文献只是我看到的文献的一部分。动态规划算法的转载 2020-06-16 20:41:02 · 246 阅读 · 0 评论