位姿检索PoseRecognition:LSH算法.p稳定哈希
位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的。主要的工作会转移到特征提取和检索的算法上面来,有得必有失。因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海。
0:转自wiki:http://en.wikipedia.org/wiki/Locality_sensitive_hashing
以下参考资料仅供参考:LSH理解及相关资料:http://s99f.blog.163.com/blog/static/35118365201262691335382/
有一篇代码的实现:http://blog.sina.com.cn/s/blog_ad9597a30101o0ix.html
一:局部敏感哈希—原始分解
原文链接:http://www.jiahenglu.net/NSFC/LSH.html
LSH(Location Sensitive Hash),即位置敏感哈希函数。为保序哈希,也就是散列前的相似点经过哈希之后,也能够在一定程度上相似,并且具有一定的概率保证。
形式化定义:
对于任意q,p属于S,若从集合S到U的函数族H={h1,h2...hn}对距离函数D(,),如欧式距离、曼哈顿距离等等,满足条件:
则称D(,)是位置敏感的。
如下图,空间上的点经位置敏感哈希函数散列之后,对于q,其rNN有可能散列到同一个桶(如第一个桶),即散列到第一个桶的概率较大,会大于某一个概率阈值p1;而其(1+emxilong)rNN之外的对象则不太可能散列到第一个桶,即散列到第一个桶的概率很小,会小于某个阈值p2.
LSH的作用
◆高维下近似查询
相似性检索在各种领域特别是在视频、音频、图像、文本等含有丰富特征信息领域中的应用变得越来越重要。丰富的特征信息一般用高维向量表示,由此相似性检索一般通过K近邻或近似近邻查询来实现。一个理想的相似性检索一般需要满足以下四个条件:
1. 高准确性。即返回的结果和线性查找的结果接近。
2. 空间复杂度低。即占用内存空间少。理想状态下,空间复杂度随数据集呈线性增长,但不会远大于数据集的大小。
3. 时间复杂度低。检索的时间复杂度最好为O(1)或O(logN)。
4. 支持高维度。能够较灵活地支持高维数据的检索。
传统主要方法是基于空间划分的算法——tree类似算法,如R-tree,Kd-tree,SR-tree。这种算法返回的结果是精确的,但是这种算法在高维数据集上的时间效率并不高。实验[1]指出维度高于10之后,基于空间划分的算法时间复杂度反而不如线性查找。LSH方法能够在保证一定程度上的准确性的前提下,时间和空间复杂度得到降低,并且能够很好地支持高维数据的检索。
◆分类和聚类
根据LSH的特性,即可将相近(相似)的对象散列到同一个桶之中,则可以对图像、音视频、文本等丰富的高维数据进行分类或聚类。
◆数据压缩。如广泛地应用于信号处理及数据压缩等领域的Vector Quantization量子化技术。
总而言之,哪儿需要近似kNN查询,哪儿都能用上LSH.
[1] Weber R, Schek H, Blott S. A quantitative analysis and performance study for similarity search methods in high dimensional spaces Proc.of the 24th Intl.Conf.on Very Large Data Bases (VLDB).1998:194-205
LSH的经典论文作者:http://www.informatik.uni-trier.de/~ley/pers/hd/m/Ma:Yi
http://research.microsoft.com/en-us/people/mayi/publications.aspx
32.Segmentation of Natural Images by Texture and Boundary Compression,
Hossein Mobahi, Shankar Rao, Allen Yang, Shankar Sastry, andYi Ma, submitted to the International Journal of Computer Vision (IJCV), March 2010.
X: Compact Projection: Simple and Efficient Near Neighbor Search with Practical Memory Requirements
二:方法:Methods
汉明Bit重采样:Bit sampling for Hamming distance(original hash )
One of the easiest ways to construct an LSH family is by bit sampling.[3]
This approach works for the Hamming distance over d-dimensional vectors . Here, the family
of hash functions is simply the family of all the projections of points on one of the coordinates, i.e., 必须把特征转化到汉明空间,利用汉明距离;,
where is theth coordinate of.
A random function from simply selects
a random bit from the input point. This family has the following parameters:,.
Min-wise independent permutations
Suppose is composed of subsets of some ground set of enumerable items
and the similarity function of interest is theJaccard index.
If is a permutation on the indices of, for
let. Each possible choice of
defines a single hash function mapping input sets to integers.
Define the function family to be the set of all such functions and let
be the uniform distribution. Given two sets the event that
corresponds exactly to the event that the minimizer of lies inside.
As was chosen uniformly at random,
and define an LSH scheme for the Jaccard index. 集合的 jaccard距离:一般用来判定文本相似度;
Because the symmetric group on n elements has size n!, choosing a truly random permutation from the full symmetric group is infeasible for even moderately sized n. Because of this fact, there has
been significant work on finding a family of permutations that is "min-wise independent" - a permutation family for which each element of the domain has equal probability of being the minimum under a randomly chosen.
It has been established that a min-wise independent family of permutations is at least of size.[9]
and that this boundary is tight[10]
Because min-wise independent families are too big for practical applications, two variant notions of min-wise independence are introduced: restricted min-wise independent permutations families,
and approximate min-wise independent families. Restricted min-wise independence is the min-wise independence property restricted to certain sets of cardinality at most k.[11]
Approximate min-wise independence differs from the property by at most a fixed .[12]
Nilsimsa Hash
Nilsimsa is ananti-spam focused locality-sensitive hashing algorithm.[13]
The goal of Nilsimsa is to generate a hash digest of an email message such that the digests of two similar messages are similar to each other. Nilsimsa satisfies three requirements outlined by the paper's authors:
- The digest identifying each message should not vary signicantly (sic) for changes that can be produced automatically.
- The encoding must be robust against intentional attacks.
- The encoding should support an extremely low risk of false positives.
Random projection:
The random projection method of LSH[4]
(termed arccos by Andoni and Indyk
[14]) is designed to approximate thecosine
distance between vectors. The basic idea of this technique is to choose a randomhyperplane (defined by a normal unit vector)
at the outset and use the hyperplane to hash input vectors.
Given an input vector and a hyperplane defined by,
we let. That is,
depending on which side of the hyperplane lies.
Each possible choice of defines a single function. Let
be the set of all such functions and let be the uniform distribution once again. It is not difficult to prove that, for two vectors,,
where is the angle between and.
is closely related to.
In this instance hashing produces only a single bit. Two vectors' bits match with probability proportional to the cosine of the angle between them.
Stable distributions:基于p稳定分布的hash.
The hash function[15]
maps ad dimensional vector onto a set of integers映射到一个数轴线段区间的整数上. Each hash function in the family is indexed by a choice
of random and where
is ad dimensional vector with entries chosen independently from a stable distribution and is a real number chosen uniformly from the range [0,r]. For a fixed
the hash function is given by.
Other construction methods for hash functions have been proposed to better fit the data.[16]
In particular k-means hash functions are better in practice than projection-based hash functions, but without any theoretical guarantee.
三:基于p稳定分布的LSH
原文链接:http://blog.sina.com.cn/s/blog_67914f2901019p3v.html
LSH是用局部敏感的方法解决近似最近邻搜索的问题。在原始的LSH方法中,通过将原始空间嵌入到Hamming空间中,将d维空间转换成d'=Cd维的Hamming空间(C是指原始空间中点的坐标的最大值,具体情况参见上一部分中的第4节-算法步骤),使用(r,(1+e)r,1-r/d',1-(1+e)r/d')-敏感哈希函数来解决(r,e)-Neighbor问题。而后来提出的p-stableLSH算法中,不需要将原始空间嵌入到Hamming空间中,可以直接在欧几里得空间下进行局部敏感哈希运算。
其映射 具有相同的分布,此处X是一个符合D分布的随机变量。
P(C)=P(a,b)[ Ha,b(V1)= Ha,b(V2)]=积分(1/c *fp(t/c)(1/t/r))t
不能通过某点的概率来生成其密度函数,虽然密度函数的意义是fp(x)=Pr(|X|=x),但反过来是不成立的。因此,要求c|X|=t的概率,只能通过密度函数的定义来解决。
四:hash方法的使用过程:
Amplification:详细描述
Given a -sensitive family,
we can construct new families by either the AND-construction or OR-construction of.[1]
To create an AND-construction, we define a new family of hash functions,
where each function is constructed from random
functions from. We then
say that for a hash function,
if and only if all for.
Since the members of are independently chosen for any,
is a-sensitive family.
To create an OR-construction, we define a new family of hash functions,
where each function is constructed from random
functions from. We then
say that for a hash function,
if and only if for one or more values of.
Since the members of are independently chosen for any,
is a-sensitive family. 重点是:如何构建hash函数族...
LSH algorithm for nearest neighbor search:算法步骤
One of the main applications of LSH is to provide a method for efficient approximatenearest
neighbor search algorithms. Consider an LSH family . The algorithm has two main parameters: the width parameter
and the number of hash tables.
In the first step, we define a new family of hash functions,
where each function is obtained by concatenating
functions from, i.e.,.
In other words, a random hash function is obtained by concatenating
randomly chosen hash functions from. The algorithm then constructs
hash tables, each corresponding to a different randomly chosen hash function.
In the preprocessing step we hash all points from the data set
into each of the hash tables. Given that the resulting hash tables have only
non-zero entries, one can reduce the amount of memory used per each hash table to using standardhash
functions.
Given a query point
, the algorithm iterates over the hash functions.
For each considered, it retrieves the data points that are hashed into the same bucket as.
The process is stopped as soon as a point within distance from
is found.
Given the parameters and,
the algorithm has the following performance guarantees:
- preprocessing time:, where
is the time to evaluate a function on an input point; - space: , plus the space for storing data points;
- query time: ;
- the algorithm succeeds in finding a point within distance from
(if there exists a point within distance) with probability at least;
For a fixed approximation ratio and probabilities
and, one can set
and, where.
Then one obtains the following performance guarantees:
- preprocessing time:;
- space: , plus the space for storing data points;
- query time: ;
五:Locality
Sensitive Hashing(LSH)之随机投影法
原文链接:http://www.strongczq.com/2012/04/locality-sensitive-hashinglsh%E4%B9%8B%E9%9A%8F%E6%9C%BA%E6%8A%95%E5%BD%B1%E6%B3%95.html
为什么随即投影法是可行的?应该怎么去函数族的参数?以及正确率表现?
1. 概述
LSH是由文献[1]提出的一种用于高效求解最近邻搜索问题的Hash算法。LSH算法的基本思想是利用一个hash函数把集合中的元素映射成hash值,使得相似度越高的元素hash值相等的概率也越高。LSH算法使用的关键是针对某一种相似度计算方法,找到一个具有以上描述特性的hash函数。LSH所要求的hash函数的准确数学定义比较复杂,以下给出一种通俗的定义方式:
对于集合S,集合内元素间相似度的计算公式为sim(*,*)。如果存在一个hash函数h(*)满足以下条件:存在一个相似度s到概率p的单调递增映射关系,使得S中的任意两个满足sim(a,b)>=s的元素a和b,h(a)=h(b)的概率大于等于p。那么h(*)就是该集合的一个LSH算法hash函数。
一般来说在最近邻搜索中,元素间的关系可以用相似度或者距离来衡量。如果用距离来衡量,那么距离一般与相似度之间存在单调递减的关系。以上描述如果使用距离来替代相似度需要在单调关系上做适当修改。
根据元素相似度计算方式的不同,LSH有许多不同的hash算法。两种比较常见的hash算法是随机投影法和min-hash算法。本文即将介绍的随机投影法适用于集合元素可以表示成向量的形式,并且相似度计算是基于向量之间夹角的应用场景,如余弦相似度。min-hash法在参考文献[2]中有相关介绍。
2 随机投影法(Random projection)
假设集合S中的每个元素都是一个n维的向量:
,集合中两个元素v⃗ 和u⃗ 之间的相似度定义为
。
对于以上元素集合S的随机投影法hash函数h(*)可以定义为如下:
在n维空间中随机选取一个非零向量x⃗ ={x1,x2,…,xn}。考虑以该向量为法向量且经过坐标系原点的超平面,该超平面把整个n维空间分成了两部分,将法向量所在的空间称为正空间,另一空间为负空间。那么集合S中位于正空间的向量元素hash值为1,位于负空间的向量元素hash值为0。判断向量属于哪部分空间的一种简单办法是判断向量与法向量之间的夹角为锐角还是钝角,因此具体的定义公式可以写为
。
根据以上定义,假设向量v⃗ 和u⃗ 之间的夹角为θ,由于法向量x⃗ 是随机选取的,那么这两个向量未被该超平面分割到两侧(即hash值相等)的概率应该为:p(θ)=1−θπ。假设两个向量的相似度值为s,那么根据θ=arccos(s),有
。因此,存在相似度s到概率p的单调递增映射关系,使得对于任意相似度大于等于s的两个元素,它们hash值相等的概率大于等于p(s)。所以,以上定义的hash值计算方法符合LSH算法的要求。
以上所描述的h(*)函数虽然符合LSH算法的要求,但是实用性不高。因为该hash函数只产生了两个hash值,没有达到hash函数将元素分散到多个分组的目的。为了增加不同hash值的个数,可以多次生成独立的函数h(*),只有当两个元素的多个h(*)值都相等时才算拥有相同的hash值。根据该思路可以定义如下的hash函数H(*):
。其中每个hi(v⃗ )表示一个独立的h(*)函数,H(*)函数值的二进制表现形式中每一位都是一个h(*)函数的结果。
以H(*)为hash函数的话,两个相似度为s的元素具有相同hash值的概率公式为
。hash值的个数为2b。很容易看出H(*)函数同样也是符合LSH算法要求的。一般随机按投影算法选用的hash函数就是H(*)。其中参数b的取值会在后面小节中讨论。
3 随机投影法在最近邻搜索中的应用
3.1 最近邻搜索
最近邻搜索可以简单的定义为:对于m个元素的集合T,为一个待查询元素q找到集合中相似度最高的k个元素。
最近邻搜索最简单的实现方法为:计算q与集合T中每一个元素的相似度,使用一个具有k个元素的大顶堆(优先队列)保存相似度计算结果(相似度值为key)。这种实现方法每一次查询都要遍历整个集合T来计算相似度,当m很大并且查询的频率很高的时候这种暴力搜索的方法无法满足性能要求。
当最近邻搜索的近邻要求并不是那么严格的时候,即允许top k近邻的召回率不一定为1(但是越高越好),那么可以考虑借助于LSH算法。
3.2 随机投影法提高执行速度
这里我们介绍当集合T的元素和查询元素q为同维度向量(维度为n),并且元素相似度计算方法为余弦相似度时,使用随机投影法来提高最近邻搜索的执行速度。具体的实现方法为:
预处理阶段:使用hash函数H(*)计算集合T中所有元素的hash值,将集合T分成一个个分组,每个分组内的元素hash值均相等。用合适的数据结构保存这些hash值到分组的映射关系(如HashMap)。
查询阶段:计算查询元素q的hash值H(q),取集合T中所有hash值为H(q)的分组,以该分组内的所有元素作为候选集合,在候选该集合内使用简单的最近邻搜索方法寻找最相似的k个元素。
该方法的执行效率取决于H(*)的hash值个数2b,也就是分组的个数。理想情况下,如果集合T中的向量元素在空间中分布的足够均匀,那么每一个hash值对应的元素集合大小大致为m2b。当m远大于向量元素的维度时,每次查询的速度可以提高到2b倍。
根据以上分析H(*)中b的取值越大算法的执行速度的提升越多,并且是指数级别的提升。但是,在这种情况下H(*)函数下的概率公式p(s),实际上表示与查询元素q的相似度为s的元素的召回率。当b的取值越大时,top k元素的召回率必然会下降。因此算法执行速度的提升需要召回率的下降作为代价。例如:当b等于10时,如果要保证某个元素的召回率不小于0.9,那么该元素与查询元素q的相似度必须不小于0.9999998。
3.3 提高召回率改进
为了在保证召回率的前提下尽可能提高算法的执行效率,一般可以进行如下改进:
预处理阶段:生成t个独立的hash函数Hi(∗),根据这t个不同的hash函数,对集合T进行t种不同的分组,每一种分组方式下,同一个分组的元素在对应hash函数下具有相同的hash值。用合适的数据结构保存这些映射关系(如使用t个HashMap来保存)。
查询阶段:对于每一个hash函数Hi(∗),计算查询元素q的hash值Hi(q),将集合T中Hi(∗)所对应的分组方式下hash值为Hi(q)的分组添加到该次查询的候选集合中。然后,在该候选集合内使用简单的最近邻搜索方法寻找最相似的k个元素。
以上改进使得集合中元素与查询元素q的t个hash值中,只要任意一个相等,那么该集合元素就会被加入到候选集中。那么,相似度为s的元素的召回率为
在执行效率上,预处理阶段由于需要计算t个hash函数的值,所以执行时间上升为t倍。查询阶段,如果单纯考虑候选集合大小对执行效率的影响,在最坏的情况下,t个hash值获得的列表均不相同,候选集集合大小的期望值为t∗m2b,查询速度下降至1t,与简单近邻搜索相比查询速度提升为2bt倍。
下图是召回率公式p(s)=1−(1−(1−arccos(s)π)b)t在不同的b和t取值下的s-p曲线。我们通过这些曲线来分析这里引入参数t的意义。4条蓝色的线以及最右边红色的线表示当t取值为1(相当于没有引入t),而b的取值从1变化到5的过程,从图中可以看出随着b的增大,不同相似度下的召回率都下降的非常厉害,特别的,当相似度接近1时曲线的斜率很大,也就说在高相似度的区域,召回率对相似度的变化非常敏感。10条红色的线从右到左表示b的取值为5不变,t的取值从1到10的过程,从图中可以看出,随着t的增大,曲线的形状发生了变化,高相似度区域的召回率变得下降的非常平缓,而最陡峭的地方渐渐的被移动到相对较低的相似度区域。因此,从以上曲线的变化特点可以看出,引入适当的参数t使得高相似度区域在一段较大的范围内仍然能够保持很高的召回率从而满足实际应用的需求。
3.4 参数选取
根据以上分析,H(*)函数的参数b越大查询效率越高,但是召回率越低;参数t越大查询效率越低但是召回率越高。因此选择适当参数b和t来折中查询效率与召回率之间的矛盾是应用好随机投影法的关键。下面提供一种在实际应用中选取b和t的参考方法。
根据实际应用的需要确定一对(s,p),表示相似度大于等于s的元素,召回率的最低要求为p。然后将召回率公式表示成b-t之间的函数关系t=log1−(1−acos(s)pi)b(1−p)。根据(s,p)的取值,画出b-t的关系曲线。如s=0.8,p=0.95时的b-t曲线如下图所示。考虑具体应用中的实际情况,在该曲线上选取一组使得执行效率可以达到最优的(b,t)组合。
3.5 关于最近邻文本搜索
在最近邻文本搜索中,一般待检索的文本或查询文本,都已被解析成一系列带有权重的关键词,然后通过余弦相似度公式计算两个文本之间的相似度。这种应用场景下的最近邻搜索与以上所提到的最近邻搜索问题相比存在以下两个特点:
- 如果把每个文本的带权重关键词表都看作是一个向量元素的话,每个关键词都是向量的一个维度,关键词权重为该维度的值。理论上可能关键词的个数并不确定(所有单词的组合都可能是一个关键词),因此该向量元素的维数实际上是不确定的。
- 由于关键词权重肯定是大于零的,所以向量元素的每一个维度的值都是非负的。
对于第一个特点,我们需要选取一个包含n个关键词的关键词集合,在进行文本相似度计算时只考虑属于该集合的关键词。也就是说,每一个文本都视为是一个n维度的向量,关键词权重体现为对应维度的值。该关键词集合可以有很多种生成办法,比如可以是网站上具有一定搜索频率的关键词集合,总的来说该关键词集合应当能够涵盖所有有意义并且具有一定使用频率的关键词。通常n的取值会比较大,如几十万到几百万,由于在使用随机投影算法时,每一个生成的随机向量维度都为n,这种情况下需要特别考虑利用这些高维随机向量对执行效率造成的影响,在确定b、t参数时需要考虑到这方面的影响。
对于第二个特点,由于向量元素各维度值都非负,那么这些元素在高维空间中只会出现在特定的区域中。比如当n为3时,只会出现在第一象限中。一个直观的感觉是在生成随机向量的时候,会不会生成大量的无用切割平面(与第一个象限空间不相交,使得所有元素都位于切割平面的同侧)。这些切割平面对应的H(*)函数hash值中的二进制位恒定为1或者0,对于提高算法执行速度没有帮助。以下说明这种担心是没有必要的:
切割平面与第一象限空间不相交等价于其法向量的每一个维度值都有相同的符号(都为正或者负),否则总能在第一象限空间中找到两个向量与法向量的乘积符号不同,也就是在切割平面的两侧。那么,随机生成的n维向量所有维度值都同号的概率为12n−1,当n的取值很大时,该概率可以忽略不计。
参考文献
[1] P. Indyk and R. Motwani. Approximate Nearest Neighbor:Towards Removing the Curse of Dimensionality. In Proc. of the 30th Annual ACM Symposium on Theory of Computing, 1998, pp. 604–613.
[2] Google News Personalization: Scalable Online Collaborative Filtering
后记:
然而最后,我使用了还是随机投影的方法,这个是正确率和速度的权衡
位姿检索PoseRecognition:LSH算法.p稳定哈希的更多相关文章
- 【E2LSH源代码分析】p稳定分布LSH算法初探
上一节,我们分析了LSH算法的通用框架,主要是建立索引结构和查询近似近期邻.这一小节,我们从p稳定分布LSH(p-Stable LSH)入手,逐渐深入学习LSH的精髓,进而灵活应用到解决大规模数据的检 ...
- 【期外】 (一)关于LSH :局部敏感哈希算法
LSH是我同学的名字,平时我会亲切的称呼他为离骚,老师好,左移(leftshift),小骚骚之类的,最近他又多了一个新的外号:局部敏感哈希(Locally sensitive hashing). 好了 ...
- 算法型稳定币USDN有哪些使用功能
众所周知,稳定币是基于区块链的支付工具,旨在实现最终用户要求的价格稳定性.有些稳定币利用法定货币作为抵押资产.其他则使用一系列其他非法定类型的抵押资产.还有一些尝试使用算法来实现价格稳定性而根本没有抵 ...
- 算法型稳定币USDN是如何保持稳定的?
数据显示,2019年稳定币市场总市值25亿美元,在整个加密货币市场占比 1.3%.可别小瞧了看似微小的1.3%这个数据,它其实是一个庞大的市场.稳定币不仅仅是货币的电子化,它还是一种可编程的加密货币, ...
- 算法型稳定币USDN有什么魔力引发市场热潮?
最近比特币重新突破了8万大关,区块链行业又再次火爆起来,吸引了圈内圈外人的火热讨论,而这其中市场投资者讨论最频繁的就要属算法型稳定币USDN了. USDN是基于NGK.IO区块链中的稳定币, 1枚US ...
- 算法型稳定币USDN有什么价值和用途?
USDN的标签是"数字美元",与大多数稳定资产一样,USDN是一种金融服务产品.基于NGK公链发行的算法型稳定币USDN,USDN是和美元1:1锚定的加密数字货币,1USDN等于1 ...
- 查找算法(7)--Hash search--哈希查找
1.哈希查找 (1)什么是哈希表(Hash) 我们使用一个下标范围比较大的数组来存储元素.可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用 ...
- LSH算法原理
原始链接--http://www.jiahenglu.net/NSFC/LSH.html LSH(Location Sensitive Hash),即位置敏感哈希函数.与一般哈希函数不同的是位置敏感性 ...
- 多模态检索之CCA算法
多模态检索主要是实现不同模态下的数据能相互检索,例如文本模态数据,和图像模态数据.要能实现他们之间的相互检索,首先要是它们相互关联起来.CCA·算法用于多模态检索步骤: 1)首先提取文本,图 ...
随机推荐
- eas之根据bostype查找实体
select * from T_PF_BOSOBJECT;所有实体都有一个唯一的类型ID:BOSTYPEID,8位字符串,可切换到“源代码“页签,查找bostype标签里的值.这个ID的用途主要有: ...
- Cache占用过多内存导致Linux系统内存不足问题排查
问题描述 Linux服务器内存使用量超过阈值,触发报警. 问题排查 首先,通过free命令观察系统的内存使用情况,显示如下: total used free shared buffers cached ...
- SVN仓库导入文件
分两种: 1.导入文件版本库从0开始 (适合新项目) 2.将其他SVN服务器中的版本库导入进来,版本库继承原SVN服务器的(适合SVN版本库迁移) 第一种: #mkdir –p /home/code/ ...
- Python语言数据结构和语言结构(2)
目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名 变量命名规则主要有以下几 ...
- python3实现UDP协议的简单服务器和客户端
利用python中的socket模块中的来实现UDP协议,这里写一个简单的服务器和客户端.为了说明网络编程中UDP的应用,这里就不写图形化了,在两台电脑上分别打开UDP的客户端和服务端就可以了. UD ...
- C++ 类型转化(运算符重载函数)和基本运算符重载(自增自减)
类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据).在C ...
- 学习EXTJS6(6)基本功能-工具栏和菜单
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 在做公司项目是时,昨天晚上还好的,但是第二天启动tomcat发现tomcat启动了,但是没把项目启动起来
1.问题:在做公司项目是时,昨天晚上还好的,但是第二天启动tomcat发现tomcat启动了,但是没把项目启动起来 2.问题排除: 1)昨天晚上还好着呢,并且没改动代码,排除代码问题.日志中无报错信息 ...
- CodeForces - 445A - DZY Loves Chessboard
先上题目: A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input ...
- [bzoj4487][Jsoi2015]染色_容斥原理
染色 bzoj-4487 Jsoi-2015 题目大意:给你一个n*m的方格图,在格子上染色.有c中颜色可以选择,也可以选择不染.求满足条件的方案数,使得:每一行每一列都至少有一个格子被染色,且所有的 ...