算法与数据结构
文章平均质量分 88
算法与数据结构
秃了也弱了。
即使没有万全准备,也要勇敢迈出第一步。无论远方的风雨有多大、路有多难走。风里雨里陪伴你们,赠人玫瑰,手有余香。在技术领域,我会一如既往的坚持下去。
展开
-
Java实现基于DFA算法的网站敏感词过滤
敏感词、文字过滤是一个网站必不可少的功能,高效的过滤算法是非常有必要的。针对过滤首先想到的可能是这样:String[] s = "广告,广告词,中奖".split(",");String text = "讨厌的广告词";break;System.out.println(text.matches(".*(广告|广告词|中奖).*"));其实无论采取哪个方法,基本是换汤不换药。都是整体字符匹配,效率值得商榷。那怎么办呢?DFA算法出场。原创 2023-08-19 00:30:00 · 353 阅读 · 0 评论 -
Java加密算法的应用与实现(MD5、SHA、DES、3DES、AES、RSA、ECC)
严格来讲这不算是一种加密,而应该叫做信息摘要算法。该算法使用散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。通过数据打乱混合,重新创建一个叫做散列值。加密与解密用的都是同一个秘钥,性能比非对称加密高很多。非对称即加密与解密不是同一把钥匙,而是分成公钥和私钥。私钥在个人手里,公钥公开。这一对钥匙一个用于加密,另一个用于解密。使用其中一个加密后,则原始明文只能用对应的另一个密钥解密,即使最初用于加密的密钥也不能用作解密。正是因为这种特性,所以称为非对称加密。原创 2023-08-09 09:20:40 · 799 阅读 · 0 评论 -
Java负载均衡算法实现与原理分析(轮询、随机、哈希、加权、最小连接)
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。既然涉及到多个机器,就涉及到任务如何分发,这就是负载均衡算法问题。轮询即排好队,一个接一个。从可服务的列表中随机取一个提供响应。对当前访问的ip地址做一个hash值,相同的key被路由到同一台机器去。场景常见于分布式集群环境下,用户登录时的请求路由和会话保持。原创 2023-08-13 02:45:00 · 1045 阅读 · 0 评论 -
Java定时算法实现与应用(最小堆、时间轮)
系统或者项目中难免会遇到各种需要自动去执行的任务,实现这些任务的手段也多种多样,如操作系统的crontab,spring框架的quartz,java的Timer和ScheduledThreadPool都是定时任务中的典型手段。Timer是java中最典型的基于优先级队列+最小堆实现的定时器,内部维护一个存放定时任务的优先级队列,该优先级队列使用了最小堆排序。当我们调用schedule方法的时候,一个新的任务被加入queue,堆重排,始终保持堆顶是执行时间最小(即最近马上要执行)的。原创 2023-08-10 05:00:00 · 594 阅读 · 0 评论 -
Java调度算法实现与应用(FCFS、SJF、RR、HPF)
调度算法常见于操作系统中,因为系统资源有限,当有多个进程(或多个进程发出的请求)要使用这些资源时,就必须按照一定的原则选择进程(请求)来占用资源。这就是所谓的调度。在现实生活中也是一样,比如会议室的占用。应用:CPU资源调度云计算资源调度容器化Docker编排与调度先来先服务,很好理解,就是按照服务提交申请的顺序,依次执行。讲究先来后到。执行时间短的优先得到资源。即执行前申报一个我需要占据cpu的时间,根据时间长短,短的优先被调度。时间片逐个扫描轮询,轮到谁谁执行。原创 2023-08-04 08:40:03 · 1036 阅读 · 0 评论 -
Java限流算法实现与应用(计数器、漏桶、令牌桶、滑动窗口)
限流是对系统的一种保护措施。即限制流量请求的频率(每秒处理多少个请求)。一般来说,当请求流量超过系统的瓶颈,则丢弃掉多余的请求流量,保证系统的可用性。即要么不放进来,放进来的就保证提供服务。计数器采用简单的计数操作,到一段时间节点后自动清零。漏桶算法将请求缓存在桶中,服务流程匀速处理。超出桶容量的部分丢弃。漏桶算法主要用于保护内部的处理业务,保障其稳定有节奏的处理请求,但是无法根据流量的波动弹性调整响应能力。现实中,类似容纳人数有限的服务大厅开启了固定的服务窗口。原创 2023-08-03 08:46:47 · 2190 阅读 · 0 评论 -
Java失效算法与应用(FIFO、LRU、LFU)
失效算法常见于缓存系统中。因为缓存往往占据大量内存,而内存空间是相对昂贵,且空间有限的,那么针对一部分值,就要依据相应的算法进行失效或移除操作。First In First Out,先来先淘汰。这种算法在每一次新数据插入时,如果队列已满,则将最早插入的数据移除。LRU全称是Least Recently Used,即淘汰最后一次使用时间最久远的数值。FIFO非常的粗暴,不管有没有用到,直接踢掉时间久的元素。而LRU认为,最近频繁使用过的数据,将来也很大程度上会被频繁用到,故而淘汰那些懒惰的数据。原创 2023-08-03 08:46:24 · 436 阅读 · 0 评论 -
redis底层都有哪些数据结构?带你了解redis是如何存储数据的
我们都知道,redis有五种基本的数据类型: String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。今天,我们就一起聊聊我们熟知的这些数据类型,底层是如何实现的。其实,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。原创 2022-09-07 14:14:21 · 2224 阅读 · 0 评论 -
排序算法-归并排序
high]中,重复此过程,直至其中一个表为空 , 最后将另一非空表中余下的部分直接复制到T中。n趟归并排序, 每一趟归并, 其关键字比较次数不超过n , 元素移动次数都是n, 因此, 归并排序的时间复杂度为O(nlog。high]递归,进行归并排序, 结果放入 S[mid + 1…n]归并为一个有序序列R[/…mid]递归,进行归并排序,结果放入 S[low…2-路归并排序中的核心操作是,将待排序序列中前后相邻的两个有序序列归并为一个有序序列。归并排序:将两个或两个以上的有序子序列“归并”为一个有序序列。.原创 2022-08-07 19:06:16 · 477 阅读 · 0 评论 -
排序算法-选择排序
若n个元素的序列{a1a2… an}满足则分别称该序列{a1a2… an}为小根堆和大根堆。从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点。若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值)……如此反复,便能得到一个有序序列,这个过程称之为堆排序。...原创 2022-08-07 17:07:25 · 840 阅读 · 0 评论 -
排序算法-交换排序详解
冒泡排序(Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上 "漂浮"(左移),或者使关键字大的记录如石块一样逐渐向下 "坠落”(右移)。由于每次枢轴记录的关键字都是大于其它所有记录的关键字,致使一次划分之后得到的子序列(1)的长度为0,这时已经退化成为没有改进措施的冒泡排序。快速排序不是原地排序,由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度。快速排序时一种不稳定的排序方法。...原创 2022-08-06 16:41:43 · 2433 阅读 · 0 评论 -
排序算法-插入排序详解
直接插入排序,当待排序的记录个数较少且待排序序列的关键字基本有序时,效率较高。①在插入a[i]前,数组a的前半段(a[0]-a[i-1])是有序段,后半段(a[i]-a[n-1])是停留于输入次序的“无序段”。②插入a[i]使a[0]-a[i-1]有序,也就是要为a[i]找到有序位置j(0≤j≤i),将a[i]插入在a[j]的位置上。先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。...原创 2022-07-31 17:55:24 · 2934 阅读 · 0 评论 -
算法-hash散列表查找详解
基本思想:记录的存储位置与关键字之间存在对应关系。对应关系——hash函数。Loc(i) = H(keyi)选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比对,确定查找是否成功。散列方法中使用的转换函数。按上述思想构造的表。散列函数:H(key) = k不同的关键码映射到同一个散列地址。kei1≠key2,但是H(key1)=H(key2)在散列查找方法中,冲突是不可能避免的,只能尽可能减少。(1)构造好的散原创 2022-06-12 16:50:39 · 1352 阅读 · 0 评论 -
算法-B-树、B树、B+树详解
书接上文——算法-查找算法-树表的查找(二叉排序树、平衡二叉树)(类C语言版)B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。B-树,磁盘管理系统中的目录管理,以及数据库系统中的索引组织多数都采用B-树这种数据结构。一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:(1)树中每个结原创 2022-06-11 23:16:24 · 4902 阅读 · 1 评论 -
算法-查找算法-树表的查找(二叉排序树、平衡二叉树)(类C语言版)
当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。改用动态查找表——几种特殊的树,表结构在查找过程中动态生成。对于给定值key,若表中存在,则成功返回;否则,插入关键字等于key的记录。几种特殊的树:二叉排序树(Binary Sort Tree)又称为二叉搜索树、二叉查找树,它是一种对排序和查找都很有用的特殊二叉树。二叉排序树或是空树,或是满足如下性质的二叉树:(1)若其左子树非空,则左子树上所有结点的值均小于根节点的值;(2)若其右子树非空,则右子树上所有结点的值均大于等于根节点原创 2022-06-11 19:37:41 · 702 阅读 · 0 评论 -
算法-查找算法-线性表的查找(类C语言版)
顺序查找算法在顺序表ST中查找值为key的数据元素(从最后一个元素开始比较)。改进后的顺序查找算法把待查关键字key存入表头(哨兵、监视哨),可免去查找过程中每一步都要检测是否查找完毕,加快速度。当ST.length较大时,此改进能使进行一次查找所需的平均时间几乎减少一半。比较次数与key位置有关:时间复杂度:O(n)查找成功时的平均查找长度,设表中各记录查找概率相等ASLs(n) = (1+2+…+n) / n = (n+1) / 2空间复杂度:一个辅助空间——O(1)。优点:算法简单,逻原创 2022-06-08 21:15:00 · 1091 阅读 · 0 评论 -
数据结构-图的应用-拓扑排序与关键路径(类C语言版)
无环的有向图,简称DAG图(Directed Acycline Graph)。有向无环图常用来描述一个工程或系统的进行过程。(通常把计划、施工、生产、程序流程等当成是一个工程)。一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以导致整个工程的完成。拓扑排序例:排课表检测AOV网中是否存在环方法AOE网:关键路径...原创 2022-06-05 21:33:14 · 349 阅读 · 0 评论 -
数据结构-图的应用-最短路径(类C语言版)
交通网络的问题——从甲地到乙地之间是否有公路连通?在有多条通路的情况下,哪一条路最短?交通网络用有向图来表示:顶点——表示地点,弧——表示两个地点有路连通,弧上的权值——表示两地点之间的距离、交通费或图中所花费的时间等。如何能够使一个地点到另一个地点的运输时间最短或运费最省?这就是一个求两个地点间的最短路径的问题。在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。用Dijkst原创 2022-06-02 19:30:00 · 759 阅读 · 0 评论 -
数据结构-图的应用-最小生成树(类C语言版)
所有顶点均由边连接在一起,但不存在回路的图。设图G = (V, E)是个连通图,当从图任一顶点出发遍历图G时,将边集E(G)分成两个集合T(G)和B(G)。其中T(G)是遍历图时所经过的边的集合,B(G)是遍历图时未经过的边的集合。显然,G1(V, T)是图G的极小连通子图。即子图G1是连通图G的生成树。给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。数学模型(显然此连通网是一个生成树!):顶点——表示城市,有n个;边——表示线路,原创 2022-06-01 22:00:55 · 719 阅读 · 0 评论 -
数据结构-图的遍历(类C语言版)
文章目录概念遍历定义遍历实质避免重复访问深度优先遍历遍历方法深度优先搜索遍历连通图深度优先搜索遍历非连通图邻接矩阵表示的无向图深度遍历实现采用邻接表表示图的深度优先搜索遍历概念遍历定义从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点, 且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。遍历实质找每个顶点的邻接点的过程。避免重复访问图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。怎样避免重复访问?解原创 2022-05-31 18:45:00 · 596 阅读 · 0 评论 -
数据结构-图的概念与存储结构(类C语言版)
文章目录图的定义和术语无向图有向图完全图稀疏图稠密图网邻接关联(依附)图的定义和术语图:G = (V, E)Graph = (Vertex, Edge)V:顶点(数据元素)的有穷非空集合;E:边的有穷集合。无向图每条边都是无方向的。有向图每条边都是有方向的。完全图任意两个点都有一条边相连。稀疏图有很少边或弧的图(e<nlogn)。稠密图有较多边或弧的图。网边/弧带权的图。邻接有边/弧相连的两个顶点之间的关系。存在(vi, vj),则称vi和vj互为邻接点;原创 2022-05-30 14:27:21 · 1061 阅读 · 0 评论 -
数据结构-哈夫曼树详解(类C语言版)
文章目录引入哈夫曼树例引出问题哈夫曼树的基本概念路径结点的路径长度树的路径长度引入哈夫曼树例编程:将学生的百分制成绩转换为五分制成绩。<60:E 60-69:D 70-79:C 80-89:B 90-100:Aif(score<60) grade == 'E';else if(score<70) grade == 'D';else if(score<80) grade == 'C';else if(score<90) grade == 'B';原创 2022-05-20 06:07:37 · 3901 阅读 · 0 评论 -
数据结构-树和森林详解(类C语言版)
文章目录树和森林双亲表示法C语言的类型描述树结构结点结构孩子链表法C语言的类型描述树结构带双亲的孩子链表孩子兄弟表示法(二叉树表示法、二叉链表表示法)树与二叉树的转换将树转换成二叉树将二叉树转换成树森林与二叉树的转换森林转换成二叉树(二叉树与多棵树之间的关系)二叉树转换成森林树和森林森林:是m(m≥0)棵互不相交的树的集合。树(Tree)是n(n≥0)个结点的有限集。若n = 0,则称为空树。若n > 0,(1)有且仅有一个特点的根(Root)的结点;(2)其余结点可分为m(m≥0)个互不相原创 2022-05-17 22:18:32 · 1771 阅读 · 3 评论 -
数据结构-遍历二叉树、线索二叉树(类C语言版)
二叉树遍历的三种方法由二叉树的递归定义可知,遍历左子树和遍历右子树可如同遍历二叉树一样“递归”进行。例题1写出下图二叉树的各种遍历顺序答:先序:A B D G C E H F中序:D G B A E H C F后序:G D B H E F C A性质若二叉树中各节点的值均不相同,则二叉树结点的先序序列、中序序列和后序列都是唯一的。由二叉树的先序序列和中序序列,或由二叉树的后序序列和中序序列可以确定唯一一棵二叉树。...原创 2022-05-15 10:30:24 · 1855 阅读 · 0 评论 -
数据结构-初识树和二叉树(类C语言版)
树的定义树(Tree)是n(n≥0)个结点的有限集。若n = 0 ,称为空树。若n > 0,则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点;(2)其余结点可分为m(m≥0)个互不相交的有限集T1, T2, T3, …, Tm,其中每一个集合本身又是一棵树,并称为根的子树(SubTree)。树的递归表示树是n个结点的有限集。显然,树的定义是一个递归的定义。树的其他表示方式树的基本术语树结构和线性结构的比原创 2022-05-10 17:32:51 · 660 阅读 · 0 评论 -
数据结构-广义表详解(类C语言版)
目录广义表的概念定义表头表尾例广义表的性质广义表与线性表的区别广义表的存储结构头尾链表的存储结构扩展线性链表的存储结构广义表的基本运算例广义表的概念定义广义表通常记作:LS = (a1, a2, ..., an)其中:LS为表名,n为表的长度,每一个ai为表的元素。习惯上,一般用大写字母表示广义表,小写字母表示原子。表头若LS非空(n≥1),则其第一个元素a1就是表头。记作head(LS) = a1。注...原创 2022-05-12 21:45:00 · 1545 阅读 · 0 评论 -
数据结构-数组详解(类C语言版)
目录数组的概念一维数组一维数组的逻辑结构声明格式二维数组二维数组的逻辑结构声明格式三维数组结论数组特点数组的抽象数据类型定义数组的顺序存储二维数组的行序优先表示三维数组的元素存储位置n维数组的元素存储位置例如特殊矩阵的压缩存储概念什么是压缩存储什么样的矩阵能够压缩什么叫稀疏矩阵对称矩阵特点存储方法对称矩阵的存储结构数组的概念按一定格式排列起来的,具有相同类型的数据元素的集合。一维数...原创 2022-05-09 21:05:37 · 3949 阅读 · 0 评论 -
数据结构-串详解(字符串)(类C语言版)
串的概念串(String)——由零个或多个任意字符组成的有限序列。空串用∅表示。概念子串:串中任意个连续字符组成的子序列称为该串的子串。主串:包含子串的串相应地称为主串。字符位置:字符在序列中的序号为该字符在串中的位置。子串位置:子串第一个字符在主串中的位置。空格串:由一个或多个空格组成的串,与空串不同。实例字符串a、b、c、da='BEI'b='JING'c='BEIJING'd='BEI JING'它们的长度分别是:3、4、7、...原创 2022-04-21 21:58:51 · 2033 阅读 · 0 评论 -
数据结构-队列详解(类C语言版)
目录队列的相关概念定义逻辑结构存储结构运算规则实现方式队列的基本操作循环队列——队列的顺序表示和实现队列的顺序存储结构假溢出-引出循环队列判断循环队列队空队满循环队列的操作队列的初始化求循环队列长度循环队列入队循环队列出队取循环队列队头元素队列-链式队列队列的链式存储结构链队列的类型定义链式队列的操作链队的初始化链队的入队链队的出队取链队的队头元素销毁链队列队列的相关概念定义只能在表...原创 2022-04-10 21:19:21 · 2386 阅读 · 0 评论 -
数据结构-栈详解(类C语言版)
栈的定义概念栈 (stack) 是限定仅在表尾进行插入或删除操作的线性表。 因此, 对栈来说, 表尾端有其特殊含义, 称为栈顶 (top), 相应地, 表头端称为栈底 (bottom)。 不含元素的空表称为空栈。栈又称为后进先出 (Last In First Out, LIFO) 的线性表。栈的抽象数据类型定义ADT Stack {数据对象: D = {ai | ai∈ElemSet , i = 1,2,...,n,n≥0 }数据关系: ...原创 2022-04-09 18:00:13 · 2089 阅读 · 0 评论 -
数据结构-线性表详解(类C语言版)
线性表的定义和特点线性表是具有相同特性的数据元素的一个有限序列。原创 2022-03-31 05:15:00 · 2098 阅读 · 0 评论 -
如何计算算法的时间复杂度、空间复杂度
如何计算算法的时间复杂度、空间复杂度原创 2022-03-27 16:58:12 · 948 阅读 · 0 评论