查找算法

JWT签发token

坚强是说给别人听的谎言 提交于 2019-11-29 10:07:11
目录 一. 认证的发展历程简介 二. JWT签发Token源码分析 2.1 JWT工作原理及简介 2.2 JWT生成token源码分析 返回目录 一. 认证的发展历程简介   这里真的很简单的提一下认证的发展历程。以前大都是采用cookie、session的形式来进行客户端的认证,带来的结果就是在数据库上大量存储session导致数据库压力增大,大致流程如下:   在该场景下,分布式、集群、缓存数据库应运而生,认证的过程大致如下:   不过该方式还是缓解不了数据库压力,一个项目中应该尽可能多的减少IO操作,于是后来采用签名的方式,在服务端只保存token的签名算法,当客户端认证时,只需用算法去生成或是判断token的合法性即可。大致方式如下: 返回目录 二. JWT签发Token源码分析 返回目录 2.1 JWT工作原理及简介    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。   JWT由三部分组成,分别是头.载荷.签名

算法:二分法查找

时光毁灭记忆、已成空白 提交于 2019-11-29 05:10:40
package com.atguigu;public class Main { public static void main(String[] args) { //二分法查找 //前提:所查找的数组必须有序 int[] arr=new int[]{-98,-34,2,34,54,66,79,105,210,333}; int dest=-3; int head=0;//初始的首索引 int end=arr.length-1; boolean isFlag=true; while(head<=end){ int middle=(head+end)/2; if(dest==arr[middle]){ System.out.println("找到指定的元素,位置为"+middle); isFlag=false; break; }else if(arr[middle]>dest){ end=middle-1; }else{ head=middle+1; } } if(isFlag){ System.out.println("很遗憾,没有找到"); } }} 来源: https://www.cnblogs.com/helloworld0903/p/11456552.html

算法:线性查找(重点isFlag标志)

筅森魡賤 提交于 2019-11-29 05:10:18
package com.atguigu;public class Main { public static void main(String[] args) { String[] arr=new String[]{"JJ","DD","MM","BB","GG","AA"}; //线性查找 String dest="BB"; boolean isFlag=true; for(int i=0;i<arr.length;i++){ if(dest.equals(arr[i])){ System.out.println("找到指定的元素,位置为:"+i); isFlag=false; break; } } if(isFlag){ System.out.println("很遗憾,没有找到奥"); } }} 来源: https://www.cnblogs.com/helloworld0903/p/11456502.html

红黑树(自平衡的二叉查找树)

放肆的年华 提交于 2019-11-29 04:54:48
30张图带你彻底理解红黑树 红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理? 红黑树定义和性质 红黑树是一种 含有红黑结点并能自平衡的二叉查找树 。它必须满足下面性质: 性质1:每个节点要么是黑色,要么是红色。 性质2: 根节点 是 黑色 。 性质3:每个 叶子节点 (NIL)是 黑色 。 性质4:每个 红色结点的两个子结点 一定都是 黑色 。 性质5: 任意一结点到每个叶子结点 的路径都 包含数量相同的黑结点 。 性质5.1:如果 一个结点存在黑子结点 ,那么 该结点肯定有两个子结点 (在Java中, 叶子结点 是 为null 的结点。) 图1就是一颗简单的红黑树。其中Nil为叶子结点,并且它是黑色的。(值得提醒注意的是,在Java中,叶子结点是为null的结点。) 红黑树并 不是 一个 完美平衡(左右子树高度相差为0)二叉查找树 ,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的 黑结点的层数是相等的 ,也即 任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点 (性质5)。所以我们叫红黑树这种平衡为 黑色完美平衡 。 我们把 正在处理(遍历)的结点 叫做 当前结点 ,如图2中的D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。 红黑树自平衡 红黑树能自平衡,它靠的是什么?三种操作: 左旋

在一个树型结构数据中,查找相邻有相同属性的节点的最大数量的方法

醉酒当歌 提交于 2019-11-29 03:25:55
本文介绍的是一个在一个树型数据结构中,查找 type 属性均为 a 的相邻节点的最长链路的节点数量,如果中间有任何其他节点插在其中,那这个长度就结束了,必须是相邻的。一个最简单的示例就是在一个树型结构中,有两个节点要进行连接,但是连接的节点如果都是 type 为 a 的话,则最长不能超过5个,超过五个则节点不能进行连接。 如下图:   在进行节点之间的连接时,如过相邻的节点 type 属性均为 a 的超过五个就不能连接。假设上图的节点都有 type 属性,且都为 a ,则在连接时 2.1 节点是可以和 3.1 节点连接的,而 2.3 是不能和 3.3 进行连接的,因为连接后,最长的到了 6.1 节点,长度超过了 5 个。5.1后面也不能来连接其他 type 为 a 的节点了。那要怎么判断在进行连接时这个长度是否超过 5 个,这就是本文要介绍的内容,一个算法,但是是有前提条件的。   首先这些节点上要有这些信息:这个节点的 ID、它父节点的 ID、它子节点的 ID;每个节点都有 type 属性,标记这个节点是什么节点;有方法可以获取所有节点的信息,方便通过 ID 进行查询。 有人会说,那该怎么获取所有节点的信息呢?其实只要在创建时,把节点的信息保存在一个对象中即可,以 ID 作为 key,以其信息作为 key值; 如下对象中表示: const nodes = { ... /

Mysql优化-索引

假如想象 提交于 2019-11-28 21:49:01
1. 索引的本质   MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。   数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法是顺序查找(liner search),这种复杂度为o(n)的算法在数据量大时,速度很慢。但是我们有更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉查找只能应用于二叉查找树上,但是数据本身的组织结构不可能满足各种数据结构(例如,一般不可能同时将两列都按顺序进行组织),所以在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实训高级查找算法。这种数据结构,就是索引。   为了加快查询速度,可以维护一个二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在o(logN)的复杂度内获取到相应数据。   虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树实现的。。。 二叉排序树   二叉排序树的排序规则如下:   1)若左子树不空

排序与搜索(四):二分查找

独自空忆成欢 提交于 2019-11-28 20:11:32
搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好; 其缺点是要求待查表为有序表 ,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 二分法查找实现 非递归实现与递归实现 #-*-coding:utf-8-*- #auth:kokopop def binary_serch(alist,item): """二分查找递归实现""" n=len(alist) if n>0: mid = n // 2 if alist[mid] == item: return True elif item < alist[mid]: return binary_serch(alist[:mid], item) else: return binary_serch(alist[mid

二叉查找树

谁说我不能喝 提交于 2019-11-28 20:09:08
二叉查找树 实现 查找与插入 分析 最大键和最小键 删除最大键和最小键 我们所使用的数据结构有结点组成,结点所办韩的链接可以指向空(null)或者其他节点。在二叉树中,每个节点只能有一个父节点指向自己(只有一个例外,也就是根结点,它没有父结点),而且每个结点都只有左右两个链接,分别指向自己的左子结点和右子结点。尽管我们指向的是结点,但我们可以将每个链接看作指向了另一颗二叉树,而这棵树的根结点就是被指向的结点。因此我们可以将二叉树定义为一个空链接,或者是一个有左右两个链接的结点,每个链接都指向一颗子二叉树。 一颗二叉查找树每一个结点都含有一个Comparable的键且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键。 实现 public class BST<Key extends Comparable<Key>,Value> { private Node root;//二叉树的根节点 private class Node{ private Key key;//键 private Value val;//值 private Node left,right;//指向子树的链接 private int N;//以该节点为根的子树 public Node (Key key,Value val,int N){ this.key = key; this.val = val;

MSSQLSERVER执行计划详解

妖精的绣舞 提交于 2019-11-28 19:16:23
序言 本篇主要目的有二: 1、看懂t-sql的执行计划,明白执行计划中的一些常识。 2、能够分析执行计划,找到优化sql性能的思路或方案。 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你: SqlServer性能检测和优化工具使用详细 , sql语句的优化分析 , T-sql语句查询执行顺序 。 执行计划简介 1、什么是执行计划? 大哥提交的sql语句,数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式。然后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行方案,给你展示出来,可以是xml格式,文本格式,也可以是图形化的执行方案。 2、预估执行计划,实际执行计划 选择语句,点击上面其中一个执行计划,预估执行计划可以立即显示,而实际执行计划则需要执行sql语句后出现。预估执行计划不等于实际执行计划,但是绝大多数情况下实际的执行计划跟预估执行计划都是一致的。统计信息变更或者执行计划重编译等情况下,会造成不同。 3、为什么要读懂执行计划 首先执行计划让你知道你复杂的sql到底是怎么执行的,有没有按照你想的方案执行,有没有按照最高效的方式执行,使用啦众多索引的哪一个,怎么排序,怎么合并数据的,有没有造成不必要资源浪费等等。官方数据显示,执行t-sql存在问题,80%都可以在执行计划中找到答案。 4、针对图形化执行计划分析 执行计划,可以以文本

硬核动图让你轻松弄懂递归,查找等概念

Deadly 提交于 2019-11-28 16:46:08
对于大部分人,数据结构一直是一个短板,当然我也是,不是学不会,而是容易忘,就拿最简单的排序来说吧,当时学习的时候明明已经弄得很清楚了,过了一段时间不用又忘记了,还要重新再看一遍,不知道有多少小伙伴和我有一样的烦恼。今天让我们用用动图的方式学习一下数据结构中的递归和二分查找吧,这种讲解方式非常生动,而且非常容易记住和理解。 一、递归 1.概念 递归简单的来说就是程序自己调用自己,就像下面这幅图一样,一直循环往复。 2.出口 如果程序一直这样循环往复的调用自己,一直都不结束,就是一个死循环, 这没什么意义。所以我们需要为递归定义一个结束条件,即递归的出口,当条件不满足时,递归一直前进,不断地调用自己;当边界条件满足时,递归返回。 递归的应用通常是把一个大型的比较复杂的问题,通过层层转化为一个与原问题相似的小的问题来求解,就像上边统计排队人数的问题。上边的这个小姐姐问第一个排队的人,有多少人排队,第一个人回答:我(1个人)+后边的人,小姐姐没有得到具体的答案,但是她知道只要弄清楚第一个人后边有多少人排队+第一个人就是排队的人数,所以她继续问后边的人,结果得到了相同的回答,于是她得到的答案变成了:1+1+后边的人。于是她不得不一直这样问下去,等到问到最后一个人的时候,最后一个人回答,就我一个人,到此刻小姐姐终于得到了想要的答案即:1+1+········+1。上边就是一个经典的递归的例子