辛几何&李代数

BloomFilter——大规模数据处理利器

BloomFilter——大规模数据处理利器

  BloomFilter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一.实例   为了说明BloomFilter存在的重要意义,举一个实例:   假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络... 阅读全文

 

  Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。

 

实例 

  为了说明Bloom Filter存在的重要意义,举一个实例:

  假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案:

  1. 将访问过的URL保存到数据库。

  2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。

  3. URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。

  4. Bit-Map方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。

  方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。

 

  以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。

  方法1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。而且每来一个URL就启动一次数据库查询是不是太小题大做了?

  方法2的缺点:太消耗内存。随着URL的增多,占用的内存会越来越多。就算只有1亿个URL,每个URL只算50个字符,就需要5GB内存。

  方法3:由于字符串经过MD5处理后的信息摘要长度只有128Bit,SHA-1处理后也只有160Bit,因此方法3比方法2节省了好几倍的内存。

  方法4消耗内存是相对较少的,但缺点是单一哈希函数发生冲突的概率太高。还记得数据结构课上学过的Hash表冲突的各种解决方法么?若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。

 

  实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!也就是说少量url实际上没有没网络蜘蛛访问,而将它们错判为已访问的代价是很小的——大不了少抓几个网页呗。 

 

Bloom Filter的算法 

 

  废话说到这里,下面引入本篇的主角——Bloom Filter。其实上面方法4的思想已经很接近Bloom Filter了。方法四的致命缺点是冲突概率高,为了降低冲突的概念,Bloom Filter使用了多个哈希函数,而不是一个。

    Bloom Filter算法如下:

    创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数。第i个哈希函数对字符串str哈希的结果记为h(i,str),且h(i,str)的范围是0到m-1 。

 

(1) 加入字符串过程 

 

  下面是每个字符串处理的过程,首先是将字符串str“记录”到BitSet中的过程:

  对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后将BitSet的第h(1,str)、h(2,str)…… h(k,str)位设为1。

 BloomFilter——大规模数据处理利器

  图1.Bloom Filter加入字符串过程

  很简单吧?这样就将字符串str映射到BitSet中的k个二进制位了。

 

(2) 检查字符串是否存在的过程 

 

  下面是检查字符串str是否被BitSet记录过的过程:

  对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后检查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否为1,若其中任何一位不为1则可以判定str一定没有被记录过。若全部位都是1,则“认为”字符串str存在。

 

  若一个字符串对应的Bit不全为1,则可以肯定该字符串一定没有被Bloom Filter记录过。(这是显然的,因为字符串被记录过,其对应的二进制位肯定全部被设为1了)

  但是若一个字符串对应的Bit全为1,实际上是不能100%的肯定该字符串被Bloom Filter记录过的。(因为有可能该字符串的所有位都刚好是被其他字符串所对应)这种将该字符串划分错的情况,称为false positive 。

 

(3) 删除字符串过程 

   字符串加入了就被不能删除了,因为删除会影响到其他字符串。实在需要删除字符串的可以使用Counting bloomfilter(CBF),这是一种基本Bloom Filter的变体,CBF将基本Bloom Filter每一个Bit改为一个计数器,这样就可以实现删除字符串的功能了。

 

  Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。

 

Bloom Filter参数选择 

 

   (1)哈希函数选择

     哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。

   (2)Bit数组大小选择 

     哈希函数个数k、位数组大小m、加入的字符串数量n的关系可以参考参考文献1。该文献证明了对于给定的m、n,当 k = ln(2)* m/n 时出错的概率是最小的。

     同时该文献还给出特定的k,m,n的出错概率。例如:根据参考文献1,哈希函数个数k取10,位数组大小m设为字符串个数n的20倍时,false positive发生的概率是0.0000889 ,这个概率基本能满足网络爬虫的需求了。  

 

Bloom Filter实现代码 

    下面给出一个简单的Bloom Filter的Java实现代码:

 

import java.util.BitSet;

publicclass BloomFilter 
{
/* BitSet初始分配2^24个bit */ 
privatestaticfinalint DEFAULT_SIZE =1<<25
/* 不同哈希函数的种子,一般应取质数 */
privatestaticfinalint[] seeds =newint[] { 571113313761 };
private BitSet bits =new BitSet(DEFAULT_SIZE);
/* 哈希函数对象 */ 
private SimpleHash[] func =new SimpleHash[seeds.length];

public BloomFilter() 
{
for (int i =0; i < seeds.length; i++)
{
func[i] 
=new SimpleHash(DEFAULT_SIZE, seeds[i]);
}
}

// 将字符串标记到bits中
publicvoid add(String value) 
{
for (SimpleHash f : func) 
{
bits.set(f.hash(value), 
true);
}
}

//判断字符串是否已经被bits标记
publicboolean contains(String value) 
{
if (value ==null
{
returnfalse;
}
boolean ret =true;
for (SimpleHash f : func) 
{
ret 
= ret && bits.get(f.hash(value));
}
return ret;
}

/* 哈希函数类 */
publicstaticclass SimpleHash 
{
privateint cap;
privateint seed;

public SimpleHash(int cap, int seed) 
{
this.cap = cap;
this.seed = seed;
}

//hash函数,采用简单的加权和hash
publicint hash(String value) 
{
int result =0;
int len = value.length();
for (int i =0; i < len; i++
{
result 
= seed * result + value.charAt(i);
}
return (cap -1& result;
}
}
}

收起全文

辛几何&李代数

在数学一堆栈或2-sheaf是的,大致说来,一个捆以价值范畴而不是集。栈是用来形式化的一些主要结构血统论,并构建精细模栈时精细的模空间不存在。血统理论关注的是普遍的情况下,几何对象(如向量丛打开(放)拓扑空间)可以被&粘在一起&时,同构(在一个兼容的方式)时,限制在一个空间的一个开覆盖集的十字路口。在更一般的设置的限制与一般的回调所取代,并纤维类形成正确的框... 阅读全文

数学堆栈2-sheaf是的,大致说来,一个捆以价值范畴而不是集。栈是用来形式化的一些主要结构血统论,并构建精细模栈时精细的模空间不存在。

血统理论关注的是普遍的情况下,几何对象(如向量丛打开(放)拓扑空间)可以被“粘在一起”时,同构(在一个兼容的方式)时,限制在一个空间的一个开覆盖集的十字路口。在更一般的设置的限制与一般的回调所取代,并纤维类形成正确的框架来讨论这种粘合的可能性。一堆的直观的意义就在于它是一个纤维范畴,“所有可能的扣工作”。对扣的规范需要定义一个覆盖方面,可以考虑扣。原来,描述这些覆盖物的通用语言是一个Grothendieck拓扑。因此,堆栈是正式作为纤维类的另一个基地类,在基地有一个Grothendieck拓扑和纤维类满足一些公理,确保相对于Grothendieck拓扑和某些扣的存在唯一性。

栈是代数栈的底层结构(也被称为阿廷栈)和涅–芒福德堆栈,从而推广方案和代数空间这是特别有用的研究模空间。有包裹体:方案⊆代数空间⊆涅–芒福德栈⊆代数栈⊆栈。

(2003)Edidin和(2001)fantechi简要介绍账户栈,Góó(2001),奥尔森(2007)和(2005)vistoli给出更详细的介绍,并洛蒙和莫雷贝利(2000)介绍了更先进的理论。

 

 

 

动机和历史

洛杉矶结论检疫àlaquelle Je suis到达éDè的维护,这是阙chaque FOIS阙恩的Vertu德MES的暴击èRES,一变éTéde模块(或译ôT,联合国学校é马德模块)倒拉分类DES的变化(GLOBALES,欧无穷ésimales)德有结构(变éTé的并发症èTES非按每一个èRES,纤维é的vectoriels,等)的对立malgr东北peut,éde女佣假说èSES的陈词滥调,propreté,等非singularitééventuellement,LA存在EN EST seulement l'existence d'automorphismes de la结构魁EMPê车拉技术德迪桑特de行军。

Grothendieck的信塞尔,11月5日1959。

栈的概念起源于定义有效数据在下降(1959)群。在1959封信塞尔,Grothendieck指出,构建良好的模空间的根本障碍是自同构的存在。栈的主要动机是,如果对一些问题的模空间不存在由于自同构的存在,它可能仍然可以构建一个弹性模量堆栈。

芒福德(1965)研究了Picard群椭圆曲线模栈在栈,定义了。栈是最初由吉罗 (一千九百六十六,一千九百七十一),和“堆”的介绍德利涅&芒福德(1969)对原法国“冠军”意义的“场”。本文还介绍了涅–芒福德栈,他们称之为代数栈,虽然“代数栈”现在通常指的是更一般的阿廷栈介绍了艺术 (一千九百七十四)。

当定义商方案组的行动,为商是一个仍然满足理想的商性能的方案通常是不可能的。例如,如果一个点有非平凡的稳定剂,然后范畴的商将不存在的计划。

以同样的方式,模空间曲线,向量丛,或其他几何对象往往是最好的定义为替代方案栈。模空间的结构常常是首先构造一个更大的空间参数化对象的问题,然后quotienting的一组动作占已在数目上超过自同构的对象。

定义

一类C与一个函子范畴C被称为纤维类C如果任何态射FXY进入C与任何对象YC图像Y,有一个回调FXYYF。这意味着任何态射GZY图像G=FH可以分解为G=FH一个独特的态射HZX图像H。元素X=F*Y被称为回调Y沿F和是唯一典型的同构。

类别C被称为叠前在一个范畴CGrothendieck拓扑如果是纤维在C对于任何对象UC和对象XYC图像U从对象上,函子U集以FvU坎(F*XF*Y)是一个层。这个术语是不一致的:prestacks滑轮的术语是分离而不是presheaves presheaves类似物。

类别C被称为堆栈在范畴C与Grothendieck拓扑如果是叠前结束C任何下降的数据是有效的。一下降的数据大概包括覆盖对象vC一个家庭vI,元素XI在纤维上vI,和态射F之间的限制XIXJvij=vI×UvJ满足相容性条件F王下=FKJF。下降的数据称为有效如果元素XI基本上是一个元素的回调X图像U

一堆被称为堆栈在胚(2,1)-层如果是纤维在胚,这意味着它的纤维(逆图像对象C)是胚。一些作者使用“栈”是指在群堆的更严格的概念。

一个代数栈阿廷栈在群栈X在层如图的对角线X是表示和存在光滑满射从(相关的堆栈)一个X射方案Y栈 X栈是可表示的如果,每射S 栈 X从(相关的堆栈)方案的X,纤维制品 Y ×X S是同构的(相关的堆栈)代数空间。这个纤维制品栈是使用通常的定义通用性,和改变图去要求他们2-commute要求。

涅–芒福德栈是一个代数栈X这样就从一个方案的é故事满射X。大致说来,–涅芒福德栈可以被认为是代数栈的对象没有无穷小的自同构。

实例

  • 如果一个栈的纤维集(意义范畴的态射的身份映射)然后堆基本上是相同的一套。这表明一个堆栈是一种泛化的一捆,以价值观而不是任意类别设置。
  • 准紧对角的任何方案都是一个代数堆栈(或者更准确地说是一个)。
  • 类别向量丛V→是叠加在拓扑空间范畴。从V→态射T由对W的连续映射TV从对以W(线性纤维)这样明显的广场上。这是一个纤维范畴的条件是因为人可以把向量丛的回调在拓扑空间的连续映射,这一下降的数据是有效的条件是因为我们可以构造一个向量丛的一个空间上的向量丛的粘在一起的一个开放的封面元素。
  • 拟凝聚层方案堆栈(相对于fpqc拓扑弱拓扑)
  • 在基础方案的仿射方案堆栈(再次对fpqc拓扑或微弱)
  • 芒福德(1965)研究了模栈M1,1椭圆曲线,发现其Picard群是循环12阶。椭圆曲线上的复数相应的栈是一个类似的商上半平面由的行动模块组
  • 这个代数曲线模空间MG定义为一个泛家族的光滑曲线的属 G不存在一个代数簇,尤其是有曲线承认非平凡自同构。但是有一个模栈MG这是一个很好的为不存在的精细模空间的光滑属替代G曲线。通常有一个模栈MG,NG曲线N标记点。总的来说这是一个代数叠加,是–涅芒福德栈G≥2或G= 1,N> 0G= 0,N≥3(换句话说,当曲线的自同构群是有限的)。这种弹性模量堆栈组成的稳定曲线模栈完成(对于给定的GN以上规格是正确的)Z。例如,M是bpgl分类堆栈(2)的一般射影线性群。(有一个微妙的定义M,作为一个使用代数空间而不是方案施工。)
  • 任何GERBE在群栈;例如琐碎gerbe,分配给每个方案的主G在方案捆绑,一些组G
  • 如果Y是一个方案G是一个光滑组方案的作用Y,然后有一个商代数栈 Y/G一个方案,以T这群胚G-旋量超过TG等变映射Y。一个特殊的情况下,这个时候Y是一个点给出分类堆栈BG对一个光滑组方案G
  • 如果一个是拟凝聚层代数在代数栈X在一个方案,然后有一堆的规格()推广建设的频谱规范()一交换环。一个对象的规格()由下式给出方案对象的TXXT),和一个态射的成捆的代数X *()的坐标环OT)的T
  • 如果一个是拟凝聚层分级代数的代数叠加X在一个方案,然后有一堆项目()推广建设工程投影方案()一次环
  • 这个主束模量堆栈在代数曲线X还原组的行动G,通常以栈
  • 这个形式群法则模栈分类正式的法律
  • Picard栈推广皮卡德品种

拟凝聚层代数栈

在一个代数栈可以构造一类拟凝聚层类似于准相干一方案的范畴。

拟凝聚层大致是一个看起来像一个模块的局部环上的束。第一个问题是决定什么人所说的“局部”:这涉及一个Grothendieck拓扑结构的选择,还有很多可能的选择,其中有一些问题,没有一个完全令人满意的。Grothendieck拓扑应该强大到足以使栈的局部仿射本拓扑方案局部仿射Zariski拓扑,这是一个好的选择方案三发现,代数空间和涅–芒福德栈是局部仿射在层拓扑所以通常采用层拓扑这些,而代数栈是局部仿射在光滑的拓扑结构,因此可以在这种情况下使用光滑拓扑。对于一般的代数栈层拓扑没有足够的开集:例如,如果G是一个光滑的连接组则只有层覆盖分类堆BG是份BG的工会,这是不足以给quasicoherent滑轮的权利理论。

而不是使用光滑拓扑代数栈一个经常使用它的变形称为LIS等拓扑(对于利瑟层:短利瑟是光滑的法语术语),具有相同的开集为光滑拓扑但开覆盖了层而不是光滑映射。这通常是导致拟凝聚层的一个等价类,但更容易使用:例如,它是更容易与代数空间层拓扑比较。LIS等拓扑结构有一个微妙的技术问题:栈之间的态射一般不给相应的论题之间的态射。(问题是,当一个人可以构造一对伴随函子F*F*,作为论题的几何性需要,函子F*一般是不能离开具体。这个问题是由于在发表的论文和书籍臭名昭著的一些错误。【一])这意味着射栈下构建一个quasicoherent捆回调需要一些额外的努力。

也可以使用更精细的拓扑结构。最合理的“足够大”Grothendieck拓扑似乎导致拟凝聚层等价类,但更大的一个拓扑结构是很难处理,所以一般都喜欢用小的拓扑结构,只要他们有足够的开集。例如,大FPPF拓扑结构导致实质上的拟凝聚层的同一类别的LIS等拓扑结构,但有一个微妙的问题:自然嵌入拟凝聚层为OX在这种拓扑结构中的模块是不准确的(不保存内核一般)。

其他类型的栈

微堆拓扑叠加在一个类似于代数栈的定义,除了仿射方案基本范畴是由光滑流形拓扑空间范畴取代。

通常可以定义的概念,一个n -层或N–1栈,这大约是一种捆值在n–1类。这样做有几个不同的方式。1-sheaves如滑轮一样,和2-sheaves是堆叠相同。

集理论问题

有与栈的理论通常一些小集基础理论问题,因为堆栈通常被定义为一定的仿函数类的集合,因此没有设置。有几种办法来处理这个问题:

  • 一个能与Grothendieck宇宙工作:堆栈则是一些固定的Grothendieck宇宙类之间的函子,所以这些类和堆叠在一个较大的Grothendieck宇宙集。这种方法的缺点是,一个有足够的Grothendieck宇宙的存在,它本质上是一个大基数公理。
  • 一个可以定义堆仿函数的足够大的秩集集,并认真的记下各设置一个队伍使用。这里的问题是,它涉及到一些额外的相当累人的记账。
  • 可以使用反射原理从集合论认为人可以找到的任何有限的片段的ZFC公理的模型表明,一个可以自动找到设置足够接近的所有集合的宇宙近似。
  • 一个可以忽略的问题。这是许多作者所采取的方法。

参见

收起全文

ibanana

Maredo餐厅柏林旗舰店(16张)

辛几何&李代数

魔方入门玩法

魔方入门玩法

基本上很简单,大写的字母R,U之类就是转某个面,小写的r,u等就是同时转两层,带'就是逆时针转。x、y、z就是整个魔方转,具体怎么转比较绕一点,x、y、z分别为水平,竖直和前后轴,标记x、y、z就是分别围着这三个轴顺时针转90&,加'就是逆时针。具体碰到了大家也别自己想,看看动画就明白了,还是感性认识比较好。 另外()括号的意思就是这几个动作是一组,可... 阅读全文

基本上很简单,大写的字母R,U之类就是转某个面,小写的r,u等就是同时转两层,带'就是逆时针转。

x、y、z就是整个魔方转,具体怎么转比较绕一点,x、y、z分别为水平竖直前后轴,标记x、y、z就是分别围着这三个轴顺时针转90°,加'就是逆时针。

具体碰到了大家也别自己想,看看动画就明白了,还是感性认识比较好。

另外()括号的意思就是这几个动作是一组,可以很连贯很顺手的一起做 ,()括号外面有个2就是括号里面的步骤做两次,大家再有不明白的看动画就行了。

注意E和D的顺逆方向一致,所以E'是从上往下看的顺时针。M和L的顺逆方向一致。

具体的见下面的图解。

魔方入门玩法

魔方入门玩法

魔方入门玩法

魔方入门玩法小鱼1和小鱼2 

  

两个黄色不在顶面和四个黄色不在顶面的5种情况。大家记住要“二后四左”,也就是有两个黄色不在顶面,左后角的黄色小片就要冲后,四个黄色不在顶面,左后角的黄色小片就要冲左,然后都做“小鱼1”,下面5种情况就会变成小鱼1或者小鱼2了。

收起全文

美间

这间设计事务所全是时髦的颜色和好看的植物!(美间在线软装设计工具-www.meijian.io)(16张)

★·°遇見、堇色年華 ﹏

【十里桃花】恋爱

想来想去,还是和年轻人谈恋爱最有趣。 电光火石火花四溅,在恋爱这件事上,总有耗不完的热情和精力。 而中年人就不一样了。你要浪漫他说你幼稚,你要感动他说你做梦,其实他也知道你想要什么,可他就是懒得给了。不是不想给,是真的懒得折腾了。 ... 阅读全文

想来想去,还是和年轻人谈恋爱最有趣。


电光火石火花四溅,在恋爱这件事上,总有耗不完的热情和精力。


而中年人就不一样了。你要浪漫他说你幼稚,你要感动他说你做梦,其实他也知道你想要什么,可他就是懒得给了。不是不想给,是真的懒得折腾了。


记得有天晚上突然想做饭给喜欢的人吃,第二天九点钟就跑去超市买材料,折腾了一上午,那可能是我做的最用心的一顿饭了。我问他在哪,直到下午两点才回复我“在开会”。我告诉他我做了便當给他吃,可他却像没有听见似的告诉我要出差几天,让我照顾好自己。


当时就醒了。记得他曾对我说过“我也是从20岁每天腻到晚上12点,天天缠绵到像连体婴儿,大把大把的情话从嘴里说出来的年代过来,现在不太能回去了。所以我们刚见面的时候我就和你说,年龄小的通常找同龄,两个人都热情似火,但我这个年龄很难在表现成那个样子。”


是的,大概是我太天真了。总觉得,如果自己真心实意的对一个人好,那么他也一定能感受到且回报给我。


并不是的。在成年人的世界里,爱情变得越来越不重要。恋爱对他们来说,再也不是必需品。没有喜欢不喜欢,只有适不适合。


你可以等年纪大了选择与合适的人结婚,但请你一定要在年轻时,同年轻的人,谈一场轰轰烈烈的恋爱。

收起全文
人人小站
更多热门小站
X 人人网小程序,你的青春在这里