leaf

《Fast Suboptimal Algorithms for the Computation of Graph Edit Distance》论文阅读

不羁岁月 提交于 2020-07-27 11:36:06
图编辑距离概念 两个图的编辑距离定义为一个图通过插入、删除和转换等操作变换为另一个图的最小代价。 最优的图编辑距离是一个np难问题,算法时间复杂度会随着图中的顶点数的增加程指数式上涨。 论文中的符合标记 A* 算法 A* 算法是一种最小代价优先的算法,代价函数 g(p) 衡量了搜索树中根节点到当前节点 p 的代价,h(p) 衡量了当前节点 p 到叶子节点的代价的估计,每次搜索的时候我们都选出 g(p) + h(p) 最小的节点来更新搜索状态知道找到最优路径。 我们可以看出来,h(p) 的高效估计是 A* 算法中非常重要的内容,本文中提到了两种估计方法: (1)把所有节点的 h(p) 都设为 0 时, A* 算法就相当于宽度优先算法,在本文中记为 PLAIN-A* 。 (2)先对图1和图2中没有处理的节点做转换操作(应为转换操作的代价一般比删除操作的代价低),在估计转换操作的代价的时候对图1中的每个节点贪婪的选取图2中与该节点转换代价最低的节点(其实就是允许图1中的多个节点转换到图2中的一个节点来获得比真实代价更小的估计代价)。经过转换操作后剩下的节点计算一下他们的删除代价就可以得到总的估计代价。该方法记为 HEURISTIC-A* 。原文: 注意:If the estimated costs h(p) are always lower than, or equal to, the

设计模式(8) 组合模式

最后都变了- 提交于 2020-07-27 10:14:19
组合模式 透明模式与安全模式 对组合的筛选遍历 无论是在生活中还是项目中,我们经常会遇到具有“部分-整体”概念的对象,比如员工与团队的关系,这就类似树形结构,可能具有很多的嵌套层次和分支,把这种复杂性直接暴露给调用端是不合适的。 组合模式 借助组合模式,可以将这类具有“部分-整体”的对象组合成树形的层次结构,并使得用户可以对单个对象和组合对象采用相同的使用方式。 GOF对组合模式的描述为: Compose objects into tree structures to represent part-whole hierarchies. Compositelets clients treat individual objects and compositions of objects uniformly. — Design Patterns : Elements of Reusable Object-Oriented Software UML类图: 组合模式包含三个角色: Leaf:叶子节点,代表单个个体,它没有子节点。 Composite:组合节点,既可以包含叶子节点,也可以包含其他的组合节点, Component:抽象构件,定义Leaf和Composite共有的方法和属性,可以定义一些默认的行为或属性。 透明模式与安全模式 在使用组合模式时,根据抽象构件类的定义形式

RouterOS 之带宽管理及 QOS --HTB (1 1 )

陌路散爱 提交于 2020-07-27 08:06:23
这一课,我们继续来学习带宽管理,上一课,我们学习 了简单队列 SIMPLE QUEUE,本节课,我们一起来学习 HTB。 HTB(Hierarchical Token Bucket 分层令牌桶)比简单 队列复杂很多。HTB 可以用来处理不同流量的优先级及带宽 分配。在做 HTB 的时有三个步骤: 1、流量分类及匹配、使用 Mangle 进行标记; 2、创建规则(策略),将不同的分类放入不同的 QUEUE; 3、分清上行和下行,附加到不同的“接口”或“队列”。 在做 HTB 的时候最重要的是要弄清楚各 QUEUE 之间的关 系。父子关系(Parent-Child) Parent Queue:父队列,顶层 Parent; Inner Queue:内部队列,有 Parent 和 Child; Leaf Queue:最下层,没有 Child; Inner Queue 只负责流量分配,Leaf Queue 可分配优先级。 双重限制: CIR:Committed Information Rate--Limit-at 保证速度 MIR:Maximal Information Rate--max-limit 最大速度 关系: 2 CIR(parent)≥ CIR(child1) +...+ CIR(childN) MIR (parent) ≥ MIR(child1) & MIR (parent)

分布式ID生成方式

梦想与她 提交于 2020-07-25 09:37:54
一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1、什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。 但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有 唯一ID 做标识。此时一个能够生成 全局唯一ID 的系统是非常必要的。那么这个 全局唯一ID 就叫 分布式ID 。 2、那么分布式ID需要满足那些条件? 全局唯一:必须保证ID是全局性唯一的,基本要求 高性能:高可用低延时,ID生成响应要块,否则反倒会成为业务瓶颈 高可用:100%的可用性是骗人的,但是也要无限接近于100%的可用性 好接入:要秉着拿来即用的设计原则,在系统设计和实现上要尽可能的简单 趋势递增:最好趋势递增,这个要求就得看具体业务场景了,一般不严格要求 二、 分布式ID都有哪些生成方式? 今天主要分析一下以下9种,分布式ID生成器方式以及优缺点: UUID 数据库自增ID 数据库多主模式 号段模式 Redis 雪花算法(SnowFlake) 滴滴出品(TinyID) 百度 (Uidgenerator

Tungsten Fabric入门宝典丨主流监控系统工具的集成

℡╲_俬逩灬. 提交于 2020-05-09 08:53:58
Tungsten Fabric入门宝典系列文章,来自技术大牛倾囊相授的实践经验,由TF中文社区为您编译呈现,旨在帮助新手深入理解TF的运行、安装、集成、调试等全流程。如果您有相关经验或疑问,欢迎与我们互动,并与社区极客们进一步交流。更多TF技术文章,请点击公号底部按钮>学习>文章合集。 作者:Tatsuya Naganawa 译者:TF编译组 尽管Tungsten Fabric具有不错的监视/警报功能,但可能需要将它们集成到完整的监视系统中。 让我举例说明如何将它们与Promethesus和EFK集成。 Prometheus (编者按:Prometheus 是一个开源监控系统,几乎所有云原生系统都以 Prometheus的指标格式输出运行时的监控信息。) 为了监视和可视化Tungsten Fabric系统中发生的情况,prometheus将是一种可能的选择。 一些工具(例如zabbix)支持抓取prometheus格式,因此在监视工具中作为通用格式也很有用: https://www.zabbix.com/documentation/4.2/manual/config/items/itemtypes/prometheus 要按prometheus进行抓取,需要以Prometheus的格式从Tungsten Fabric导出相关指标,有两种方法可以实现此目的: 直接从内省HTTP

分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案

 ̄綄美尐妖づ 提交于 2020-05-08 23:48:08
一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多的关注。但是对于大厂的那种大规模复杂业务、分布式高并发的应用场景,显然这种ID的生成方式不会像小项目一样仅仅依靠简单的数据自增序列来完成,而且在分布式环境下这种方式已经无法满足业务的需求,不仅无法完成业务能力,业务ID生成的速度或者重复问题可能给系统带来严重的故障。所以这一次,我们看看大厂都是怎么分析和解决这种ID生成问题的,同时,我也将我之前使用过的方式拿出来对比,看看有什么问题,从中能够得到什么启发。 分布式ID的生成特性 在分析之前,我们先明确一下业务ID的生成特性,在此特性的基础上,我们能够对下面的这几种生成方式有更加深刻的认识和感悟。 全局唯一,这是基本要求,不能出现重复。 数字类型,趋势递增,后面的ID必须比前面的大,这是从MySQL存储引擎来考虑的,需要保证写入数据的性能。 长度短,能够提高查询效率,这也是从MySQL数据库规范出发的,尤其是ID作为主键时。 信息安全,如果ID连续生成,势必会泄露业务信息,甚至可能被猜出,所以需要无规则不规则。 高可用低延时,ID生成快,能够扛住高并发,延时足够低不至于成为业务瓶颈。 分布式ID的几种生成办法

js插件---Bootstrap 树控件

*爱你&永不变心* 提交于 2020-05-08 21:05:42
js插件---Bootstrap 树控件 一、总结 一句话总结:可以直接用gojs,或者搜索js,jquery的树控件,或者bootstrap树控件,一大堆 gojs 二、JS组件系列——Bootstrap 树控件使用经验分享 前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项。不管怎么样,树控件都是很多项目里面不可或缺的组件之一。今天,博主打算结合自己的使用经历和网上找到的一些不错的树控件在这里做一个分享,希望能帮大家找到最合适的控件。还是那句话:控件没有最好,只有最合适。 一、JQuery树形控件 Jquery树形控件是一款基于JQuery+bootstrap、完全通过js和样式手写出来的非常轻量级的控件,网上很多地方都能看到它的影子。它功能简单、用户体验不错。对于一些简单的层级关系展示比较实用,但对于节点的增删改实现起来就不容易了,如果非要做,可能需要自己去封装。Demo及下载地址: http://www.jq22.com/jquery-info432 1、一睹初容 全部收起 展开一级 全部展开 2、代码示例 此控件实现起来也非常简单,只需要引用jQuery和bootstrap组件即可。 <link href="~/Content/Tree1/css/bootstrap.min.css"

lightgbm用于排序

柔情痞子 提交于 2020-05-07 11:47:42
一.   LTR(learning to rank)经常用于搜索排序中,开源工具中比较有名的是微软的ranklib,但是这个好像是单机版的,也有好长时间没有更新了。所以打算想利用lightgbm进行排序,但网上关于lightgbm用于排序的代码很少,关于回归和分类的倒是一堆。这里我将贴上python版的lightgbm用于排序的代码,里面将包括训练、获取叶结点、ndcg评估、预测以及特征重要度等处理代码,有需要的朋友可以参考一下或进行修改。   其实在使用时,本人也对比了ranklib中的lambdamart和lightgbm,令人映像最深刻的是lightgbm的训练速度非常快,快的起飞。可能lambdamart训练需要几个小时,而lightgbm只需要几分钟,但是后面的ndcg测试都差不多,不像论文中所说的lightgbm精度高一点。lightgbm的训练速度快,我想可能最大的原因要可能是:a.节点分裂用到了直方图,而不是预排序方法;b.基于梯度的单边采样,即行采样;c.互斥特征绑定,即列采样;d.其于leaf-wise决策树生长策略;e.类别特征的支持等 二.代码 第一部分代码块是主代码,后面三个代码块是用到的加载数据和ndcg。运行主代码使用命令如训练模型使用:python lgb.py -train等 完成代码和数据格式放在 https://github.com

判断一棵树是否为二叉搜索树,完全二叉树和二叉平衡树

泄露秘密 提交于 2020-05-07 09:10:01
1.  LeetCode - 98. Validate Binary Search Tree (判断一颗二叉树是不是一颗二叉搜索树)        什么是二叉搜索树?任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;       根据性质怎么判断一颗二叉树是不是搜索二叉树呢? 其实很简单,只要这颗二叉树的中序遍历的顺序是升序的,那么就是一颗二叉搜索树,因为中序遍历的顺序是左->中->右,所以当中序遍历升序的时候,就有左<中<右,所以就可以判断。 class Solution { public boolean isValidBST(TreeNode root) { if (root == null ) return true ; Stack <TreeNode>stack = new Stack<> (); TreeNode cur = root; TreeNode pre = null ; while (!stack.isEmpty() || cur != null ){ if (cur != null ){ stack.push(cur); cur = cur.left; } else { cur = stack.pop(); if (pre != null && cur.val <= pre

(精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths

拜拜、爱过 提交于 2020-05-05 11:40:36
(写题解不容易,来 我的博客 玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图。(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通分量中不包含桥。 例如下图(样例)中的边双连通分量有(1),(2,3,5,6),(4),(7) 不难发现,在一个边双连通分量中,任意两点都存在至少两条互相分离的路径;(如1->2与1->3->2) 如若不在一个边双连通分量中,则可能经过桥(甚至不联通)如:2->4。 由于桥是必须通过的,所以不存在两条互相分离的路径(或没有路径)。我们要做的,就是连边将整张图变成一张边双连通图。 (正文好像才开始) 首先是找出所有边双连通分量。不难发现,边双连通分量不包含桥,因此我们只需将桥无视掉,每一个连通的子图就是一个边双连通分量。(桥的公式大家都知道吧)代码如下: void tarjan(int u,int edge) { dfn[u]=low[u]=++num; for(int i=fst[u];i!=0;i=nex[i]) { int v=to[i]; if(!dfn[v]) { tarjan(v,i); low[u]=min(low[u],low[v]); if(dfn[u]<low[v]) //桥的公式qwq { bridg[i]=bridg[i^1]=1; } } else if(i