element

『数据结构与算法』AVL树(平衡二叉树)

廉价感情. 提交于 2020-12-20 14:06:43
GitHub源码分享 微信搜索:码农StayUp 主页地址: https://gozhuyinglong.github.io 源码分享: https://github.com/gozhuyinglong/blog-demos 1. AVL树 AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的 二叉查找树 ,又叫做平衡二叉树。在AVL树中任何节点的两个子树高度差最多为1,所以它又被称为高度平衡树。 如下图中可以清晰的看出,左边的树其根节点左子树高度为3,右子树高度为2,符合AVL树的特点;而右边的树其根节点左子树高度为3,右子树高度为1,不符合AVL树的特点。因此左边的树为AVL树,右边的树不是AVL树。 那么怎样才能保持这种平衡呢? 答案便是在插入或删除节点时,通过对树进行简单的修正来保持平衡,我们称之为 旋转 。 2. 旋转(rotation) 旋转分为单旋转(single rotation)和双旋转(double rotation)。 当左右子树的高度差超过1,并且最高的叶子节点在“外边”时,使用单旋转。 当左右子树的高度差超过1,并且最高的叶子节点在“里面”时,使用双旋转。 而单旋转又分为: 左旋转,即向左旋转。当右子树的高度大于左子树时,进行左旋转。 右旋转,即向右旋转。当左子树的高度大于右子树时,进行右旋转。 双旋转又分为: 左-右双旋转

vue+axios 前端实现登录拦截(路由拦截、http拦截)

╄→гoц情女王★ 提交于 2020-12-20 02:37:34
一、路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段 requireAuth ,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由, 否则就进入登录页面。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const routes = [ { path: '/' , name: '/' , component: Index }, { path: '/repository' , name: 'repository' , meta: { requireAuth: true , // 添加该字段,表示进入这个路由是需要登录的 }, component: Repository }, { path: '/login' , name: 'login' , component: Login } ]; 定义完路由后,我们主要是利用 vue-router 提供的钩子函数 beforeEach() 对路由进行判断。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 router.beforeEach((to, from , next) => { if (to.meta.requireAuth) { // 判断该路由是否需要登录权限 if (store.state

vue+axios 前端实现登录拦截(路由拦截、http拦截)

白昼怎懂夜的黑 提交于 2020-12-20 02:32:26
一、路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段 requireAuth ,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由, 否则就进入登录页面。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const routes = [ { path: '/' , name: '/' , component: Index }, { path: '/repository' , name: 'repository' , meta: { requireAuth: true , // 添加该字段,表示进入这个路由是需要登录的 }, component: Repository }, { path: '/login' , name: 'login' , component: Login } ]; 定义完路由后,我们主要是利用 vue-router 提供的钩子函数 beforeEach() 对路由进行判断。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 router.beforeEach((to, from , next) => { if (to.meta.requireAuth) { // 判断该路由是否需要登录权限 if (store.state

大佬说:怎么手写一个Tomcat然后、给这个Tomcat 部署项目并且成功处理请求 ? 我TM当时就吓尿了!

五迷三道 提交于 2020-12-20 00:10:07
@ TOC </font> <hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"> 前言 <font color=#999AAA >提示:上篇我们自定义了简单的Tomcat,但是不能去部署web项目,当然也不能从根据url进行访问: </font> 阅读本文前请先阅读: 自定义一个简单的Tomcat 即:自定义一个简单的Tomcat 可以访问静态页面,返回字符串等; <hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"> <font color=#999AAA >提示:如何在自定义Tomcat中部署外部的web项目呢? 一、怎么部署项目? <font color=#999AAA >示例:通常我们部署项目是在Tomcat的webapps下面将打好的1个或多个war包进去,也可以配置响应的上下文以及具体的项目路径,然后tomcat会根据指定的路径去访问,这期间Tomcat是怎么来根据这个路径去解析这些项目?怎么去根据不同的url去找到不同的项目以及处理不同的请求? 二、分析以及思路 1.Tomcat的配置文件 精简后的server.xml <?xml version="1.0" encoding=

vue+axios 前端实现登录拦截(路由拦截、http拦截)

北战南征 提交于 2020-12-19 18:53:12
vue+axios 前端实现登录拦截(路由拦截、http拦截) 一、路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段 requireAuth ,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由, 否则就进入登录页面。 const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: 'repository', meta: { requireAuth: true, // 添加该字段,表示进入这个路由是需要登录的 }, component: Repository }, { path: '/login', name: 'login', component: Login } ]; 定义完路由后,我们主要是利用 vue-router 提供的钩子函数 beforeEach() 对路由进行判断。 router.beforeEach((to, from, next) => { if (to.meta.requireAuth) { // 判断该路由是否需要登录权限 if (store.state.token) { // 通过vuex state获取当前的token是否存在 next(); } else { next({ path:

ArrayList源码分析

淺唱寂寞╮ 提交于 2020-12-19 18:24:57
一、核心变量 // 序列化ID private static final long serialVersionUID = 8683452581122892189L; // 默认初始化容量 private static final int DEFAULT_CAPACITY = 10; // 空数组 private static final Object[] EMPTY_ELEMENTDATA = {}; // 空数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 存储数据元素的数组 transient Object[] elementData; // non-private to simplify nested class access // 当前arraylist集合的大小,也就是elementData数组中数据元素的个数 private int size; 二、构造函数 /** * 一:无参构造方法 */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** * 二:携带一个int类型的参数,指定arraylist的初始容量 */ public ArrayList(int

Python+selenium WebDriver API

半腔热情 提交于 2020-12-19 16:55:22
目录 2.1 操作元素基本方法 2.2 常用8种元素定位(Firebug和firepath) 2.3 xpath定位 2.4 CSS定位 2.5 SeleniumBuilder辅助定位元素 2.6 操作元素(键盘和鼠标事件) 2.7 多窗口、句柄(handle) 2.8 定位一组元素elements 2.9 iframe 2.10 select下拉框 2.11 alert\confirm\prompt 2.12 单选框和复选框(radiobox、checkbox) 2.13 table表格定位 2.14 加载Firefox配置(略,已在2.1.8讲过,请查阅2.1.8节课) 2.14-1 加载Chrome配置 2.15 富文本(richtext) 正文 回到顶部 2.1 操作元素基本方法 前言 前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架。我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的API。 本篇主要讲如何用Python调用webdriver框架的API,对浏览器做一些常规的操作,如打开、前进、后退、刷新、设置窗口大小、截屏、退出等操作。 2.1.1 打开网页 1.从selenium里面导入webdriver模块 2.打开Firefox浏览器

5种Redis数据结构详解

倖福魔咒の 提交于 2020-12-19 15:24:57
本文主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家。 转载链接:https://www.php.cn/php-weizijiaocheng-388126.html 2.1.1 全局命令 1 查看所有键 key* 2 键总数 dbsize (dbsize命令在计算键总数的时候不会遍历所有键,而是直接获取Redis内置的键总数变量,时间复杂度为O(1),而keys命令会遍历所有键,时间复杂度为O(n),当Redis保存了大量键时,线上环境禁止使用) 3 检查键是否存在 exists key 存在返回1,不存在返回0 4 删除键 del key 返回成功删除键的个数,不存在的返回0 5 键过期 expire key seconds ttl 命令会返回剩余过期时间 -1 键没设置过期时间 -2 键不存在 6 键的数据类型结构 type key 返回类型,不存在返回none 2.1.2 数据结构和内部编码 每种数据结构都有自己的底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码 每种数据结构都有两种以上的内部编码实现,例如list数据结构包含了linkedlist和ziplist两种内部编码,可以通过object encoding命令查询内部编码 Redis这样设计有两个好处:   第一:可以改进内部编码

Flutter系列之Widget

我怕爱的太早我们不能终老 提交于 2020-12-19 07:30:18
一、Flutter的核心原则 Flutter包括一个现代的响应式框架、一个2D渲染引擎、现成的widget和开发工具 一切皆为widget 那么,什么是widget呢? Widget是Flutter功能的抽象描述,是视图的配置信息,同样也是数据的映射,是Flutter开发框架中最基本的概念。与其他将视图(View)、控制器(Controller)、活动(Activity)、应用(Application)、布局(Layout)等属性分离的框架不同,在Flutter中都是Widget Widget可以被定义为:一个结构元素(如按钮);一个文本样式元素(如字体或颜色等)等等 Widget渲染过程 如何结构化地组织视图数据,提供给渲染引擎,最后完成界面显示呢 通常情况下,对于这一问题,不同的UI框架会以不同的方式处理,但无一例外地都会用到视图树(View Tree)的概念。而Flutter将视图树进行了扩展,把视图数据的组织和渲染抽象为三层:Widget、Element和RenderObject 这三部分的关系为: Widget<----Element---->RenderObject Widget Widget是Flutter中对视图的一种结构化描述。Widget是控件实现的基本逻辑单位,里面存储的是有关视图渲染的配置信息,包括布局、渲染属性、事件响应等信息

C++之STL总结精华笔记

泪湿孤枕 提交于 2020-12-19 06:25:34
一、一般介绍 STL(StandardTemplate Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++Standard Library)中,是ANSI/ISOC++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。 从逻辑层次来看,在STL中体现了泛型化程序设计的思想(genericprogramming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-orientedprogramming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术; 从实现层次看,整个STL是以一种类型参数化(typeparameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便; 二、STL的六大组件 · 容器