服务器使用宝塔面板出现“您的请求在web服务器中没有找到对应的站点!”的解决办法 服务器使用宝塔面板出现“您的请求在web服务器中没有找到对应的站点!”...的解决办法 近期经常看到有站长朋友反应服务器出现以下报错: QQ图片20180720152852.png 这个提示是说您访问的域名,在这台服务器上没有找到对应的站点,其实就是配置文件没有正确读取才出现的...解决办法: 1.重载Apache配置,重启Apache服务。...采用第二条方式 2.连接进入linux服务器SSH终端,输入以下命令: /etc/init.d/httpd stop pkill -9 httpd /etc/init.d/httpd start 这三条命令在SSH
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。...return 0 } return process(root).max - 1 } // 建设以x节点为头的树,返回两个信息 type Info struct { // 在一条路径上...Info { if x == nil { return NewInfo(0, 0) } l := x.left r := x.right // 左树上...,不要求从左孩子出发,最大路径 // 左树上,必须从左孩子出发,往下的最大路径 linfo := process(l) // 右树上,不要求从右孩子出发,最大路径 //...右树上,必须从右孩子出发,往下的最大路径 rinfo := process(r) // 必须从x出发的情况下,往下的最大路径 len0 := 1 if l !
但是其重要性还是在加强,就拿C语言来讲是很多编程语言的基础而存在,主流很多编程语言的底层实现就是利用的C语言或者汇编来完成,C语言在编程领域的角色在发生变化,在早期一个很简单的功能模块可能都需要C语言实现很长时间才能稳定...回到编程语言的学习过程,编程语言学习最佳的方式掌握一定理论基础上有项目实战,如果两种条件都是具备的情况下可能几个月就能找到编程的感觉,而大部分自学编程的人更多是在网络上找到自己觉得重要的视频学习起来,并且通过...最好的学习编程的方式就是在掌握一定理论的基础上再去实践能够取得意想不到的效果。 ?...对于掌握编程的理论这个阶段对于大部分学习者来讲可能都能克服,最关键的实践对于绝大部分的自学者来讲就是一种极大的挑战,之所以存在挑战找不到匹配自己能力的实践机会,即使专门的培训机构也很难找到匹配的实践项目...,哪怕是不适合当时的阶段,转化成精神层面就是坚持让自己通过实践找到学些编程的感觉,如果可能的话还能够培养出兴趣出来。
> hel -> hell -> hello 到这里,不知道你有没有发现一点,我们在字典中寻找一个单词的过程,其实就是一个不断寻找这个单词前缀的过程。...通过之前的描述,你可以看到,其实我们每次在寻找的是一个个字符,将这个字符和之前找到过的所有字符拼接在一起就成了下一个前缀,每个字典树节点里面其实可以存放字符,然后一条由根节点往下的路径把路径上所有的节点串起来...,在树中,边其实是有方向性的,就是 parent -> child,因为除根节点外,每个节点只会有一个 parent 节点,那么就是说从根节点到树上的任意节点,只可能存在唯一的一条路径。...有了树节点,那么我们就可以通过输入的单词去构建树了,你也可以把它理解为在树上构建路径,代码如下: private TrieNode root = new TrieNode(); public void...另外查找一个单词其实和插入一个单词类似,就是确认一条路径是否存在的过程,这部分的代码我会在后面的题型解析部分展示。
思路分析 一开始我的想法是用BFS或者DFS去找到满足的路径,但是我只会找到一个,没有办法找出所有的,后来发现这道题并不是考这个玩意,因为它的每一个格子都会有满足的路径(注意这句话),所以一个格子会有多种路径是满足的...所以我们现在需要求解右边格子的路径数和下边格子的路径数,聪明的你有没有想到,这就是递归的思想。 递归过程,如果遇到边界,边界只有一条路径可以走,返回1即可。
之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了。虽然经典的文章当中背包一共有九讲,但除了竞赛选手,我们能理解到单调优化就已经非常出色了。...如果让我们用肉眼来看,稍微尝试一下就能找到答案,最长的路径应该是下图当中红色的这条: ? 但是如果让我们用算法来算,应该怎么办呢?...这道题其实有一个非常巧妙的办法,我们先不讲,先来看看动态规划怎么解决这个问题。...树上也是一样的,明白了这点之后,就只剩下了两个问题,第一个是状态是什么,第二个问题是状态之间怎么转移? 在之前的背包问题当中,状态就是背包当前用的体积,转移呢就是我们新拿一个物品的决策。...这种情况都没有问题,下面我们来把情况稍微再变得复杂一些,我们在树上多加入一层: ? 这张图稍微复杂了一些,但是路径也不难找到,应该是E-B-F-H。路径的总长度为12: ?
那么有没有一种办法能够让查找效率依然高,而且可以很容易地实现插入、删除呢?基于此,我们可以改用动态查找表,这种表结构是在查找过程中动态生成的。...二叉排序树又称为二叉搜索树、二叉查找树,其定义如下: 二叉排序树或是空树,或是满足如下性质的二叉树: 若其左子树非空,则左子树上所有结点的值均小于根结点的值 若其右子树非空,则右子树上所有结点的值均大于等于根结点的值
我们在github上看看官方简介 Gin is a web framework written in Go (Golang)....然后按照相同的前子数组把路由构造成树的结构 当需要寻址的时候,先把请求的 url 按照 / 切分,然后遍历树进行寻址,这样子有点像是深度优先算法的递归遍历,从根节点开始,不停的向根的地方进行延伸,知道不能再深入为止,算是得到了一条路径...对 url 进行切分、比较,可是时间复杂度是 O(2n),那么我们有没有更好的办法优化时间复杂度呢?大名鼎鼎的GIn框架有办法,往后看 算法是什么? 再来提一提算法是啥。...比上面提到的方式,在时间复杂度上来说真是大大滴优化呀 不过,仅仅是对于一次 http 请求来说,是看不出啥效果的 诶,敲黑板了,什么叫做前缀树呢?...每一种注册方式,最终都会反应到gin的路由树上面 普通注册路由 普通注册路由的方式是 router.xxx,可以是如下方式 GET POST PATCH PUT ... router.POST("/hi
今天是说有两个人分别叫做Alice和Bob在一棵树上玩游戏,这两个人名是业内的惯例。凡是两个人玩游戏的题目,主人公的名字很多都叫Alice和Bob,我也不知道这个惯例的由来,大家知道这么回事就好了。...不知道为什么看到这道题的时候,总是会想起费玉清的段子,不知道你们有没有这种感觉。 ? 样例 第一行输入一个数t,表示测试数据的组数。 对于每组数据首先有5个数,分别是n, a, b, da, db。...换句话说每一条路线都是思路,即使Bob跑得快如果不反向跑甩掉Alice的话,那么他也是一样会被Alice追上的。 所以我们接下来要做的就是深入分析这里的情况,把剩下的问题捋清楚。...也就是说在这棵树上至少有一条链路它的长度要大于2da才行,否则即使Bob再能跑也会被地形限制住。...对于一棵树而言,求它的最长链路还是比较简单的,我们也在之前的文章当中讲解过,其实就是对于每一个节点都求一个到叶子节点的最长距离和次长距离之和。所有的节点的距离最大的那个就是整棵树上的最长链路。
全索引扫描的不足 那如果我们在更深层次的看这个问题,其实他还潜藏了一个问题需要澄清,就是什么叫做使用了索引。 我们都知道,InnoDB是索引组织表,所有的数据都是存储在索引树上面的。...所以你现在知道了,当我们在讨论有没有使用索引的时候,其实我们关心的是扫描行数。 对于一个大表,不止要有索引,索引的过滤性还要足够好。...首先从联合索引上找到第1个年龄字段是张开头的记录,取出主键id,然后到主键索引树上,根据id取出整行的值; 判断年龄字段是否等于8,如果是就作为结果集的一行返回,如果不是就丢弃。...首先从联合索引树上,找到第1个年龄字段是张开头的记录,判断这个索引记录里面,年龄的值是不是8,如果是就回表,取出整行数据,作为结果集的一部分返回,如果不是就丢弃; 在联合索引树上,向右遍历,并判断年龄字段后...虚拟列 可以看到这个优化的效果还是很不错的,但是这个优化还是没有绕开最左前缀原则的限制,因此在联合索引你还是要扫描8000万行,那有没有更进一步的优化方法呢?
决策树与if-then规则 可以把决策树看成一个if-then规则的集合,则应满足互斥并且完备,即每一条实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。...决策树与条件概率分布 决策树还表示给定特征条件下类的条件概率分布,定义在特征空间的一个划分上,将特征空间划分为互不相交的单元或区域,并在每个单元定义一个类的概率分布就构成了一个条件概率分布。...决策树的一条路径对应于划分中的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。设X为表示特征的随机变量,Y为表示类的随机变量,则条件概率分布表示为P(Y|X)。...过拟合的原因在于学习时过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,解决方法是考虑决策树的复杂度,对已生成的树进行简化,成为剪枝(pruning),具体指从生成的树上裁掉一些子树或叶结点...对固定输入变量j可找到最优切分点s ? 遍历所有输入变量,找到最优的切分变量j,构成一个对(j,s),依次将输入空间划分成两个区域,对每个区域重复上述步骤,直到满足停止条件为止。
我们都知道,InnoDB是索引组织表,所有的数据都是存储在索引树上面的。比如上面的表t,这个表包含了两个索引,一个主键索引和一个普通索引。在InnoDB里,数据是放在主键索引里的。...所以你现在知道了,当我们在讨论有没有使用索引的时候,其实我们关心的是扫描行数。 对于一个大表,不止要有索引,索引的过滤性还要足够好。...] 首先从联合索引上找到第1个年龄字段是张开头的记录,取出主键id,然后到主键索引树上,根据id取出整行的值; 判断年龄字段是否等于8,如果是就作为结果集的一行返回,如果不是就丢弃。...我们来看看这个优化的执行流程: [图片] 首先从联合索引树上,找到第1个年龄字段是张开头的记录,判断这个索引记录里面,年龄的值是不是8,如果是就回表,取出整行数据,作为结果集的一部分返回,如果不是就丢弃...; 在联合索引树上,向右遍历,并判断年龄字段后,根据需要做回表,直到碰到联合索引树上名字的第1个字不是张的记录为止; 这个过程跟上面的差别,是在遍历联合索引的过程中,将年龄等于8的条件下推到所有遍历的过程中
),一行表数据只在主键索引树上存在 分析语句1: select name from student where name='linfeng'; 因为过滤字段是name且 只select了name一个字段...; 这种情况select的是name和uid,而这些在二级索引树上也是直接就有,所以搜索二级索引树就完事了。...的所有信息(回表) 而这个回表意味着更多的磁盘I/O,会影响效率,如果业务只需要uid、name,就别写select *了,这样可以避免回表(在二级索引树上查到主键,再去主键索引树上查找) 分析语句4:...,这次是这样查询的: 先用age=20在辅助索引树上查找,如果数据足够会找到多个结果,这个结果就是已经排好序的,不需要再using filesort 我们现在直接用第二个字段name作为过滤条件 我们看到这里没有用到索引...如果我们只用name作为过滤条件,这就没有办法使用索引匹配了,因为是优先用age排序。 所以我们经常说:多列索引一定要使用到第1个字段,这样才能用到索引!
树是一个很抽象的数据结构,因为它在自然界当中能找到对应的物体。我们在初学的时候,往往都会根据自然界中真实的树来理解这个概念。所以在我们的认知当中,往往树是长这样的: ?...在我们认知当中树应该是全连通的,就好像自然界中的一只蚂蚁,可以走到树上任何位置。不能全连通,自然就不是树。情况2也不对,因为有了环,树是不应该有环的。...原因很简单,因为我们每一次在删除边的时候都面临是否会破坏树上连通关系的拷问。比如下图: ? 如果我们一旦删去了AB这条边,那么一定会破坏整个结构的连通性。...由于没有环路,树上任意两点之间的路径,有且只有一条。因为如果存在两点之间的路径有两条,那么必然可以找到一个环路。它的证明很简单,但是我们很难凭自己想到这个结论。...所以我们要做的就是设计一个算法,可以维护树上点的连通性。 但是这又带来了一个新的问题,在树结构当中,连通性是可以传递的。
在Bytemountains有$N$座山峰,每座山峰有他的高度$h_i$。 有些山峰之间有双向道路相连,共$M$条路径,每条路径有一个困难值,这个值越大表示越难走....显然,若一个点能通过一条路径到达,那么我们走最小生成树上的边也一定能到达该节点。 这样我们把最小生成树建出来,就可以少考虑很多边了。 然而并没有什么卵用。。
/etc/passwd的时候就能访问到了 芜湖,再看看能不能读历史命令,如果可以读历史命令,可以看看有没有网站备份文件或者网站安装包,嘿嘿,改路径为/root/.bash_history,访问!...没办法了,从其他地方入手吧。...大概长这样 随后在管理网站用户的表里面发现了一个系统自带的账户(这里用账户x表示),账户x比admin权限还要高 把密码放到cmd5查一下 要钱?...再看看请求的地址 应该是upload类里面的Uploadfile方法(没学过Java,不知道对不对,别喷~) 找到了Uploadfile方法一行一行的看,头晕啊,但是最后还是找到了生成文件名的方法=-...,但是最后一个网卡的mac地址,就很难了,任意文件下载是下载不到带有网卡mac地址的文件的(如果有,当我放屁),又一条路被堵死了 过了几个小时(别问为啥是几个小时,因为睡觉去了),又发现一个上传点 嘿嘿
如果有没有看过上篇文章或者是最新关注的小伙伴,可以点击一下下方的传送门: 【硬核】机器学习与数据结构的完美结合——KD-tree 旋转不可行分析 上周我们实现了KD-Tree建树和查询的核心功能,然后我们留了一个问题...最朴素的办法就是重新建树,但是显然我们每次数据发生变动都把整棵树重建显然是不科学的,因为绝大多数数据是没有变化的,并且我们重新建树的成本很高,如果变动稍微频繁一些会导致大量的开销,这明显是不合理的。...我们来看下面这张图: 这是平衡树当中经典的左旋操作,它旋转前后都满足平衡树的性质,即左子树上所有元素小于根节点,小于右子树上所有元素。通过旋转操作,我们可以变更树结构,但是不影响二叉搜索树的性质。...我们再来看新增操作,二叉搜索树的纯新增操作其实是很简单的,我们只需要遍历树找到可以插入的位置即可。...我们就顺着树结构遍历,找到需要插入的叶子节点即可。由于我们使用替罪羊树的原理来维护树的平衡,所以我们在插入的是时候也需要维护子树当中节点的数量,以及会不会出发拍平操作。
这2个节点都在左子树上 这2个节点都在右子树上 综上,只要取这3种情况中的最大值,就是二叉树的直径。...右子树深度 int distance = depthOfTree(rootNode.leftNode) + depthOfTree(rootNode.rightNode); //2、最远距离在根节点左子树上...,即计算左子树最远距离 int disLeft = maxDistanceOfTree(rootNode.leftNode); //3、最远距离在根节点右子树上,即计算右子树最远距离...find) { //如果没有找到,然后在右子树中查找 find = isFoundTreeNode(rootNode.rightNode, treeNode, path)...因此我们可以先分别找到从根节点到这2个节点的路径,再从这两个路径中找到最近的公共父节点。
领取专属 10元无门槛券
手把手带您无忧上云