数据结构与算法
文章平均质量分 60
基础知识-数据结构与算法
L1AK
这个作者很懒,什么都没留下…
展开
-
数据结构与算法~字符串
字符串匹配算法我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。简单的 :BF算法和 RF算法复杂却高效:BM算法和 KMP算法BF算法Brute Force,暴力匹配算法,简单好懂,性能不高主串 和 模式串思想:我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的这种算法的最坏情况时间复杂度是 O(原创 2021-06-21 22:13:44 · 100 阅读 · 0 评论 -
数据结构与算法---LRU缓存机制
链接:https://leetcode-cn.com/problems/lru-cache/// 思路:// 1.java中LinkedHashMap,实现就是题解的一种类型,需要重写removeEldestEntry方法,初始化时将按照读取顺序设置为true// 2.通过 hashmap 和 LinkedList (双向链表) 实现// 第一种:// class LRUCache {// int capacity;// LinkedHashMap<Integer,原创 2021-03-16 14:11:23 · 93 阅读 · 0 评论 -
数据结构与算法---动态规划
动态规划1. 动态规划特点,一个模型三个特征动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。最优子结构无后效性重复子问题2. 背包问题对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢?我们把整个求解过程分为 n 个阶段,每个阶段会决策一个物品是否放到背包中。每个物品决策(放入或者不放入背包)完之后,背包中的物品的重量会有多种情况,也就是说,会达到多种原创 2021-03-09 16:17:24 · 222 阅读 · 0 评论 -
数据结构与算法汇总
复杂度分析数组链表栈队列递归排序二分查找跳表散列表哈希算法二叉树基础二叉查找树原创 2021-01-18 15:22:15 · 99 阅读 · 0 评论 -
数据结构与算法---二叉查找树
文章目录1. 二叉查找树简介2. 二叉查找树的查找操作3.二叉查找树的插入操作4. 二叉查找树的删除操作5. 二叉查找树的其他操作5.1 重复数据二叉查找树6. 二叉查找树的时间复杂度7.问题1. 二叉查找树简介最常用的一种二叉树类型,也叫二叉搜索树可以快速查找一个数据,还支持快速插入、删除一个数据二叉查找树的结构数中的任意一个节点,其左子树中的每个节点的值,都要小于这个结点的值其右子树中的每个节点值,都要大于这个节点值2. 二叉查找树的查找操作要查找的数X,先取根节点如果X原创 2020-11-03 17:47:43 · 107 阅读 · 0 评论 -
数据结构与算法---二叉树基础
树父节点: A节点是B节点的父节点子节点: B节点是A节点的子节点兄弟节点:B、C、D节点互为兄弟节点根节点: 没有父节点的节点叫做根节点叶子节点:没有子节点的节点,也叫叶节点高度和深度相反,层数在深度+1二叉树二叉树每个节点最多两个叉分别是左子节点和右子节点...原创 2020-09-29 14:18:42 · 220 阅读 · 0 评论 -
数据结构与算法---哈希算法
哈希算法将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就叫做哈希算法而映射得到的固定长度二进制值串就是哈希值。哈希算法的要求从哈希值不能反向推导出原始数据(哈希算法也叫单向哈希算法)对原始值非常敏感,即使只有一个bit不同,也会得到不同的哈希值散列冲突的概率很小哈希算法执行效率高,针对较长文本,也能很快算出哈希值哈希算法的应用安全加密唯一标识数据校验散列函数负载均衡分布式存储安全加密常用加密的哈希算法MD5(消息摘要算原创 2020-09-14 08:21:21 · 350 阅读 · 1 评论 -
数据结构与算法---散列表
散列思想散列表==>Hash Table==>哈希表==>Hash 表散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表键(关键字)key===>散列函数(哈希函数)===> 散列值(Hash值)散列表利用 数组随机访问时间复杂度为O(1)的特性。通过散列函数的键值映射为下标读取的时候,通过散列函数转化键值为下标,从数组对应位置读取数据散列函数如何构造散列函数?三个要求散列原创 2020-09-04 16:48:40 · 399 阅读 · 0 评论 -
数据结构与算法---跳表
跳表一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)Redis 中的有序集合(Sorted Set)就是用跳表来实现的。如果你有一定基础,应该知道红黑树也可以实现快速地插入、删除和查找操作。那 Redis 为什么会选择用跳表来实现有序集合呢?*这种链表加多级索引的结构,就是跳表跳表查询效率单链表查询时间复杂度,遍历 O(n)分析:假设链表原创 2020-09-04 09:58:07 · 128 阅读 · 0 评论 -
数据结构与算法---二分查找
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0二分查找时间复杂度分析O(logn)时间复杂度为O(k), n/2k = 1 ,求得k = log2n,所以时间复杂度是 O(logn)堆和二叉树操作也是O(logn)O(logn) 这种对数时间复杂度。这是一种极其高效的时间复杂度二分查找的递归和非递归实现最简单的情况===>有序数组中不存在重复元素。public in原创 2020-09-01 16:29:21 · 174 阅读 · 0 评论 -
数据结构与算法---排序
分类如何分析排序算法排序算法的执行效率最好情况、最坏情况、平均事件复杂度时间复杂度的系数–>常数–>低阶比较次数和交换次数排序算法的内存消耗原地排序 -->空间复杂度为O(1)排序算法的稳定性稳定性–>如果排序中存在值相等的元素,经过排序后相等的两个元素先后顺序没有改变稳定性的应用–>如果要实现“订单”排序。订单有两个属性,一个是下单时间,另一个是订单金额。如果我们现在有 10 万条订单数据,我们希望按照金额从小到大对订单数据排序。对于金额相同原创 2020-08-24 17:28:24 · 124 阅读 · 0 评论 -
数据结构与算法---递归
如何理解递归递归是一种应用非常广泛色算法。DFS深度优先搜索、前中后序二叉树遍历都会用到递归。递归对后续复杂算法的理解有很大帮助。递归需要满族三个条件一个问题的解可以分解成为几个子问题的解这个问题与分解后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件如何编写递归代码关键两点:写出递归公式找到终止条件递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码例子:假如这里有 n 个台阶,每次你可以原创 2020-08-19 15:42:49 · 102 阅读 · 0 评论 -
数据结构与算法---队列
如何理解队列先进先出入队:enqueue() 放一个数据到队列尾部出队:从队列头部取一个元素队列跟栈一样,也是一种操作受限的线性表数据结构。队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列 Disruptor、Linux 环形缓存,都用到了循环并发队列;Java concurrent 并发包利用 ArrayBlockingQueue 来实现公平锁等。数组实现----->顺原创 2020-08-12 15:40:52 · 151 阅读 · 0 评论 -
数据结构与算法---栈
如何理解栈后进者先出,先进者后出,这就是典型的“栈”结构。栈是一种“操作受限”的线性表,只允许在一端插入和删除数据从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。如何实现栈主要:------ 入栈 —>栈顶插入一个数据------ 出栈原创 2020-08-08 15:34:16 · 110 阅读 · 0 评论 -
数据结构与算法---链表
经典的链表应用场景,那就是 LRU 缓存淘汰算法缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。底层原创 2020-08-03 17:13:41 · 232 阅读 · 0 评论 -
数据结构与算法---数组
数组数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。1.线性表线性表 就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系2.连续的内存空间和相同的数据类型正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在原创 2020-08-03 15:21:34 · 151 阅读 · 0 评论 -
数据结构与算法---复杂度分析
一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。2.掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。三、如原创 2020-07-31 13:05:50 · 170 阅读 · 0 评论