关于可重入函数
注意是指整个元素,如果是有序的话,在有些时候,比如在数据库里面也好,或者是在其他对一些有序的树进行查询的时候,即使用链表这种方式存储的话,我们发现它的元素是有序的,比如说下面这个升序链表,134578910 它是升序排列的,这个时候我们要快速地查询,比如 9 在什么地方或者查询 5,是不是在这个链表里面出现,这时候你会发现,如果是用普通的数组可以进行二分查找可以很快查到5所在的位置,以及查询到一个元素是否存在。 一个有序的数组里面存在,那么问题来了,如果是有序的,但是是链表的情况下应该怎样有效地加速呢?于是在近代1990年前后,一种新的数据结构出现了,它的名字叫做 跳表。 跳表的特点 注意:只能用于元素有序的情况。 所以,跳表(skip list)对表的是平衡树(AVL Tree)和 二分查找,是一种 插入/删除/搜索 都是 O(logn) 的数据结构。1989 年出现。
它的最大优势是原理简单、容易实现、方便扩展、效率更高。因此在一些热门的项目里用来替代平衡树,如 Redis、LevelDB等。
如何给有序的链表加速 假设有一个有序的链表,1 3 4 5 7 8 9 10 这么一个原始的链表。它的时间复杂度查询肯定是 O(n) 的,那么问一下如何优化?如何进行简单优化?可以让它的查询时间复杂度变低,也就是加速它的查询。
我们可以思考一些,如果你来比如说我要很快地查到 7 ,有没有在链表中存在和它的位置在哪儿的话,你能够非常快的查询出来吗? 以上示意图描述了一个序列号的二进制组成结构。 第一位不用,恒为0,即表示正整数;接下来的41位表示时间戳,精确到毫秒。为了节约空间,可以将此时间戳定义为距离某个时间点所经历的毫秒数(Java默认是1970-01-01 00:00:00)。 再后来的10位用来标识工作机器,如果出现了跨IDC的情况,可以将这10位一分为二,一部分用于标识IDC,一部分用于标识服务器;最后12位是序列号,自增长。 snowflake的核心思想是64bit的合理分配,但不必要严格按照上图所示的分法。如果在机器较少的情况下,可以适当缩短机器id的长度,留出来给序列号。 5. 黑名单机制 如果此appid进行过很多非法操作,或者说专门有一个中黑系统,经过分析之后直接将此appid列入黑名单,所有请求直接返回错误码; 我们可以给每个appid设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等;或者我们直接通过分布式配置中心,直接保存黑名单列表,每次检查是否在列表中即可; 限流机制 常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流;
具体基于以上算法如何实现,Guava提供了RateLimiter工具类基于基于令牌桶算法: (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |