算法
文章平均质量分 57
深山猿
不断进化的深山猿
展开
-
流量控制算法
漏桶算法需要设定两个参数,一个是桶的容量大小用,用来决定最多可以存放多少水(请求),一个是水桶漏的大小,即出水速率,即出水速率决定单位时间向服务器请求的平均次数。随着时间流逝,系统会按恒定时间间隔往桶里加入制定数量的水,如每100毫秒往桶里加入1000毫升的水,如果桶已经满了就不再加了(说明:令牌桶算法和漏桶算法相反,漏桶算法是按照客户请求的数量往漏桶中加水的,而令牌桶算法是服务器端控制往桶里加水的)。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。原创 2022-11-22 15:52:08 · 476 阅读 · 0 评论 -
redis数据结构与精准限流
Redieskey -valuevalue存在如下类型:setSortedsetmapstringlistlist-列表:ziplist:压缩列表:类似数组,但不同于数组,1)单一压缩列表中支持存储不同大小的数据,所以更加节省空间,这也是压缩的含义。2) 因为上面的特性,压缩列表不可以通过下标直接定位元素为什么要使用压缩散列表:没有多余的指针等,节省空间使用条件...原创 2020-01-16 13:40:25 · 253 阅读 · 0 评论 -
几个算法使用的实例 -垃圾短信,音乐推荐
朴素贝叶斯算法基于黑名单的过滤器:号码量少于50万,黑号码名单维护成一个散列表。如果有500万个号码呢?方案1:布隆过滤器 5000万bits,方案2:黑名单存储在服务器,所有判断都通过网络请求判断基于规则的过滤器,规则如下:1) 特殊词,反动 淫秽2) 群发号码,非正常号码3) 短信中汉语微信 qq等可以基于概率统计的方法,借助计算机强大的计算能力,找出哪些单词最常出现在...原创 2019-12-17 11:14:14 · 244 阅读 · 0 评论 -
最短路径算法
到底是贪心还是动态规划?Dijkstra算法抽象问题,选择合适的数据结构抽象问题 权重图,本质求两节点最小权重值从起点开始遍历所有的临接节点,将节点权重维护到最小堆中每次以最小堆对应的顶点为起点再次遍历临接节点:0) 默认到最小节点的距离都是MAX INT,用数组存储,index顶点值1)将节点标记为已遍历,所有临接节点距离与当前数组中距离比较:2)如果大于当前距离不处理,否则入队...原创 2019-12-17 11:08:58 · 194 阅读 · 0 评论 -
拓扑排序
拓扑排序先穿袜子才能穿鞋子:袜子->鞋子秋裤->裤子 裤子->鞋子 秋衣->外套整体穿衣顺序:秋衣->外套->秋裤->裤子->袜子->鞋子 或秋裤->裤子->袜子->鞋子-->秋衣->外套问题 --> 数据结构 --> 算法拓扑排序算法:如果s需要先于t执行,那就添加一条s指向t的...原创 2019-12-17 11:07:36 · 143 阅读 · 0 评论 -
动态规划1
动态规划0-1背包问题 --动态规划,放入n个物体按阶段处理,第n次的结果可以基于第n-1的结果来推导.最大重量9,物体重量分别为 3,2,4,5int[n][w]或int[w+1]解决0-1背包升级版:一组不同重量、不同价值、不可分割的物品,我们选择将某些物品装入背包,在满足背包最大重量限制的前提下,背包中可装入物品的总价值最大是多少呢?先计算单价,先放入单价高的商品有几个节点...原创 2019-12-17 11:01:21 · 197 阅读 · 0 评论 -
回溯思想
把问题求解的过程分为多个阶段。每个阶段,我们都会面对一个岔路口,我们先尝试选一条路走,当发现这条路走不通的时候(不符合期望的解),就尝试另外一种走法继续走。典型的如:8皇后算法,皇后放入当前节点不满足,则尝试别的节点。0-1背包,当前物体放入超重,则不放入当前物体。背包总的承载重量是 Wkg。现在我们有 n 个物品,每个物品的重量不等,并且不可分割。在不超过背包所能装载重量的前提下,如何让...原创 2019-12-17 10:53:43 · 130 阅读 · 0 评论 -
分治算法
思想:将原问题划分成n个规模较小,并且与原问题相似的子问题。递归解决子问题,然后合并结果要求:1)原问题与分解成的小问题具有相同的模式2)小问题可以独立求解3)具有分解终止条件4)可以将子问题合并成原问题如何编程求出一组数据的逆序对个数?逆序对个数:存在 2,4,3,1,5,6,逆序对个数为4,分别为2-1 4-1 3-1 4-3其实可以参考归并排序,如 1,5,6,2,3,4...原创 2019-12-17 10:50:22 · 90 阅读 · 0 评论 -
算法贪心
用到贪心算法的场景:针对一组数据,定义了限制值和期望值,从中选出几个数据,在满足限制值的情况下,期望值最大。然后尝试和验证贪心算法。但是一般贪心算法并不总能给出最优解。如图:贪心算法的解决思路是,每次都选择一条跟当前顶点相连的权最小的边,直到找到顶点 T。按照这种思路,我们求出的最短路径是 S->A->E->T,路径长度是 1+4+4=9。最终求的路径并不是最短路径,...原创 2019-12-17 10:47:31 · 267 阅读 · 0 评论 -
字符串匹配算法
主要算法:BF RK BM KMP Sunday算法BF :Brute Force,暴力匹配算法字符串A中查找字符串B主串:A,长度n模式串:B,长度m检查起始位置分别是0,1,2....n-m且长度为m的n-m+1个子串,看看是否有跟模式串匹配的。时间复杂度:比对n-m+1次,每次比对m个字符串;时间复杂度O(n*m)BF为什么是一个很常用的字符串匹配算法?1)实际场景中,n...原创 2019-12-17 10:30:38 · 735 阅读 · 0 评论 -
图
图:如何存储微博、微信等这些社交网络的好友关系?为什么产生?特点?使用场景?树中的元素称为节点,图中的元素称为顶点。顶点之间的关系叫作边。顶点相连接的边的条数叫作定点的度。微信为例:一个用户就是一个顶点,好友关系就是边,一个用户总的好友个数就是度微博:可以单向关注,其实现为有向图边上增加方向的概念就是有向图,此时无向图中的度分为 入度 和 出度。入度:多少条边指向这个...原创 2019-12-09 21:08:10 · 174 阅读 · 0 评论 -
二叉树与堆
二叉树有哪几种存储方式?哪种适合于用数组来存储?node数组存储?两种特殊二叉树满二叉树:除了叶子节点之外,每个节点都有左右两个子节点完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大节点的高度:节点到叶子节点的最长路径节点的深度:根节点到这个节点的边的个数,从0开始节点的层数:节点的深度加1,从1开始树的高度:根...原创 2019-12-09 21:04:05 · 385 阅读 · 0 评论 -
散列表与hash函数
散列表:hash冲突解决1)开放定址法 :存入:冲突的 进行二次处理,加线性,平方等;以线性为例,会逐个向下找,直到找到一个空的位置然后放进去查找:与存入相似,先hash定位起始的查找位置,然后向下找等于的对象,如果遇到空的说明不存在删除:因为上面查找遇空则说明不存在,所以不可以直接删除,仅仅可以标记删除2)链表:3)再hash:产生冲突时,计算另一个哈希函数地址,到不冲突为止。使用...原创 2019-12-09 21:01:09 · 361 阅读 · 0 评论 -
跳表
跳表:为什么需要跳表,实现快速查找链表中的节点什么是跳表,画出跳表的结构1 81 4 8 121 2 3 4 5 6 7 8 9 10 11 12...假设要查找12,原本路径:1-2-3..-12 11步现在路径:1-8-8-12-12 4步跳表的本质:本质上是对链表加了索引,多级索引,空间换时间的思想跳表中的增删改...原创 2019-12-09 20:59:24 · 119 阅读 · 0 评论 -
二分查找
二分查找:使用场景:有序数据 存放于数组中数据量过大也不适宜使用,因为数组占用的是连续大小的空间作业:有序数组中(不)存在重复元素递归和非递归实现思考题:如何在 1000 万个整数中快速查找某个整数?是否有序? 有序二分查找无序:查找几次?多次,先排序,后遍历查找??一次,直接遍历查找第一个大于等于给定值的元素ip范围查找,二分查找,找大于等于该数的值,然后查看对...原创 2019-12-09 20:58:31 · 115 阅读 · 1 评论 -
排序
插入排序 :不断的将后面的数据插入到前面的有序数据中。冒泡排序:通过从0交换相邻数据,保证第一轮n-1次交换后最大数据在倒数第一位;第二轮n-2次交换后,第二大数据在倒数第二位选择排序:第一轮:从1~n-1中找最小的数据与第0为交换,保证最小数据在第一位;冒泡和选择排序区别在于:在交换的方式上 冒泡算法,每次比较如果发现较小的元素在后面,就交换两个相邻的元素。 而选择排序算法的改进在于:先...原创 2019-11-28 22:12:47 · 236 阅读 · 0 评论 -
递归
递归条件:n个台阶,一步可以走两步,也可以走一步,有多少中走法可以根据第一步的走法把所有走法分为两类,第一类是第一步走了 1 个台阶,另一类是第一步走了 2 个台阶。所以 n 个台阶的走法就等于先走 1 阶后,n-1 个台阶的走法 加上先走 2 阶后,n-2 个台阶的走法。用公式表示就是:f(n) = f(n-1)+f(n-2)有了递推公式,递归代码基本上就完成了一半。我们再来看下终止条...原创 2019-11-28 21:28:21 · 131 阅读 · 0 评论 -
栈相关算法题
栈:方法: push pop peek()栈的实现 :数组实现 (固定大小 + 可动态扩展)链表实现栈的空间复杂度是多少?O(1),虽然这里需要大小为n的数组,但是这个数组时必须的,我们所说的空间复杂度,指的是除了基础数据存储外还需要的存储空间。栈的实际使用函数调用:操作系统给每个线程分配了独立内存空间,其被组织成栈的结构;用来存储函数调用和临时变量。每进入一个函数,就压入一...原创 2019-11-28 21:22:27 · 117 阅读 · 0 评论 -
算法中哨兵技巧
哨兵:国家边界的站岗士兵;这里引申为处理边界值的问题。实例:需求:数组中找值key所在的位置public class GuardTest { public static void main(String[] args) { int[] array = {1,3,5}; System.out.println(searchValue(array,...原创 2019-11-28 20:58:47 · 2078 阅读 · 2 评论 -
时空间复杂度,数组链表
时间复杂度的含义 :假设每行代码执行时间是一定的,都是unit,那有一个很重要的规律:所有代码的执行时间 T(n) 与所有行代码的执行次数 n 成正比:T(n) = O(f(n))注意:这里仅仅从代码行数的角度考虑,所以你是简单的计算,还是从磁盘读取100M的文件,我们粗略认为两者执行时间都是unit;时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,...原创 2019-11-28 20:54:46 · 838 阅读 · 0 评论 -
数组实现stack和queue,及其相互实现
queue:先进先出stack:先进后出stack实现queue一般写法 两个stack,元素的出和进都放到stack1,每进一个就倒2次(s1->s2 s1存新 s2->s1),把后加进来的放到最下面;高性能算法:s1负责出,s2负责入入队时,s2若为空,将s1导入s2,然后将元素压入s2;s2不为空,元素直接加入s2出队时,判断s1是否为空,如不为空,则直接弹出顶元素...原创 2019-10-18 22:07:10 · 290 阅读 · 0 评论 -
字符串反转的方法
package iostream;import java.io.*;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * @author mazhen * @date 2019/9/18 16:29: * @description */public class StreamTest {...原创 2019-09-27 15:46:12 · 161 阅读 · 0 评论 -
Arrays.sort排序算法
java默认的排序算法及思路List.sort() 还是 Collections.sort底层的排序都是调用了Arrays.sort()方法Arrays.sort方法如下:public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) { sort(...转载 2019-09-11 12:01:48 · 841 阅读 · 0 评论 -
排序算法和查找
排序和查找实例内部排序:交换式(冒泡、快速排序法)、选择式(选择、堆排序)、插入(插入、谢尔、二叉树)式排序外部排序:合并、直接合并排序随机产生数组public int[] getArray(int n){ int[] arr=new int[n]; for(int i=0;i<n;i++){ int t=(int)(Ma...原创 2019-09-10 11:48:27 · 165 阅读 · 0 评论