数据结构与算法
文章平均质量分 83
一枚-狗子
这个作者很懒,什么都没留下…
展开
-
算法刻意练习之字KMP算法
1 特点(1)KMP(2)核心:KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。2 举例分析有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?2.1 《部分匹配表》是如何产生的(1)“前缀"和"后缀”。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。(2)"部分匹配值"就是"前缀"和"后缀"原创 2020-11-16 21:59:00 · 275 阅读 · 0 评论 -
算法刻意练习之动态规划
1 特点1.1 动态规划和递归或者分治没有根本上的区别(关键看有无最优的子结构)1.共性:找到重复子问题;2.差异性:最优子结构、中途可以淘太欠优解;1.2 递归问题一含有重疊的子问题,操作重复1.记忆化搜索(自顶而下);2.动态规划(自底而上);1.3 常识一般求解最值的问题都可以朝着动态规划的方向去想。2 关键点: 1.根据最优子结构定义状态:dp[n] = bestOf(dp[n-1], dp[n-2], ...) 2.递推状态转移方程(DP方程) 一维:dp[i] = d原创 2020-11-15 17:05:06 · 258 阅读 · 0 评论 -
算法刻意练习之位运算
1 位运算1.1 为什么需要位运算1.2 位运算符1.3 算数移位与逻辑移位1.4 位运算的应用(核心)原创 2020-11-15 15:41:52 · 135 阅读 · 0 评论 -
算法刻意练习之字典树/并查集
1 字典树1.1 特点又叫Trie树、前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构1.2 对比树、二叉搜索树(1)树(2)二叉搜索树1.3 基本结构(1)基本结构(2)真实的字典树上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质。1.4 基本性质1.5 核心思想1.6 场景(1)搜索前缀匹配、字符串检索、词频统计、字符串原创 2020-11-15 11:50:39 · 145 阅读 · 0 评论 -
算法刻意练习之二分查找
1 三个前提条件1. 目标函数单调性(单调递增或者递减)。二分的数据必须是有序的,这样可以通过它的某些特征排除掉比如说 前半部分 或 后半部分;2. 存在上下界(bounded);3. 能够通过索引访问(index accessible);2 代码模板public int binarySearch(int[] array, int target) { int left = 0, right = array.length - 1, mid; while (left <= rig原创 2020-09-20 00:00:53 · 143 阅读 · 0 评论 -
算法刻意练习之DFS/BFS/双向BFS/剪枝
1 搜索1.1 特点(1)如果遍历的数据结构本身没有任何特点,就遍历所有的节点,同时保证每个点访问一次,且仅访问一次最后找到结果(2)对于节点的访问顺序不限,可分为深度优先 depth first search广度优先 breadth first search(3) 在树(图/状态集)中寻找特定结点public class TreeNode { public int val; public TreeNode left, right; public TreeNode(原创 2020-09-19 23:38:59 · 370 阅读 · 0 评论 -
算法刻意练习之堆/二叉堆
1 堆 Heap1.1 特点(1)递归 - 循环,通过函数体来进行的循环;(2)盗梦空间的梦境1.2 递归状态树(1)示例2 二叉堆 Binary Heap2.1 特点(1)递归 - 循环,通过函数体来进行的循环;(2)盗梦空间的梦境2.2 递归状态树(1)示例...原创 2020-09-14 00:15:36 · 227 阅读 · 0 评论 -
算法刻意练习之递归/分治/回溯/贪心算法
1 递归(Recursion)1.1 特点(1)递归 - 循环,通过函数体来进行的循环;(2)盗梦空间的梦境1.2 递归状态(1)示例1.4 递归思维要点(1)不要人肉进行递归(最大误区),初学者可以在纸上画出递归的状态树,慢慢熟练之后一定要抛弃这样的习惯。一定要记住:直接看函数本身开始写即可。否则,永远没办法掌握、熟练使用递归;(2)找到最近最简的方法,将其拆解成可重复解决的问题(找最近重复子问题)。原因是我们写的程序的指令,只包括 if else 、 for 和 while loop原创 2020-09-14 00:00:10 · 772 阅读 · 0 评论 -
算法刻意练习之树/二叉树/二叉搜索树/AVL树和红黑树
1 树 Tree1.1 特点(1)树 Tree:1.2 演示(1)示例2 二叉树 Binary Tree2.1 特点(1)二叉树 Binary Tree:2.2 演示(1)构造(2)示例(3)分类2.3 二叉树遍历(1)前序遍历( Pre-order ) : 根 - 左 - 右;(2)中序遍历( In-order ) : 左 - 根 - 右;(3)后序遍历( Post-order ) : 左 - 右 - 根;(4)模板3 图 Graph3.1 特点(1)树和原创 2020-09-13 00:29:45 · 275 阅读 · 0 评论 -
算法刻意练习之栈/队列/双端队列/优先队列
1 栈(Stack)1.1 特点(1)Stack:先入后出;添加、删除皆为 O(1)1.2 演示(1)主要API(2)示例2 队列(Queue)2.1 特点(1)Queue:先入先出;添加、删除皆为 O(1)2.2 演示(1)主要API(2)示例2.3 时间复杂度3 双端队列(Deque)3.1 特点(1)Stack:两端可以进出的Queue,即是Deque - double ended queue;插入和删除都是 O(1) 操作;3.2 演示(1)主要API原创 2020-08-30 11:18:47 · 223 阅读 · 0 评论 -
算法刻意练习之数组/链表/跳表
1 数组申请数组时Memory Controller在内存中给你开辟一块连续的内存地址;通过访问Memory Controller来访问数组,复杂度是O(1);可以随机访问任何一个元素;问题在于 插入 和 删除 频繁的情况下, 数组不好用;插入需要挪动元素 O(1)、O(n);删除也需要挪动元素, 然后给数组最后一位设置为空来触发GC, O(n);2 链表3 跳表...原创 2020-08-29 23:20:00 · 317 阅读 · 0 评论 -
算法刻意练习之时间/空间复杂度
1 时间复杂度:是指执行当前算法所消耗的时间1、常数阶O(1):无论代码执行了多少行,只要是没有循环等复杂结构,消耗的时间并不随着某个变量的增长而增长,那时间复杂度就都是O(1)例:int i = 1;j = 2;++i;j++;int m = i + j;2、线性阶O(n):大多数遍历例:for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化for(i=1; i<=n; ++i) { j = i; j++;}3、平方阶O(n²):双重循环4、原创 2020-08-29 23:01:57 · 285 阅读 · 0 评论 -
算法刻意练习之排序算法
1 经典算法对比2 衡量算法的优劣指标2.1 三大指标(1)时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 (2)空间复杂度:分析排序算法中需要多少辅助内存 (3)稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这...原创 2016-11-04 17:48:27 · 2716 阅读 · 0 评论 -
数据结构与算法之最小生成树-普林算法(Prim)/克鲁斯卡尔算法(Kruskal)
1 问题提出1.1 一个公司计划建立一个通信网络来连接它的一个计算机中心。可以用租用的电话线连接这些中心的任何一对。应当妊娠瘙痒哪些连接,以便保证在任何两个计算机中心之间都有通路,且网络的总成本最小?可以用下较长所示的带权图为这个问题建模,其中顶点表示计算机中心,边表示可能租用的电话线,边上的权是边所表示的电话线的月租费。通过找出一棵生成树,使得这棵树的各边的权之和为最小,就可以解决这个问题。这样的原创 2016-10-17 14:32:15 · 3944 阅读 · 0 评论 -
数据结构与算法之最短路径--迪杰斯特拉算法
1 最短路径概念1.1 定义官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径。并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径。 1.2 对比最小生成树:能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。 最短路径:是从一点出发,到达目的地的路径最小(到某顶点原创 2016-10-31 22:56:21 · 7940 阅读 · 0 评论 -
数据结构与算法之拓扑排序
1 定义和前置条件1.1 定义将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。假设我非常想学习一门机器学习的课程,但是在修这么课程之前,我们必须要学习一些基础课程,比如计算机科学概论,C语言程序设计,数据结构,算法等等。那么这个制定选修课程顺序的过程,实际上就是一个拓扑排序的过程,每门课程相当于有向图中的一个顶点,而连接顶原创 2016-11-01 14:03:09 · 5926 阅读 · 0 评论 -
数据结构与算法之递归算法
1 递归介绍1.1 原理递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).1.2 特点(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不原创 2016-11-16 14:01:56 · 968 阅读 · 0 评论 -
数据结构与算法之贪心法(背包算法&普林慕算法)
1 基本概念(1)所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 (2)贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要原创 2016-11-17 15:37:17 · 929 阅读 · 0 评论 -
数据结构与算法之分治法(棋盘覆盖算法&循环赛事日程表)
1 分治法基本思想分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。2 解题步骤分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; (3)合并,按原问题的要求,将子问原创 2016-11-17 16:07:49 · 1311 阅读 · 0 评论 -
数据结构与算法之LinkedList源码分析
1 LinkedList的基本结构 链表就和链子一样,每一环都要连接着后边的一环和前边的一环,这样,当我们需要找这根链子的某一环的时候,只要我们能找到链子的任意一环,都可以找到我们需要的那一环。如下图: LinkedList在jdk1.6中的结构: LinkedList在jdk1.7中的结构: 图片来源于:Java进阶之—-LinkedList源码分析 对比一下,知道区原创 2017-12-07 00:34:20 · 683 阅读 · 0 评论 -
数据结构与算法之二叉树+遍历+哈夫曼树
1 概念1.1 二叉树概念 二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。1.2 二叉树分类(1) 二叉树:二叉树(binary tree)是一棵树是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的。 (2) 完全二叉树:若设二叉...原创 2016-10-28 14:50:18 · 3543 阅读 · 0 评论 -
数据结构与算法之二叉搜索树插入、查询与删除
1 二叉搜索树(BSTree)的概念 二叉搜索树又被称为二叉排序树,那么它本身也是一棵二叉树,那么满足以下性质的二叉树就是二叉搜索树,如图:若左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则它的右子树上所有节点的值都大于根节点的值;它的左右子树也要分别是二叉搜索树。 2 二叉搜索树的插入2.1 搜索 插入之前我们先来说说它的搜索...原创 2016-10-28 15:11:45 · 6695 阅读 · 6 评论 -
算法刻意练习之Map系列
1 概述 图片来源于:Java集合框架.mdJava Collection Framework源码剖析2 Collection2.1 List(1)概念 AbstractList 是一个抽象类,它实现List接口并继承于 AbstractCollection 。对于“按顺序遍历访问元素”的需求,使用List的Iterator 即可以做到,抽象类Abstract...原创 2017-12-07 00:18:37 · 967 阅读 · 0 评论 -
数据结构与算法之栈的应用“逆波兰表达式法”
1 基本信息1.1 表达式逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:正常的表达式 逆波兰表达式a+b ---> a,b,+a+(b-c) ---> a,b,c,-,+a+(b-c)*d ---> a,b,c,-,d,*,+a+d*(b-c)--->a,d,b,c,-,*,+原创 2016-10-15 16:34:12 · 1179 阅读 · 0 评论