
数据结构与算法
文章平均质量分 83
数据结构系统性的学习笔记和其他相关记录
hezebin
https://hezebin.com
展开
-
LRU 算法
上述我们的容器最大容量的单位是键值对的个数,这是不太合理的,因为实际中我们应该限制的是缓存占用大小,因此可以将最大限制改成byte为单位,而且需要对淘汰算法进行优化,这时候我们可能超出容量后,需要淘汰的不止是一个缓存,可以是多个,直到当前已用内存小于最大内存。这样做的目的是更好地适应特定访问模式,对于某些场景可以提供更好的性能。那么该数据结构就是当存储队列到达上限时,清除的是最久未被访问的节点,该节点一般认为是最可能无用的节点,保留下来的是最近都有使用过的节点,因此可以实现对"有用"数据的最大程度保留。转载 2023-08-08 16:23:44 · 277 阅读 · 0 评论 -
窗口滑动算法
文章目录1.求无重复字符的最长子串1.1 思路分析1.2 算法实现2.求最小覆盖子串1.求无重复字符的最长子串LeetCode题目 3. 无重复字符的最长子串 :给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"原创 2020-08-14 21:23:27 · 516 阅读 · 0 评论 -
动态规划算法
文章目录1.动态规划解决背包问题2.动态规划求最大回文子串2.1 思路分析2.2 算法实现第1步:定义状态第2步:思考状态转移方程第3步:考虑初始化第4步:考虑输出第5步:考虑优化空间2.3 参考代码1.动态规划解决背包问题详情参考另一篇博文: 14.常用10大算法-3.动态规划算法。通过该文可以先了解动态规划算法的基本思想,在此基础上更容易理解下文题目的解题思路。2.动态规划求最大回文子串LeetCode题目 5. 最长回文子串:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s原创 2020-08-14 21:08:07 · 263 阅读 · 0 评论 -
14.常用10大算法
目录1.二分查找算法(非递归)2.分治算法3.动态规划算法4.KMP算法5.贪心算法6.普利姆算法7.克鲁斯卡尔算法8.迪杰斯特拉算法9.弗洛伊德算法10.马踏棋盘算法1.二分查找算法(非递归)二分查找算法介绍:二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找。代码实现(JAVA):package algorithm;public class BinarySearch { public static void main(St原创 2020-07-21 16:59:59 · 748 阅读 · 0 评论 -
13.图
目录1.图的基本介绍2.图的存储方式 2.1 顺序存储结构 2.2 邻接表存储结构3.图的遍历(搜索)算法 3.1 深度优先搜索(DFS) 3.2 广度优先搜索(BFS) 3.3 图的遍历总结1.图的基本介绍图的介绍:数据之间的关系有 3 种,分别是 “一对一”、“一对多” 和 “多对多”,前两种关系的数据可分别用线性表和树结构存储。而存储具有"多对多"逻辑关系数据的结构称为——图存储结构。例如上图1所示为存储 V1、V2、V3、V4 的图结构,从图中可以清楚的看出数据之间具有原创 2020-07-14 21:26:28 · 205 阅读 · 0 评论 -
12.多路查找树
目录1. 多叉树2. 2-3树3. B树4. B树1. 多叉树二叉树的问题分析:二叉树的操作效率较高,但在大规模数据存储中,会存在如下问题:1.构建的二叉树的节点数量会非常多,二叉树的高度过大,这将会导致查找甚至退化成节点内部的线性查找了。2.并且二叉树的高度过大,会造成I/O操作过于频繁(海量数据一般存储在数据库或文件系统中),进而导致查找效率低下。多叉树介绍:由于上述二叉树存在的问题,所以在大规模数据存储的时候,需要通过降低树的高度来提高效率。在二叉树中,每个节点只有1个数原创 2020-07-13 15:19:25 · 294 阅读 · 0 评论 -
11.树结构的应用
目录1.堆排序2.赫夫曼树3.赫夫曼编码4.二叉排序树5.平衡二叉树(AVL树)1.堆排序堆的介绍:堆是具有以下性质的完全二叉树:1.每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆。注意 : 没有要求节点的左孩子的值和右孩子的值的大小关系。采用顺序存储后为:2.每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。堆排序介绍:堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳原创 2020-07-03 00:36:58 · 645 阅读 · 0 评论 -
10.树结构的基础
目录1.树的介绍2.二叉树3.满二叉树4.完全二叉树5.二叉树的遍历算法6.二叉树的顺序存储结构7.二叉树的链式存储结构8.线索二叉树1.树的介绍树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。图中就是使用树结构存储的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图。对于数据 A 来说,和数据 B、C、D 有关系;对于数据 B 来说,和 E、F 有关系。这就是“一对多”的关系。整个存储形状类似于实际生活中倒着的树,所以称这种存储结构为原创 2020-07-02 21:54:49 · 658 阅读 · 0 评论 -
9.哈希表
目录1.哈希表的基本介绍2.哈希表的设计思想3.哈希函数的设计4.哈希表大小的确定5.冲突的解决6.哈希表的实现7.哈希表总结1.哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过一个计算键值的函数,将所需查询的数据映射到表中一个位置来方便访问,这加快了查找速度。这个映射函数称做散列函数,又叫哈希函数,存放数据的数组称做散列表(哈希表)。因此它同数组、链表以及二叉排序树等相比较有很明显的区别原创 2020-06-30 14:08:21 · 373 阅读 · 0 评论 -
8.查找算法
1.查找算法介绍在java中,常用的查找有四种:(1) 顺序(线性)查找(2) 二分查找/折半查找(3) 插值查找(4) 斐波那契查找2.线性查找线性查找非常简单,逐一比对,发现相同的值,则返回下标。代码实现:package search;public class SequenceSearch { public static void main(String[] args) { int[] array = {1, 9, 11, -1, 34, 89}原创 2020-06-28 17:55:17 · 241 阅读 · 0 评论 -
7.排序算法
1.排序算法的介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。2.排序的分类(1) 内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。(2) 外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。(3)常见的排序算法分类如下图:下述排序算法默认均将无序序列排序为升序。3.冒泡排序冒泡排序(Bubble Sorting)的基本思想是:通过对 待排序 序列从前向后(从下标较小的元素开始),依原创 2020-06-27 00:23:17 · 309 阅读 · 0 评论 -
6.算法的复杂度
1.算法的时间复杂度1.1 度量一个程序(算法)执行时间的两种方法:(1)事后统计的方法:这种方法可行, 但是有两个问题。一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。(2)事前估算的方法:通过分析某个算法的时间复杂度来判断哪个算法更优。1.2 时间频度的概念:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多原创 2020-06-24 23:40:04 · 451 阅读 · 0 评论 -
5.递归
1.递归的概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。例如下面的函数就是递归调用,传参4时的打印结果为2 3 4:public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println(n);}2.递归需要遵守的重要规则1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间);2.方法的局部变量是独原创 2020-06-24 15:54:59 · 311 阅读 · 0 评论 -
4.栈
1.栈的一个实际需求请问计算机底层是如何运算得到结果的?计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串)。2.栈的介绍1.栈(Stack)是一个先入后出(FILO-First In Last Out)的有序列表。2.栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。3.根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删原创 2020-06-21 23:59:07 · 226 阅读 · 0 评论 -
3.链表
链表1.单链表链表是有序的列表,但是它在内存中是存储如下的:1.链表是以节点的方式来存储,是链式存储2.每个节点包含两个域:data 域、 next 域:指向下一个节点3.链表的各个节点不一定是连续存储4.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单链表(带头结点) 逻辑结构示意图:直接尾部添加节点示意图,请注意辅助节点temp位置,下同:按照升序添加节点示意图:删除结点示意图(找到需要删除结点前一个节点temp):被删除的节点,将不会有其它引用指向它原创 2020-06-20 00:17:09 · 301 阅读 · 1 评论 -
2.队列
队列1.队列介绍1.队列是一个有序列表,可以用数组或是链表来实现。2.在队尾插入元素,在队首删除元素。3.遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出2.顺序队列顺序队列的实现(java):// 使用数组模拟队列-编写一个 ArrayQueue 类class ArrayQueue { private int maxSize; // 表示数组的最大容量 private int front; // 队列头 private int rear原创 2020-06-18 16:06:42 · 192 阅读 · 0 评论 -
1.稀疏矩阵
稀疏矩阵当一个矩阵中大部分元素为0时(如棋盘),则称之为稀疏矩阵,一般情况下稀疏矩阵非零元素的总数比上矩阵所有元素总数的值小于等于0.05,该比值称为矩阵的稠密度。对于稀疏矩阵而言,重复的0非常多,使用同样的内存来存储这个矩阵显然是对内存的浪费,因此在存储稀疏矩阵时非常有必要对其压缩,我们完全可以将矩阵中所有的0元素或不相关元素剔除:1.COO三元组形式存储1.记录矩阵一共有几行几列,有多少个不同的值;2.仅存储非0数据的行、列、值。数据结构(java):public class COO原创 2020-06-17 20:26:11 · 2173 阅读 · 0 评论