算法
文章平均质量分 93
遇见更好的自己、
勤奋是改变命运的唯一途径
展开
-
算法之拓扑关系
如何确定代码源文件的编译依赖关系?我们知道,一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候,需要按照依赖关系,依次编译每个源文件。比如,A.cpp依赖B.cpp,那在编译的时候,编译器需要先编译B.cpp,才能编译A.cpp。编译器通过分析源文件或者程序员事先写好的编译配置文件(比如Makefile文件),来获取这种局部的依赖关系。算法解析这个问题的解决思路与图这种数据结构的一个经典算法拓扑排序算法有关。那什么是拓扑排序呢?原创 2023-01-11 18:53:52 · 617 阅读 · 0 评论 -
算法之动态规划实战
利用Trie树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。如何量化两个字符串的相似度?如何量化两个字符串之间的相似程度呢?有一个非常著名的量化方法,那就是编辑距离(顾名思义,编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编辑距离越大,说明两个字符串的相似程度越小;原创 2023-01-10 18:53:01 · 379 阅读 · 0 评论 -
算法之动态规划理论
一个模型三个特征。其中,一个模型指的是,问题可以抽象成分阶段决策最优解模型。三个特征指的是最优子结构、无后效性和重复子问题。状态转移表法解题思路大致可以概括为,回溯算法实现定义状态画递归树找重复子问题画状态转移表根据递推关系填表将填表过程翻译成代码。状态转移方程法的大致思路可以概括为,找最优子结构写状态转移方程将状态转移方程翻译成代码。贪心、回溯、动态规划可以解决的问题模型类似,都可以抽象成多阶段决策最优解模型。原创 2023-01-09 18:48:07 · 377 阅读 · 0 评论 -
算法之初始动态规划
大部分动态规划能解决的问题,都可以通过回溯算法来解决,只不过回溯算法解决起来效率比较低,时间复杂度是指数级的。动态规划算法,在执行效率方面,要高很多。尽管执行效率提高了,但是动态规划的空间复杂度也提高了,所以,很多时候,我们会说,动态规划是一种空间换时间的算法思想。贪心、分治、回溯、动态规划,这四个算法思想有关的理论知识,大部分都是后验性的,也就是说,在解决问题的过程中,我们往往是先想到如何用某个算法思想解决问题,然后才用算法理论知识,去验证这个算法思想解决问题的正确性。参考资料。原创 2023-01-05 18:49:38 · 913 阅读 · 2 评论 -
算法之回溯算法
回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。尽管回溯算法的原理非常简单,但是却可以解决很多问题,比如我们开头提到的深度优先搜索、八皇后、0-1背包问题、图的着色、旅行商问题、数独、全排列、正则表达式匹配等等。如果感兴趣的话,你可以自己搜索研究一下,最好还能用代码实现一下。原创 2023-01-04 18:26:17 · 465 阅读 · 0 评论 -
算法之分治算法
不过,这里有一个点要注意,就是数据的存储与计算所在的机器是同一个或者在网络中靠的很近(比如一个局域网内,数据存取速度很快),否则就会因为数据访问的速度,导致整个处理过程不但不会变快,反而有可能变慢。原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别,等我们讲到动态规划的时候,会详细对比这两种算法;个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。的订单排序,我们就可以先扫描一遍订单,根据订单的金额,将。原创 2022-12-23 15:51:49 · 100 阅读 · 0 评论 -
算法之贪心算法
贪心算法有很多经典的应用,比如霍夫曼编码()、Prim和Kruskal最小生成树算法、还有Dijkstra单源最短路径算法。原创 2022-12-23 14:53:08 · 812 阅读 · 0 评论 -
算法之AC自动机
很多支持用户发表文本内容的网站,比如BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。我们前面讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站来说,比如淘宝,用户每天的评论数有几亿、甚至几十亿。原创 2022-12-22 16:16:28 · 455 阅读 · 0 评论 -
数据结构之Trie树
搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进去,一定程度上节省了我们的搜索时间。像Google、百度这样的搜索引擎,它们的关键词提示功能非常全面和精准,肯定做了很多优化,但万变不离其宗,底层最基本的原理就是今天要讲的这种数据结构:Trie树。树,也叫“字典树”。顾名思义,它是一个树形结构。原创 2022-12-22 15:34:36 · 522 阅读 · 0 评论 -
算法之字符串匹配一
BF 算法是最简单、粗暴的字符串匹配算法,它的实现思路是,拿模式串与主串中是所有子串匹配,看是否有能匹配的子串。所以,时间复杂度也比较高,是 O(n*m),n、m 表示主串和模式串的长度。不过,在实际的软件开发中,因为这种算法实现简单,对于处理小规模的字符串匹配很好用。RK 算法是借助哈希算法对 BF 算法进行改造,即对每个子串分别求哈希值,然后拿子串的哈希值与模式串的哈希值比较,减少了比较的时间。所以,理想情况下,RK 算法的时间复杂度是 O(n),跟 BF 算法相比,效率提高了很多。原创 2022-10-27 19:03:18 · 304 阅读 · 0 评论 -
算法之深度优先、广度优先算法
图这种数据结构经常用于表示一个社交网络,在社交网络中有一个六度分割理论,简单来说就是你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个不认识的人。原创 2022-10-26 18:54:43 · 1164 阅读 · 0 评论 -
数据结构之图
关于图,你需要理解这样几个概念:无向图、有向图、带权图、顶点、边、度、入度、出度。除此之外,我们还学习了图的两个主要的存储方式:邻接矩阵和邻接表。邻接矩阵存储方法的缺点是比较浪费空间,但是优点是查询效率高,而且方便矩阵运算。邻接表存储方法中每个顶点都对应一个链表,存储与其相连接的其他顶点。尽管邻接表的存储方式比较节省存储空间,但链表不方便查找,所以查询效率没有邻接矩阵存储方式高。针对这个问题,邻接表还有改进升级版,即将链表换成更加高效的动态数据结构,比如平衡二叉查找树、跳表、散列表等。原创 2022-10-25 19:34:57 · 219 阅读 · 0 评论 -
数据结构之堆
堆的特性前言:堆是一种特殊的树,堆这种数据结构应用场景非常多,经典的用法就是堆排序,堆排序是一种原地的、事件复杂度为O(nlogn)的排序算法。堆的特性什么样的树才叫做堆,堆需要满足两个特性。堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或者小于等于)其子树中每个节点的值。完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。原创 2022-10-17 19:12:40 · 861 阅读 · 0 评论 -
数据结构之红黑树
红黑树中节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求:根节点是黑色的每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据。任何相邻的节点都不能同时为红色,也就是,红色节点是被黑色节点隔开的;每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点。为什么说红黑树是近似的平衡二叉树。原创 2022-10-13 18:43:22 · 713 阅读 · 0 评论 -
数据结构之二叉树
一提到树,我们可能想到就是MySQL索引用到B+树,其实B+树只是其中的某一种结构。接下来我们来学习了解下树的一些基本概念。我们平时最常用的树就是二叉树。二叉树的每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树中,有两种比较特殊的树,分别是满二叉树和完全二叉树。满二叉树又是完全二叉树的一种特殊情况。二叉树既可以用链式存储,也可以用数组顺序存储。数组顺序存储的方式比较适合完全二叉树,其他类型的二叉树用数组存储会比较浪费存储空间。原创 2022-10-11 19:37:30 · 95 阅读 · 0 评论 -
算法之哈希算法
将任意长度的二进制值映射为固定长度的二进制值里面。这个映射规则就是哈希算法,通过原始数据映射后的得到的数据就是哈希值。从哈希值不能反推导出原始数据对输入的数据非常敏感,只是很小的改动,最后得到的哈希值都会大不相同。散列冲突的概率很小,对于不同的原始数据,哈希值相同的概率很小。哈希算法的执行效率要尽量高效,针对较长的文本,也能很快的计算出哈希值。在负载均衡应用中,利用哈希算法替代映射表,可以实现一个会话粘滞的负载均衡策略。原创 2022-10-10 18:56:24 · 1127 阅读 · 0 评论 -
算法之哈希表
提到哈希,作为使用java语言的同学来说,最先想到的就是hashMap,一种常用的容器用于存储数据,可以通过key在O(1)的时间复杂度内查找到对应的value,非常高效,其实HashMap就是哈希表算法的一种应用实现。散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是散列函数设计和散列冲突解决。散列冲突有两种常用的解决方法,开放寻址法和链表法。散列函数设计的好坏决定了散列冲突的概率,也就决定散列表的性能。原创 2022-10-08 18:45:21 · 338 阅读 · 0 评论 -
算法之跳表
一提到跳表,可以大家最开始能想到的就是Redis中有些集合就是用的跳表这种数据结构。没错,那跳表是如何设计的勒,怎么通过链表实现跳表勒。如上面如所示:每两个结点提取一个结点到上一级,我们把抽出来的那一级叫做索引或者索引层,途中的down标志down指针,指向下一级结点。我们可以看出加上一层索引后,查找一个结点需要遍历的结点个数减少了,就是说我们查找效率提升了。这种链表加多级索引的结构就是跳表跳表使用空间换时间的设计思路,通过构建多级索引来提高查询的效率,实现了基于链表的“二分查找”。原创 2022-09-28 19:18:12 · 1348 阅读 · 1 评论 -
算法之二分查找
二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。二分查找的核心思想理解起来非常简单,有点类似分治思想。即每次都通过跟区间中的中间元素对比,将待查找的区间缩小为一半,直到找到要查找的元素,或者区间被缩小为 0。但是二分查找的代码实现比较容易写错。你需要着重掌握它的三个容易出错的地方:循环退出条件、mid 的取值,low 和 high 的更新。原创 2022-09-27 18:00:42 · 743 阅读 · 0 评论 -
算法之线性排序
桶排序和计数排序的排序思想是非常相似的,都是针对范围不大的数据,将数据划分成不同的桶来实现排序。基数排序要求数据可以划分成高低位,位之间有递进关系。比较两个数,我们只需要比较高位,高位相同的再比较低位。而且每一位的数据范围不能太大,因为基数排序算法需要借助桶排序或者计数排序来完成每一个位的排序工作。原创 2022-09-26 19:09:07 · 222 阅读 · 0 评论 -
算法之排序
这三种排序算法,实现代码都非常简单,对于小规模数据的排序,用起来非常高效。但是在大规模数据排序的时候,这个时间复杂度还是稍微有点高,原创 2022-09-08 19:43:54 · 140 阅读 · 0 评论 -
算法之递归
递归作为经典的算法,是一些高阶算法的底层实现思想,我们很有必要去学习和理解递归算法的核心思想。递归是一种非常高效、简洁的编码技巧。只要是满足“三个条件”的问题就可以通过递归代码来解决。不过递归代码也比较难写、难理解。编写递归代码的关键就是不要把自己绕进去,正确姿势是写出递推公式,找出终止条件,然后再翻译成递归代码。递归代码虽然简洁高效,但是,递归代码也有很多弊端。比如,堆栈溢出、重复计算、函数调用耗时多、空间复杂度高等,所以,在编写递归代码的时候,一定要控制好这些副作用。原创 2022-09-07 18:53:59 · 209 阅读 · 0 评论 -
数据结构之队列
队列是我们日常做程序开发常见的一种数据结构,在Java语言,我们常用就是BlockQueue,在线程池中使用。原创 2022-09-01 19:57:07 · 256 阅读 · 0 评论 -
数据结构之栈
一提到栈,作为一名Java程序员,最先想到的时候是不是JVM中的堆栈,这里要做下区分,我们今天介绍的是一种数据结构一种抽象的数据存储结构,Jvm中堆栈,是内存中真实存在的物理区。存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。...原创 2022-08-31 15:56:42 · 221 阅读 · 0 评论 -
数据结构之链表
数组和链表是数据结构中最场景也是最基础的的数据结构,在java的高级编程语言中,分别对应者ArrayList和是LinedList。链表最大的特性:1.内存存储分散,不需要和数组一样申请连续的内存空间,2.数据先进先出(FIFO)的特性。...原创 2022-08-29 19:22:39 · 414 阅读 · 0 评论 -
数据结构之数组
数组是最基础、最简单的数据结构了。数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为O(n)。在平时的业务开发中,我们可以直接使用编程语言提供的容器类,但是,如果是特别底层的开发,直接使用数组可能会更合适。............原创 2022-08-26 15:27:19 · 290 阅读 · 0 评论 -
时间复杂度分析
本文作文学习极客时间课程《数据机构与算法之美》课程的一些笔记与感悟。有兴趣的朋友希望大家关注课程。非常好的课程,不要惧怕数据结构与算法。转载 2022-08-23 20:16:30 · 279 阅读 · 0 评论 -
如何分析和统计算法的执行效率和资源消耗
首先复杂度分析是针对一段程序分析的一种方法论,复杂度从两个角度去分析。一个执行效率。一个是资源消耗,用于分析程序执行效率的方法叫做"时间复杂度",分析程序消耗空间的方法叫做"空间复杂度",分别描述了程序执行时间(或占用的空间)随数据规模的增长关系。转载 2022-08-22 20:54:22 · 372 阅读 · 0 评论 -
布隆过滤器
针对布隆过滤器使用的优势与劣势。首先最大的优势是在数据量特别大的场景。能占用比较小的场景下快速判断对象是否存在。虽然需要用多个hash函数,但是判断过程是CPU密集型的计算,相比HashMap的一次hash函数,但是需要在内存中比较是否对象是否相等。这是属于内存密集型计算,理论上布隆过滤器的判断更加高效。缺点就是:布隆过滤器存在一定的误判率,一般用于判断元素不存在。经过它计算的结果是不存在,那么元素一定不存在,如果计算的结果为存在,会存在,不能一定确认元素存在,因为,可能所有的。......原创 2022-08-11 15:01:00 · 510 阅读 · 0 评论