题目中常见的几种距离

距离

在几何学里面距离并不单指直线距离,有很多其他的距离没有那么常用,但考场上可能会出现,为了防止题目不给出定义等,我们有必要认识一下各种距离。

后面的角标为了清楚直接打到字母后面了

欧几里得距离

也被称作欧式距离,在平面直角坐标系中,设有两点 \(A(x_{1},y_{1}),B(x_{2},y_{2})\),他们的欧几里得距离其实就是两点所连成的线段的长度,初中也讲过计算公式:

\[|AB|=\sqrt{(x_{2}-x_{1})^{2}+(y_{2}-y_{1})^{2}} \]

这个公式怎么来的呢?看一下这张图:

image

我们可以看到我们的 \(A,B\) 两点,我们选了一个中转点 \(C\) 来帮助我们计算 \(|AB|\),而选择的 \(C\) 点与 \(A,B\) 构成了一个三角形,而我们要求的就是 \(h\),但是很明显是可以通过勾股定理来计算的,也就是 \(h=\sqrt{f^{2}+g^{2}}\),而 \(f\) 的值就是 \(|x_{2}-x_{1}|\)\(g\) 的值为 \(|y_{2}-y_{1}|\),平方后绝对值可以不加,所以得到了上面的公式。

当然我们不一定只在平面上解决这个问题,有可能会遇到三维空间的问题,也就是立体空间里面求解欧几里得距离。

image

技术有限

我们可以看到我们要求的是 \(A(x1,y1,z1),G(x2,y2,z2)\) 两点的距离 \(|AG|\),我们考虑这样来求解:

如果想要求 \(|AG|\),我们从图中可以看出 \(AG\)\(A,G,C\) 所在平面的一个直角三角形的斜边,而 \(GC\) 的长度我们是可以求出来的,就是 \(|z2-z1|\),所以问题转化为求 \(AC\) 的长度;\(AC\) 所在的平面为 \(ABCD\) ,我们可以直接用上面的公式来计算出 \(AC^{2}=(y2-y1)^{2}+(x2-y1)^{2}\),然后跟 \(GC\) 勾股定理一下就可以得出以下公式:

\[|AG|=\sqrt{(x2-x1)^2+(y2-y1)^2+(z2-z1)^2} \]

由此我们也可以推广到多维,但大多数情况用不到,而且我也不会证

虽然欧几里得距离很有用,但也有缺点,比如最后得出的答案往往都是带根号的,会存在一定的误差,在信息学里这是一个难以解决的问题。

曼哈顿距离

在二维的空间内,两个点之间的曼哈顿距离为他们横坐标之差的绝对值与纵坐标之差的绝对值的和。设 \(A(x1,y1),B(x2,y2)\),则两点之间的曼哈顿距离可以表示为

\[d(A,B)=|x1-x2|+|y1-y2| \]

image

例如上图中的蓝线为欧几里得距离,黑线为曼哈顿距离。

当然曼哈顿距离也可以通过类似欧几里得距离的推理出 N 维空间的公式。

\(A(x1,x2,\dots,xn),B(y1,y2,\dots,yn)\),则有:

\[d(A,B)=|x1-y1|+|x2-y2|+\dots+|xn-yn|\\ =\sum_{i=1}^{n}|xi-yi| \]

性质

曼哈顿距离有以下数学性质:

  • 非负性,这一点很明显就能看出来
  • 统一性,点到自身的曼哈顿距离为 \(0\)
  • 对称性,\(A\)\(B\)\(B\)\(A\) 的曼哈顿距离相等。
  • 三角不等式,从 \(i\)\(j\) 的直接距离不会大于途经的任何其他点 \(k\) 的距离。\(d(i,j)\le d(i,k)+d(k,j)\)

切比雪夫距离

切比雪夫距离是向量空间中的一种度量,两个点之间的距离定义为其各坐标数值差的最大值。

在二维空间内,两个点之间的切比雪夫距离为他们横坐标之差的绝对值和纵坐标之差的绝对值的最大值。设 \(A(x1,y1),B(x2,y2)\),则 \(A,B\) 之间的切比雪夫距离可以用公式表示为:

\[d(A,B)=\max(|x1-x2|,|y1-y2|) \]

\(n\) 维空间中 \(A(x1,x2,\dots,xn),B(y1,y2,\dots,yn)\) 的切比雪夫距离的公式可以表示为:

\[d(x,y)=\max\{|x1-y1|,|x2-y2|,\dots,|xn-yn|\} \]

曼哈顿距离与切比雪夫距离的相互转化

首先我们考虑曼哈顿距离为 \(1\) 的所有点组成的图像:

image

然后再来看看所有切比雪夫距离为 \(1\) 的图像:

image

对比一下,你会发现,这两个正方形是相似的。

所以我们可以找到曼哈顿距离与切比雪夫距离之间的关系!

我们假设 \(A(x1,y1),B(x2,y2)\),我们把曼哈顿距离中的绝对值拆开,能够得到四个值,这四个值中最大的是两个非负数之和,即曼哈顿距离。则 \(A,B\) 两点的曼哈顿距离为:

\[d(A,B)=|x1-x2|+|y1-y2|\\ =\max\{ x1-x2+y1-y2,x1-x2+y2-y1,x2-x1+y1-y2,x2-x1+y2-y1 \}\\ =\max(|(x1+y1)-(x2+y2)|,|(x1-y1)-(x2-y2)|) \]

欸,这不是 \((x1+y1,x1-y1)\)\((x2+y2,x2-y2)\) 两点的切比雪夫距离吗?

所以,将点 \((x,y)\) 转化为 \((x+y,x-y)\),新坐标系下的切比雪夫距离即为原坐标系下的曼哈顿距离。

那我们是不是也可以用切比雪夫距离转化成曼哈顿距离呢?

\(A(x1,y1),B(x2,y2)\) 的切比雪夫距离为:

\[d(A,B)=\max\{|x1-x2|,|y1-y2|\}\\ =\max\left\{ \left|\frac{x1+y1}{2}-\frac{x2+y2}{2}\right|+\left| \frac{x1-y1}{2}-\frac{x2-y2}{2} \right| \right\} \]

为什么呢?

还记得上面的两张图吗?把切比雪夫的转 \(45^{\circ}\) 后再缩小至 \(\frac{1}{2}\) 不就是曼哈顿距离的了吗?所以都带有 \(\frac{1}{2}\) 这个系数。

也就是说,将每一个点 \((x,y)\) 转化为 \((\frac{x+y}{2},\frac{x-y}{2})\),新坐标系下的曼哈顿距离即为原坐标系下的切比雪夫距离。

结论

  • 曼哈顿坐标系是通过切比雪夫坐标系旋转 \(45^{\circ}\) 后,再缩小到原来的一半得到的。

  • 将一个点 \((x,y)\) 的坐标转化为 \((x+y,x-y)\) 后,原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离。

  • 将一个点 \((x,y)\) 的坐标转化为 \((\frac{x+y}{2},\frac{x-y}{2})\) 后,原坐标系中的切比雪夫距离等于新坐标系中的曼哈顿距离。

碰到求切比雪夫距离或者曼哈顿距离的题目的时候,我们往往可以相互转化来求解。

\(L_{m}\) 距离

一般的,我们定义平面上两点 \(A(x1,y1),B(x2,y2)\) 之间的 \(L_{m}\) 距离为

\[d(L_{m})=(|x1-x2|^{m}+|y1-y2|^{m})^{\frac{1}{m}} \]

容易发现 \(L_{2}\) 就是欧几里得距离,\(L_{1}\) 就是曼哈顿距离。

汉明距离

汉明距离是两个字符串之间的距离,它表示两个长度相同的字符串对应位字符不同的数量

通常用于比较两个串的差异。

部分参考自http://www.luogu.com.cn/blog/xuxing/Distance-Algorithm

本文转载于网络 如有侵权请联系删除

相关文章

  • Zabbix 配置简介

    Zabbix的配置可分为9个模块:主机与组、监控项、触发器、事件、可视化配置、模板配置、告警配置、宏变量、用户与组一、主机和组1、客户端添加:https://www.jianshu.com/p/47a685a17764https://www.jianshu.com/p/df53930744ee2、zabbix提供了资产清单的功能,可以方便查看资产数据,在添加主机的时候可以自动设置或手动设置:二、监控项Item:1、Item由key+参数组成,key:system.cpu.load key:system.cpu.load[avg5]2、创建监控项:主机--监控项--创建监控项可以自定义更新的时间间隔,数据保留时间,应用集,可以添加映射值,映射值可以是系统默认的,也可以是自定义的,映射值的意思是因为它返回0或1这样的数值,我们可以根据实际业务显示,即返回0显示什么,返回1显示什么3、key的参数可以是默认值,写法为:icmpping[,,200,,500]即前两个参数为默认值,第4、5个参数也为默认值。如果参数有带引号,用\来转义。4、几个常用的系统自带的key:agent获取主机名等,k

  • Pod容器自动伸缩(HPA) 测试

    HPA(HorizontalPodAutoscaler)在k8s集群中用于POD水平自动伸缩,它是基于CPU和内存利用率对Deployment和Replicaset控制器中的pod数量进行自动扩缩容(除了CPU和内存利用率之外,也可以基于其他应程序提供的度量指标custommetrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由KubernetesAPI资源和控制器实现。资源决定了控制器的行为,控制器会周期性的获取CPU和内存利用率,并与目标值相比较后来调整replicationcontroller或deployment中的副本数量。HPA使用前提条件:集群中部署了MetricsServer插件,可以获取到Pod的CPU和内存利用率。Pod部署的Yaml文件中必须设置资源限制和资源请求。以下对K8S集群使用HPA进行Pod自动伸缩做个测试记录1.编译一个测试容器[root@k8s-master01work]#catkevin-t.yaml apiVersion:v1 kind:Service metadata: name:kevin-t

  • 电脑入侵的必要步骤知识

    针对性的电脑入侵,最重要的是掌握对方真实的IP地址。通过日常的观察确定对方常在时间,部署计划<确认防火墙<确认杀毒软件<购置或者是自己编写针对性的免杀<然后就是匿名!我所说的内容只是用来给大家扩展黑客知识,禁止任何人使用非法,也禁止在任何未授权的电脑上做测试;如需实战可以自己购置一台新的电脑进行模拟黑客攻防战!高度模拟实战我不建议使用虚拟机设备,模拟的目的是尽最大可能还原真实场景,拥有第二台个人电脑是你不二的选择;本文我只谈基础;2020年的今天相对来说要想成为一名黑客最快的方法就是从渗透测试工程师入手。因为网络上的自学渗透测试资源有太多优质的。只要你有心专心学习一到两年必有一技之长。假设我们接到的信息是从目标wifi网络进行电脑入侵测试或者是通过XX方法获取对方IP地址后进行直接性的电脑入侵。首先我们需要连接WIFI进行密码破解,来确定对方电脑是否与WIFI属于同一内网之中。密码破解部分我就忽略了可以参考公众号历史文章“新手黑客初学无线安全(WIFI)知识点与难度检测实战图文”订阅号“Esn技术社区”S1.Nmap不排除任何针对性,所以我们要确定的是内网有几个

  • 从react 编程 到 "好莱坞"

    概念ReactiveProgramming(响应式编程)已经不是一个新东西了。关于Reactive其实是一个泛化的概念,由于很抽象,一些理论性的介绍很容易把人带到沟里去,包括一些语言框架在实现上也会使用不同的一些概念。按照维基百科的解释:reactiveprogrammingisadeclarativeprogrammingparadigmconcernedwithdatastreamsandthepropagationofchange意思就是,ReactiveProgramming就是一种面向数据流、关注变更的声明式编程范式。面向数据流比较容易理解,而关注变更则说的应该是数据流的特点,比如来自某个界面元素属性的变更(前端领域)、又或是某个后端实体的更新事件(日志)..以下面的这个函数为例:c=a+b;复制这里定义了变量c是变量a、变量b之和,当a=1,b=2时,c的值就是3。假设我们在程序中执行了这个语句,那么对于一次执行过程所产生的c的值就是确定的(上下文中的a、b变量也是确定的)但是,如果a、b的值是不确定的呢?即这个语句仅仅是定义了变量c与变量a、b的计算关系,那么c的值就是可

  • Jenkins流水线环境变量权威指南

    你是否遇到过因环境变量问题导致调试流水线很长时间?这篇文章一定能解决你的问题。本文章翻译自博客https://e.printstacktrace.blog/jenkins-pipeline-environment-variables-the-definitive-guide/ 博客作者欢迎来到“JenkinsCookBook”系列的第一篇博客文章。今天,我们专注于有效地使用JenkinsPipeline环境变量。您将学习如何定义env变量,如何更新它们,以及如何在布尔表达式中正确使用它们。主要内容 列出环境变量读取环境变量设置环境变量将布尔值存储在环境变量中sh在env环境变量中获取输出1列出环境变量 让我们首先列出所有可用的环境变量。您可以通过两种不同的方法进行操作。您可以${YOUR_JENKINS_HOST}/env-vars.html在Jenkins主服务器上打开页面,以获取HTML页面上列出的所有环境变量的列表。 另外,您可以通过执行printenvshell命令列出所有环境变量。pipeline{ agentany stages{ stage("EnvVaria

  • Elasticsearch升级实践

    Elasticsearch从2010年发布第一个版本起,以其快节奏的迭代速度迅速发展,当前已发布到7.1.0版本。其快节奏的迭代速度,也已使得集群升级成为Elasticsearch使用过程中很重要的一个话题。本文通过实际操作的方式,记录了一次6.5.1版本集群升级到6.7.1的过程,希望能为大家进行集群升级提供参考。1.升级方式参考官方文档[UpgradeElasticsearch],不同版本的升级方式参考下表原版本升级版本升级方式5.x5.yRollingupgrade(wherey>x)5.66.xRollingupgrade5.0-5.56.xFullclusterrestart<5.x6.xReindextoupgrade6.x6.yRollingupgrade(wherey>x)注意从5.x升级到6.x时,需要删除或者reindx2.x创建的索引本次升级是从6.5.1升级到6.7.1,因此直接使用滚动升级即可,升级过程参考:参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.7/rolli

  • CSS中用 opacity、visibility、display 属性将 元素隐藏 的 对比分析

    说明opacity用来设置透明度 display定义建立布局时元素生成的显示框类型 visibility用来设置元素是否可见。 opacity、visibility、display这三个属性分别取值0、hidden、none都能使元素在页面上看不见,但是他们在方方面面都还是有区别的。是否占据页面空间举个例子<!doctypehtml> <htmllang="en"> <head> <metacharset="UTF-8"> <style> .yellow{ width:100px; height:100px; background:yellow; } .red{ width:100px; height:100px; background:red; } </style> </head> <body> <divclass="yellow"></div> <divclass="red"&g

  • HDU 3595 GG and MM(Every-SG)

    ProblemDescriptionGGandMMlikeplayingagamesincetheyarechildren.Atthebeginningofgame,therearetwopilesofstones.MMchoosesapileofstonesfirst,whichhasxstones,andthenshecanchooseapositivenumberkandremovek*xstonesoutfromtheotherpileofstones,whichhasystones(Ithinkallofyouknowthaty>=k*x--!).ThenitcomestheturnofGG,followedtherulesabove-mentionedaswell.Whensomeonecan'tremoveanystone,thenhe/shelosesthegame,andthisgameisfinished. Manyyearslater,GGandMMfindthisgameistoosimple,sotheydecidedtoplayNgames

  • 零基础学编程033:字符串的split拆分与join连接

    在《零基础学编程021:获取股票实时行情数据》这一节里,我们学了split()函数,可以将一个字符串切开。假设有一个历史行情字符串,信息包括:股票名称、开盘价、最高价、最低价、收盘价、交易量等,用split()之后可以方便地取出任何一个价格,例如:v[1]就是开盘价。hq="谷歌,843.64,847.24,840.8,845.62,779900" v=hq.split(',') print(v) #输出结果:['谷歌','843.64','847.24','840.8','845.62','779900']复制可以看到print(v)的输出内容是一个列表list,python将其输出时,会在前后加上中括号[],里面的每一项内容仍是字符串,显示出来不直观。如果你想把这些字符串再重新拼起来,以前有编程基础的朋友马上会这样做:v=['谷歌','843.64','847.24

  • 移动互联网IM之协议设计

    导语:如果想自己动手实现一个移动互联网IMapp,要怎么做?第一个要解决的问题就是IM协议的设计。本文将讲述如何从0到1设计一个私有的tcp协议。 虽然现在市面上已经存在各种各样的消息推送SDK如信鸽,但可能由于各种原因无法全面满足需求,还是想自己实现一个IM或推送功能。那么你需要解决哪些问题呢?首先面临的第一个问题就是如何实现IM协议?传输协议选择传输协议一般是指TCP和UDP协议。UDP协议是无连接的,面向消息的,主要提供高效率服务。它的效率高,占资源少,但是其传输不可靠,只管发送,不管对方是否收到,虽然可以通过其他手段来实现可靠性。TCP是面向连接的,面向流的,主要提供可靠性服务。可靠性正是IM最需要的特性,所以现在主流IM基本都是使用TCP协议实现的。   关于PCQQ仍然在使用UDP的问题,经过私下了解是由于历史原因,所以一直沿用到现在。笔者猜测应该是因为当年C10K问题没有得到很好的解决,因为TCP是面向连接的,当时还没有epoll技术的存在,无法很好地解决同时在线的高负载问题,所以只能使用UDP了,因为UDP是无连接的,没有负载问题,但UDP又不可靠,所以只能在UDP上实

  • R绘图练习 | 突出显示个别条形的重叠条形图

    ?专注R语言在?生物医学中的使用首先是加载R包和数据library(tidyverse) library(ggtext) library(showtext) showtext_auto() load("E:/R/r-learning/r4ds/000files/df_animals_2.rdata") 复制主题设置theme_set(theme_minimal(base_size=19,base_family="Girassol")) theme_update( text=element_text(color="grey12"), axis.title=element_blank(), axis.text.x=element_text(family="IosevkaCurly"), axis.text.y=element_blank(), panel.grid.major.y=element_blank(), panel.grid.minor=element_blank(), plot.margin=m

  • 腾讯云文件存储查询CFS服务状态api接口

    1.接口描述接口请求域名:cfs.tencentcloudapi.com。 本接口(DescribeCfsServiceStatus)用于查询用户使用CFS的服务状态。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeCfsServiceStatus。 Version 是 String 公共参数,本接口取值:2019-07-19。 Region 是 String 公共参数,详见产品支持的地域列表。 3.输出参数 参数名称 类型 描述 CfsServiceStatus String 该用户当前CFS服务的状态,none为未开通,creating为开通中,created为已开通 RequestId Str

  • 腾讯云网络流日志创建流日志

    目前支持采集弹性网卡、NAT网关、云联网跨地域流量的流日志,本章节介绍如何创建流日志。 说明: NAT网关、云联网跨地域流量日志目前处于内测中,如需使用,请提交工单申请。 前提条件 由于流日志数据需要写入日志服务CLS,请确保已完成授权CLS,方可查看日志数据,具体请参见授权流日志访问CLS权限。 已创建好日志集和日志主题: 如需使用高级分析仪表盘功能,则只能选择携带“Flowlog”标识的“flowlog_logset”日志集和其下的日志主题,请提前参考主题配置页面创建。 如不使用高级分析仪表盘功能,可选择任意日志集和日志主题。可通过在CLS控制台创建不携带“Flowlog”标识的日志集和日志主题,也可通过流日志控制台,在主题配置页面,创建携带“Flowlog”标识的日志集和日志主题。 操作步骤创建流日志 登录私有网络控制台,在左侧导航栏选择流日志>日志列表。 在流日志页面左上角选择地域,然后单击+新建,并在新建流日志对话框中配置以下参数: 字段 含义 名称 该流日志的名称。 采集范围 指定流日志采集范围,目前支持弹性网卡、NAT网关、云联网。

  • jenkins + gitlab 利用pipeline 完整构建项目

    jenkA 安装 Tomcat安装: tarzxvfjdk-8u45-linux-x64.tar.gzmvjdk1.8.0_45/usr/local/jdktarzxfapache-maven-3.5.0-bin.tar.gzmvapache-maven-3.5.0/usr/local/mavenvi/etc/profileJAVA_HOME=/usr/local/jdkPATH=$JAVA_HOME/bin:$PATH:/usr/local/maven/binexportJAVA_HOMEPATHsource/etc/profile复制 Docker安装: tarzxvfjdk-8u45-linux-x64.tar.gzmvjdk1.8.0_45/usr/local/jdktarzxfapache-maven-3.5.0-bin.tar.gzmvapache-maven-3.5.0/usr/local/mavendockerrun-d--namejenkins-p8080:8080-p50000:50000-uroot\-v/opt/jenkins_home:/var/jenkins

  • 为Android Studio中的SettingsActivity定制任务栏

    AndroidStudio为开发者提供了很多内建的Activity,其中SettingsActivity是非常有用且功能强大的一种内建Activity. SettingActivity其实本质上是从PreferenceActivity中继承过来的。使用SettingActivity后,完全不需要自己控制Preferences的读写,PreferenceActivity会帮我们处理一切。 PreferenceActivity和普通的Activity不同,它不再使用普通的界面布局文件,而是使用选项设置的布局文件。选项设置的布局文件以PreferenceScreen作为根元素,每一个PreferenceScreen对应后台的一个PreferenceFragment。 使用AndroidStudio添加一个Activity,会默认帮我们生成一个Pref_header.xml文件和若干个Pref*.xml文件。对应到Activity里,需要对应定义几个PreferenceFragment和重写onBuildHeaders方法用于载入定义在Pref_header.xml中的入口布局。 相应的代

  • CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表

    传送门 最小值最大考虑二分答案,不难发现当最小值\(mid\)确定之后,原点到所有直线的距离一定都是\(mid\)时才是最优的,也就是说这些直线一定都是\(x^2+y^2=mid^2\)的切线。 接下来考虑一个点会被哪些切线所保护。作出这个点到圆的公切线,得到两个切点,那么在这两个切点之间的优弧上选择一个点,以它为切点的切线就可以保护当前点。也就是说能够保护一个点的切线的切点在圆上表现为一段角度的区间。可以用解析几何计算出这个角度的区间。 接下来需要在\([-\pi,\pi]\)上选择不超过\(M\)个点使得所有区间都被包含,但是区间在环上不太好做。考虑断环成链,将每个角度区间复制一份,左右端点均增加\(2\pi\),这样我们只需要在数轴上选择\(M\)个点满足按照左端点排序之后连续的\(N\)个区间都包含了至少一个点。 设某个方案中选择的数轴上最左边的点能够影响的最左的区间为\(p\)。我们枚举\(p\),然后贪心地向后选点。设\(f_p\)表示最大的\(r\)满足\([p,r)\)的所有区间有交,这个可以二分+ST表维护。那么我们选点一定会选择将\([p,f_p)\)覆盖,然后就

  • 查询相关股票十档行情的方法

    #!/usr/bin/envpython3.5 #-*-coding:utf8-*- importtime,os importasyncio importaiohttp #十档行情 classLeverfun: stock_api='https://app.leverfun.com/timelyInfo/timelyOrderForm' def__init__(self): self.stocks_dict=dict() defstocks(self,stock_codes): iftype(stock_codes)isnotlist: stock_codes=[stock_codes] threads=[] forstockinstock_codes: threads.append(self.get_stock_detail(stock)) try: loop=asyncio.get_event_loop() exceptRuntimeError: loop=asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_

  • mov指令图灵完备

    https://drwho.virtadpt.net/files/mov.pdf 挺有意思的文章。学习一下。 1.机器模型 先给出我们假设的简易机器模型。我们的机器模型支持随机内存访问,最小内存单元是word。寄存器有n个,分别是R1,R2,...Rn,每个都可以储存word。 x86的mov有很多种寻址模式,既可以读写内存,也可以保存立即数到寄存器。很强,但是它不能执行仍和条件跳转或者比较,所以很显然mov这个指令本身不是图灵完备(Turing-complete)的。 我们有三种指令,都是mov的变体,它有三种寻址模式 基于这三种又衍生出一些,比如我们可以用下面的方式实现数组读写 towritemore

  • 【转】详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

    1前言   昨天新接了一个需要,“拦截XXX,然后OOO”,好吧,说白了就是要用拦截器干点事(实现一个具体的功能)。之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读。因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读。 2拦截器 2.1概念   Java里的拦截器是动态拦截action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-OrientedProgramming,面向切面编程)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。 2.2原理   拦截器Interceptor的拦截功能是基于Java的动态代理来实现的,具体可以参考博文“用Java实现拦截器Interceptor的拦截功能”,也可以通过阅读Spring源代码来了解更为权威的实现细节。 3实现方法   在Spring框架之中,咱们要想实现拦截

  • 安卓开源项目周报0426

    由OpenDigg 出品的安卓开源项目周报第十八期来啦。我们的安卓开源周报集合了OpenDigg一周来新收录的优质的安卓开源项目,方便安卓开发人员便捷的找到自己需要的项目工具。 litho 创建Android高效UI Matisse Android本地图像选择器 SuperTextView 提高构建项目的效率 Android-InfiniteCards 可自定义动效的卡片切换视图 Meepo 类retrofit路由生成器 LBehavior 简单实现标题栏导航栏滑动动画 RxPicker 基于RxJava的Android图片选择器. TwsPluginFramework 解决大中项目团队的队协作问题 SlimAdapter 整洁的类型化Adapter BottomNavBar 轻松添加四个选项卡的导航栏 IdentityImageView 带进度条的图片框架 okhttp-oauth2-client 使用OkHttp的安卓OAuth2客户端

  • 【ORACLE】MD5加密

        今天乌干达充值卡入库时,发现有资源已经存在的异常,异常原因经过核实是由于卡资源密码在库中已经存在,为进一步查找存在的原因,因此需要对导入文件密码的MD5加密,通过MD5加密后的字符串去数据库中查询重复资源   Utl_Raw.Cast_To_Raw(sys.dbms_obfuscation_toolkit.md5(INPUT_STRING=>'1'))   [处理方法] 1-通过现场导入的EXCEL模板,将数据导入到ORACLE中temp_excel表中2-使用脚本实现MD5加密 declarev_pwdVARCHAR2(1024);v_md5varchar2(1024);cursorc_dataisselectte.colcomid,te.phyresourceincodestrfromtemp_excelte;beginforv_datainc_dataloopv_pwd:=v_data.phyresourceincodestr;v_md5:=Utl_Raw.Cast_To_Raw(sys.dbms_obfuscation_to

相关推荐

推荐阅读