算法
文章平均质量分 75
熊與猫v
这个作者很懒,什么都没留下…
展开
-
字典树Trie
字典树字典树:又称单词查找树(Trie树,又称前缀树),是一种哈希树的变种。典型应用是用于统计、排序和保存大量的字符串(但不 仅限于字符串),所以常被用于文本词频统计。 可用于快速查询「某个字符串/字符前缀」是否存在的数据结构。还可用于高效的存储和检索字符串数据集中的键。其核心是使用"边"来代表有无字符,使用"点"来记录是否为"单词结尾"以及“其后续字符串的字符是什么”。优点:利用字符串的公共前缀来减少查询时间,尽量减少无谓的字符串比较,查询效率比哈希树高。性质:根节点不包含字符串,除根节点外每一个节点都原创 2022-06-19 03:45:47 · 119 阅读 · 0 评论 -
一文学会动态规划
前言动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp 状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学递归那样,任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事,本文将会用比原创 2022-06-17 01:18:00 · 106 阅读 · 0 评论 -
如何写递归
1. 递归的定义编程语言中,函数 Func(Type a,……)直接或间接调用函数本身,则该函数称为「递归函数」。在实现递归函数之前,有两件重要的事情需要弄清楚:递推关系:一个问题的结果与其子问题的结果之间的关系。基本情况:不需要进一步的递归调用就可以直接计算答案的情况。可理解为递归跳出条件。一旦我们计算出以上两个元素,再想要实现一个递归函数,就只需要根据递推关系调用函数本身,直到其抵达基本情况。1.1 递推关系下面的插图给出了一个 5 行的帕斯卡三角,根据上面的定义,我们生成一个具有确定行数的帕斯原创 2022-06-16 02:34:33 · 4544 阅读 · 1 评论 -
单调栈详解
定义:单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。适用问题:要知道单调栈的适用于解决什么样的问题,我们首先需要知道单调栈的作用。单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到下一个比他大(小)的元素(或者说可以)。也就是说在队列或数组中,我们需要通过比较前后元素的大小关系来解决问题时我们通常使用单调栈。下面我们通过简单介绍单调减栈和单调增栈问题来进一步说明使用单调栈处理问题的过程。单调栈主要解决以下问题:寻找下一个更大元素寻找前一个更大元素寻找.转载 2021-08-22 03:24:59 · 4250 阅读 · 0 评论 -
前缀和算法
(一)前缀和算法概念:前缀和就是数组的前i项之和一维前缀和s[1]=a[1]s[2]=a[1]+a[2]s[3]=a[1]+a[2]+a[3]s[4]=a[1]+a[2]+a[3]+a[4]s[5]=a[1]+a[2]+a[3]+a[4]+a[5]①.前缀和输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。原创 2021-08-22 03:06:58 · 410 阅读 · 0 评论 -
常用淘汰算法(FIFO,LRU,LFU)简介
FIFO(先进先出)先进先出算法,很容易理解,核心原则是:先进缓存的数据先淘汰掉。实现方式:使用队列来完成。LRU(最近最少使用)最近最少使用可以理解为:最近一段时间最少被访问的数据淘汰掉。实现方式:一般使用链表完成。LFU(最不经常使用)最不经常使用:基于最近访问频率来进行淘汰。实现方式:一般使用Map完成。...转载 2021-08-15 21:44:29 · 791 阅读 · 0 评论 -
链表-巧用哨兵节点
哨兵(sentinel)是一个哑对象,可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,但是它其实并不存储任何东西,只是为了操作的方便而引入的。因此,如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点(个位置的时候,需要考虑该位置上原来的节点并没有前驱节点;而如果有哨兵节点的话, 线性表的每个位置的节点都有前驱节点,因此可以统一处理。(注意:哨兵节点根本不出现在线性表中,所以虽然它没有前驱,但是前面的那句话并不矛盾)。哨兵节点广泛应用...原创 2021-08-15 21:37:56 · 1239 阅读 · 0 评论 -
快慢指针原理及应用
快慢指针 快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。快慢指针的应用(1)判断单链表是否存在环 如果链表存在环,就好像操场的跑道是一个环形一样。此时让快慢指针都从链表头开始遍历,快指针每次向前移动两个位置,慢指针每次向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,没有环。如果快指针追上慢指针,则表示有环。代码如下:bool HasCircle(Node *head){ if(...原创 2021-08-14 20:37:02 · 954 阅读 · 0 评论 -
负载均衡常用算法
负载均衡在大型网站中应用已经是十分普遍了,它在大型网站中处理高并发请求扮演着十分重要的角色。那么负载均衡算法又有哪些呢,一下是一些常见的负载均衡算法:轮询法(Round Robin)轮询法基本上算是最简单的负载均衡算法了,它的思想就是不管啥情况,对所有的服务器节点全部按顺序来,将请求按照顺序轮流地分配到各个服务器上。这种算法会使每台服务器处理的请求是相同的,所以适合用于服务器硬件条件基本都相同的场景。加权轮询法(Weight Robin)在轮询算法的基础上添加了权重的条件,刚才提到轮询算法对所有原创 2021-08-02 03:03:40 · 335 阅读 · 0 评论 -
一致性哈希算法原理
一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。 但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性has转载 2021-08-02 02:37:46 · 123 阅读 · 0 评论 -
4种常用限流算法原理剖析
高并发系统的三把利器:缓存、限流、降级,利用此3种技术方案即可保系统运行无忧。由于限流是系统的首道关口,所以本文以限流为主题,普及限流算法的基础知识。为什么要限流限流即限制流量,通过流量控制来保证系统接收到的请求量在正常范围内。由于任何系统的吞吐量都有上限,所以必须设置合理的限定值,以避免流量洪峰将整个系统打垮。假如一个系统可以承载的网络带宽是1G,如果流量大于1G就会导致带宽打满,影响整个服务。在现实生活中,限流场景也随处可见:例如银行的叫号系统、餐厅的排队系统,如今的疫情,政府也是全力排除隐原创 2021-07-04 16:04:18 · 709 阅读 · 2 评论 -
KMP算法 字符串匹配
视频讲解:https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=400417521318290520图文讲解:https://baijiahao.baidu.com/s?id=1659735837100760934&wfr=spider&for=pchttp://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html...原创 2020-08-29 23:56:56 · 103 阅读 · 0 评论