• 英文标题:Regular Languages are Testable with a Constant Number of Queries
  • 中文标题:正则语言是可检测地
  • 免费下载链接:Citeseer

序言

最近在赶很多事情,忙的确实不可开交,还是抽了一天时间把这篇paper过了主体部分(前三节),本文是Property Testing一文中4.24.24.2节检验正则语言的一个延申,主要是笔者试图实现该检验算法时发现前者的表述很不完整,而且有不少错误,于是还是去翻了一下原作者的文章(即本文的参考paper),发现确实有很多细节被忽略了。

主要笔者决定以正则语言的可检验性作为汇报内容,主要原因是觉得这个话题会比较有趣,而且能展开讲的内容比较丰富,本来看了那篇slide觉得这个检验算法也不难实现,然后着手却重重受阻,只得费功夫从头搞清楚这个检验算法的原理了。本文主要是对前两节的内容的翻译与笔注,基本上算是弄明白算法的思想了,实话说妙不可言,但是像里面一些细节,如分量图的算法实现笔者现在还是不太能搞得明白,论文中也没有讲得这么细,之后如果成功实现了这个算法,会将代码一并附在本文末尾,实现不了就算了,这些内容差不多也够讲了。

PS:

最近笔者找到了对彼此都有所情愫的人,确定了关系,于是断更了自己的日志,然后发现仍然有很多话不能写,也说不出来,就有点难受。而且她也是那种挺宅的,似乎都不太喜欢逛街,而且不知道为何笔者总是觉得她似乎在回避,其实我觉得过去如何都无所谓的,笔者也不过一介布衣,她能来到这里已经是我最大的幸运了。虽然我觉得从普通朋友做起,大家都有时间就去图书馆学习,吃吃饭也没什么不好,但是总是觉得会有些隔阂,笔者是那种遇到能够信任的人就会说出很多心里话的人,但是得不到对方回应就会有些失落。可能恋爱这种事情对于笔者这种理想主义来说还是过于困难了…

我想也许以后更新的频率会越来越低,因为笔者能留给这里的时间会越来越少,笔者想或许该跟这个博客说再见了,但是笔者大约还是会不定期做一些更新,因为有些话,写出来,总是会让我好受一些。

也许我们确实已经过了那种缠绵的年纪了,三分热情,七分平淡,方为如今的生活。约莫如此罢…

文章目录

  • 序言
  • 摘要 Abstract
  • 1 引入 Introduction
  • 2 检验正则语言 Testing Regular Languages
  • 3 正则语言的下界 Lower Bound for Regular Languages
  • 4 上下文无关语言的可检验性 Testability of Context-free Languages
    • 4.1 某些上下文无关的语言是不可检验的 Some Context-free Languages are Non-testable
    • 4.2 Dyck语言的可检验性 Testability of the Dyck Languages
  • 5 总结 Concluding Remarks
  • 参考文献

摘要 Abstract

  • 本文是对参考文献[7]工作的延续;
  • 本文的主题是检验正则语言;
  • 本文的主要结果如下:
    1. 对于一种正则语言L∈{0,1}∗L\in\{0,1\}^*L∈{0,1}∗,以及一个整数nnn,存在一种随机算法(randomized algorithm),该算法接受(accept)每一个属于LLL且长度为nnn的单词www,并且以高概率拒绝(reject)那些与LLL中每一个单词都有至少ϵn\epsilon nϵn位字节不相同的单词;该算法需要查询输入长度为nnn的单词www的O~(1/ϵ)\tilde O(1/\epsilon)O~(1/ϵ)位字节,且这种查询复杂度(a factor of poly-logarithmic in 1/ϵ1/\epsilon1/ϵ)的最优性已经得到证明;
    2. 本文还讨论了更多复杂语言的可检验性,特别地,我们指出针对上下文无关语言(context-free languages)检验的查询复杂度无法被限制在任意只与ϵ\epsilonϵ相关的函数内;
  • 关于正则语言的检验问题的研究,是探索那些通过逻辑方法(logical means)定义的性质可检验性的一种通用方法(general approach);

1 引入 Introduction

  • 正则语言的性质检验(Property testing)概述:

    1. PPP是一种性质,比如是一族非空的二进制单词构成的集合;

    2. 定义:称长度为nnn的单词www距离满足PPP是ϵ\epsilonϵ-far,若任意长度为nnn、且与www在至多ϵn\epsilon nϵn个对应字节位上取值相异的单词w′w'w′都不能满足性质PPP;换言之,∀w′∈{w∈P:∣w′∣=n}\forall w'\in \{w\in P:|w'|=n\}∀w′∈{w∈P:∣w′∣=n},w′w'w′与www的汉明距离(Hamming distance)大于ϵn\epsilon nϵn;

    3. 定义:称随机算法AAA是关于性质PPP的一个ϵ\epsilonϵ-test,若给定正整数nnn以及一个可以用于查询www任意字节位取值的预言机器(oracle),随机算法AAA总是能够以至少23\frac2332​的概率去区分如下两种不同情形:

      • w∈Pw\in Pw∈P;
      • www距离满足PPP是ϵ\epsilonϵ-far
    4. 定义:称性质PPP是可检验的(testable),若对于每一个固定的ϵ>0\epsilon>0ϵ>0,都存在一个查询复杂度(即所需要的查询次数)限制在只与ϵ\epsilonϵ有关的某个函数内的ϵ\epsilonϵ-test

      • 备注:

        查询复杂度只与ϵ\epsilonϵ有关,主要是指与输入单词www的长度(即∣w∣=n|w|=n∣w∣=n)是无关的;

  • 性质检验的相关研究:

    1. 性质检验的概念首次在参考文献[7]中定义(启发于参考文献[13]),性质检验的相关研究融合了概率近似正确学习PAC learning),程序检查program checking,参考文献[6,3,10,13]),概率可检测证明probabilistically checkable proof,参考文献[2])以及近似算法approximation algorithm,参考文献[7]);
    2. 参考文献[7]中作者证明了一些图性质是可检验的,如二分性的可检验性(只需要查询与1ϵ\frac1\epsilonϵ1​相关的多项式数量的边即可得到可行的一个ϵ\epsilonϵ-test);
  • 本文的研究内容:

    1. 本文强调正式语言的可检验性(formal languages,参考文献[8]中有关于此概念的确切定义);

    2. 一种语言L⊆{0,1}∗L\subseteq\{0,1\}^*L⊆{0,1}∗是一种性质,这种性质通常可视为是一系列的布尔函数fn:{0,1}n→{0,1}f_n:\{0,1\}^n\rightarrow\{0,1\}fn​:{0,1}n→{0,1},满足fn−1(1)=L∩{0,1}n=Lnf^{-1}_n(1)=L\cap\{0,1\}^n=L_nfn−1​(1)=L∩{0,1}n=Ln​;

    3. 本文主要的结果是证明了正则语言(regular languages)是可检验的(在查询复杂度仅为O~(1/ϵ)\tilde O(1/\epsilon)O~(1/ϵ)的情形下),且查询复杂度已经达到最优;

      原文:

      … We also show that this complexity is optimal up to a factor poly-logarithmic in 1/ϵ1/\epsilon1/ϵ …

    4. 然而上述这种极好的性质无法推广到上下文无关的(context-free)语言中,因为可以很容易的举出不可检验的简单反例;

  • 本文研究的意义:

    1. 正则语言是二阶单体逻辑(second order monadic logic)刻画的一种性质,因此可以推出很多其他性质是可检验的;

    2. 如在参考文献[1]中我们给出了一种可检验的图性质,这种图性质也是通过逻辑方法(logical means)描述得到的;

    3. 这些结果表明可检验性与逻辑之间存在较强的关联性性;

  • 本文一些符号的设定:

    1. nnn是一个充分大的正整数,ϵ\epsilonϵ是一个充分小的正数,所有的对数(logarithms)都是以222为底的(binary),除非特殊说明

2 检验正则语言 Testing Regular Languages

  • 定义2.12.12.1:确定有穷状态自动机(deterministic finite automaton,下简称为DFA)MMM,其状态集合Q={q1,q2,...,qm}Q=\{q_1,q_2,...,q_m\}Q={q1​,q2​,...,qm​},由函数δ:{0,1}×Q→Q\delta:\{0,1\}\times Q\rightarrow Qδ:{0,1}×Q→Q以及集合F⊆QF\subseteq QF⊆Q来给定;其中:

    • q1q_1q1​称为初始状态(initial states);

    • 集合FFF中包含的状态称为接受状态(accepting states);

    • δ\deltaδ称为转移函数(transition function),满足如下的几条性质:
      δ(∅,q)=qδ(u0,q)=δ(0,δ(u,q))δ(u1,q)=δ(1,δ(u,q))\begin{aligned} \delta(\emptyset,q)&=q\\ \delta(u0,q)&=\delta(0,\delta(u,q))\\ \delta(u1,q)&=\delta(1,\delta(u,q)) \end{aligned} δ(∅,q)δ(u0,q)δ(u1,q)​=q=δ(0,δ(u,q))=δ(1,δ(u,q))​

    称MMM接受单词uuu,若δ(u,q1)∈F\delta(u,q_1)\in Fδ(u,q1​)∈F,否则称MMM拒绝单词uuu;

    称那些被MMM接受的单词构成的单词集合为LML_MLM​,即为由DFA MMM确定的语言(lanuages);

  • 定义2.22.22.2:一种语言是正则的(regular),当且仅当存在一个FA接受它;

    • 备注:

      定义2.22.22.2中没有强调说一定是DFA,可能NFA也是可行的,猜测原因是NFA总是可以转换为等价形式的DFA

    我们在本节中将通过自动机MMM给定的正则语言LLL表示为LML_MLM​;

  • 于是一个长度为nnn的单词w=(w1,w2,...,wn)w=(w_1,w_2,...,w_n)w=(w1​,w2​,...,wn​)可以定义得到状态序列(qi0,qi1,...,qin)(q_{i_0},q_{i_1},...,q_{i_n})(qi0​​,qi1​​,...,qin​​):
    qij={q1j=0δ(w1w2...wj,q1)1≤j≤nq_{i_j}=\left\{ \begin{aligned} &q_1\quad&j=0\\ &\delta(w_1w_2...w_j,q_1)\quad&1\le j\le n \end{aligned} \right. qij​​={​q1​δ(w1​w2​...wj​,q1​)​j=01≤j≤n​
    该状态序列描述了自动机MMM在读取www时的一个状态转移轨迹,下文中我们称之为www的遍历路径traversal path);

  • 有穷状态自动机MMM可以对应一个有向图G(M)G(M)G(M),其中V(G(M))=Q,E(G(M))={(qi,qj):δ(0,qi)=qj}∪{(qi,qj):δ(1,qi)=qj}V(G(M))=Q,E(G(M))=\{(q_i,q_j):\delta(0,q_i)=q_j\}\cup\{(q_i,q_j):\delta(1,q_i)=q_j\}V(G(M))=Q,E(G(M))={(qi​,qj​):δ(0,qi​)=qj​}∪{(qi​,qj​):δ(1,qi​)=qj​};

    有向图GGG的周期(period)g(G)g(G)g(G)定义为GGG中所有环(cycle)的长度的最大公约数(greatest common divisor,下简称为GCD);

    若有向图GGG中不存在环(acyclic),定义g(G)=∞g(G)=\inftyg(G)=∞;

  • 引理2.32.32.3:设G=(V,E)G=(V,E)G=(V,E)是一个强连通的有向图,满足周期g<∞g<\inftyg<∞,则一定存在顶点集VVV的某个分割(partition)V(G)=V0∪V1∪...∪Vg−1V(G)=V_0\cup V_1\cup...\cup V_{g-1}V(G)=V0​∪V1​∪...∪Vg−1​,以及一个常数m=m(G)≤3∣V∣2m=m(G)\le 3|V|^2m=m(G)≤3∣V∣2,使得:

    1. 对于任意0≤i,j≤g−10\le i,j\le g-10≤i,j≤g−1,以及任意的u∈Viu\in V_iu∈Vi​,v∈Vjv\in V_jv∈Vj​,则图GGG中每一条u→vu\rightarrow vu→v的有向路径长度等于(j−i)modg(j-i)\mod g(j−i)modg;
    2. 对于任意0≤i,j≤g−10\le i,j\le g-10≤i,j≤g−1,以及任意的u∈Viu\in V_iu∈Vi​,v∈Vjv\in V_jv∈Vj​,任意的整数n≥mn\ge mn≥m,若n=(j−i)modgn=(j-i)\mod gn=(j−i)modg,则一定存在某条u→vu\rightarrow vu→v的有向路径,它的长度为nnn;

    引理2.32.32.3证明

    1. 引理2.32.32.3中的第一条性质证明:

      固定任意一个顶点z∈Vz\in Vz∈V,构造ViV_iVi​(0≤i≤g−10\le i\le g-10≤i≤g−1)是这样一类顶点vvv构成的集合:

      • 存在一条长度为imodgi\mod gimodg的有向路径z→vz\rightarrow vz→v(可以不是简单路径,即路径中可以出现重复的边);

      • 注意:这条v→vv\rightarrow vv→v的有向路径必然被ggg整除(因为这条路径是一个环),因此这意味着集合Vi∩Vj=∅V_i\cap V_j=\emptysetVi​∩Vj​=∅(i≠ji\neq ji​=j);

        否则如果存在某个顶点w∈Vi∩Vjw\in V_i\cap V_jw∈Vi​∩Vj​(i≠ji\neq ji​=j),根据GGG的强连通性必然存在一条w→zw\rightarrow zw→z的有向路径p1p_1p1​,且根据ViV_iVi​和VjV_jVj​的构造定义,存在一条z→wz\rightarrow wz→w的有向路径p2p_2p2​(长度为imodgi\mod gimodg)与一条z→wz\rightarrow wz→w的有向路径p3p_3p3​(长度为jmodgj\mod gjmodg),则p1∪p2p_1\cup p_2p1​∪p2​与p1∪p3p_1\cup p_3p1​∪p3​都是有向环,但这两个环的长度模ggg显然不同余,则不可能同时被ggg整除。矛盾!

      • 因此对于任意u∈Vi,v∈Vju\in V_i,v\in V_ju∈Vi​,v∈Vj​,只需要构造z→uz\rightarrow uz→u以及u→vu\rightarrow vu→v即可得出第一条性质的结论;

      显然上述构造得到的ViV_iVi​(0≤i≤g−10\le i\le g-10≤i≤g−1)满足第一条性质;

      • 备注:

        这里有个很tricky的问题,z→vz\rightarrow vz→v的有向路径当然不止一条,难道需要所有的有向路径藏毒都是imodgi\mod gimodg吗?显然这是正确的,因为Vi∩Vj=∅V_i\cap V_j=\emptysetVi​∩Vj​=∅(i≠ji\neq ji​=j),这意味着不可能存在一个顶点www同时存在两条z→wz\rightarrow wz→w的有向路径,它们的长度模ggg不同余,因此推论是完全正确的;

    2. 引理2.32.32.3中的第二条性质证明:

      第二条性质是第一条性质的反向表述,但是需要一个常数m<3∣V∣2m<3|V|^2m<3∣V∣2的约束,证明过程比较复杂,涉及多篇不同的参考文献中的结论,本文限于篇幅不再赘述;

    特别地,称引理2.32.32.3中的常数mmm为有向图GGG的可达常数reachability constant),表示为m(G)m(G)m(G),下文中假设mmm总是可以被qqq整除,即q∣mq|mq∣m;■\blacksquare■

    • 备注:

      mmm的定义有点类似社交网络中六度空间的意思,即任意两个人之间的距离不会超过6个人;

      事实上如果随机生成一个强连通的零一DFA对应的有向图,我做了一个实验,从初始状态开始施行BFS算法可以发现,当层数到达某个数值mmm后,每一层中都包含了所有的顶点(状态),这就意味着对于任意n≥mn\ge mn≥m,都存在一条长度为nnn的从初始状态到任意其他状态的路径;

      引理中的性质似乎相对弱了一些,但是根据第一条性质,似乎u→vu\rightarrow vu→v的路径长度已经定死成(j−i)modg(j-i)\mod g(j−i)modg,而且很tricky的事情是分割V(G)=V0∪V1∪...∪Vg−1V(G)=V_0\cup V_1\cup...\cup V_{g-1}V(G)=V0​∪V1​∪...∪Vg−1​可能并不唯一,但是u→vu\rightarrow vu→v的路径长度似乎总是为(j−i)modg(j-i)\mod g(j−i)modg,这个可能需要一些实例的验证;

      一些比较容易想得到的事情,比如若自动机中存在指向自己的状态,则g=1g=1g=1,那么就不存在划分(所有状态都属于同一个划分),此时确实是∀n≥m\forall n\ge m∀n≥m时,任意两个状态之间都存在长度为nnn的有向路径(与上述实验得到的结论是完全一致的);一些比较坏的情况比如nnn个顶点nnn条边,刚好构成一个有向环,这时就是每个顶点自己构成一个划分,引理2.32.32.3的结论非常显然;

    根据引理2.32.32.3,给定nnn就可以很容易的检查语言LML_MLM​是否包含长度为nnn的单词(通过计算nmodgn\mod gnmodg即可),如果LM∩{0,1}n=∅L_M\cap\{0,1\}^n=\emptysetLM​∩{0,1}n=∅,则算法直接拒绝输入即可(平凡),因此我们下面只考虑非平凡的情形,即LM∩{0,1}n≠∅L_M\cap\{0,1\}^n\neq\emptysetLM​∩{0,1}n​=∅;

  • 定义2.32.32.3:给定单词w∈{0,1}nw\in\{0,1\}^nw∈{0,1}n,从www的字节位iii(1≤i≤n1\le i\le n1≤i≤n)开始连续取若干个字节得到w′w'w′,称w′w'w′是www的一个子单词sub-word,下文与run是同义词);称w′w'w′是对于语言LML_MLM​是可行的feasible),若存在某个状态q∈Qq\in Qq∈Q使得存在一条q1→qq_1\rightarrow qq1​→q的有向路径(长度位i−1i-1i−1),并且图GGG中存在一条路径从δ(w′,q)\delta(w',q)δ(w′,q)到某个接受状态;否则,称w′w'w′是不可行的infeasible);

    • 利用引理2.32.32.3,我们可以很容易的在O(∣Q∣∣w′∣)O(|Q||w'|)O(∣Q∣∣w′∣)的时间复杂度内确定子单词w′w'w′是否可行;
  • 显然若存在某个不可行的w′w'w′,直接就可以推出w∉Lw\notin Lw∈/​L;

    • 我们的目的是证明若给定长度为nnn的单词www距离LLL中每一个长度为nnn的单词都很远(比如ϵ\epsilonϵ-far),则一定会有许多短的子单词w′w'w′是不可行的,于是只需要采样少量的随机子单词w′w'w′,即可确定www是否确实存在一个不可行的子单词;
  • 引理2.42.42.4:令DFA MMM满足如下假定:

    1. MMM存在唯一的接受状态qaccq_{acc}qacc​;

    2. 状态集合QQQ可以划分为两个部分:CCC和DDD,其中C∩D=∅,C∪D=QC\cap D=\emptyset,C\cup D=QC∩D=∅,C∪D=Q,满足如下条件(注意集合DDD可以为空集):

      • q1,qacc∈Cq_1,q_{acc}\in Cq1​,qacc​∈C;
      • G(M)G(M)G(M)在CCC上的导出子图是强连通的;
      • G(M)G(M)G(M)不存在由集合DDD中的状态指向集合CCC中的状态的边(当然可以存在由集合CCC中的状态指向集合DDD中的状态的边);

    设mmm是G(C)G(C)G(C)的到达常数,假设语言L=LML=L_ML=LM​包含长度为nnn的单词;

    若一个长度为nnn的单词www满足dist(w,L)≥ϵn{\rm dist}(w,L)\ge\epsilon ndist(w,L)≥ϵn,则存在一个整数1≤i≤log⁡2(6m/ϵ)1\le i\le \log_2(6m/\epsilon)1≤i≤log2​(6m/ϵ),使得www长度为2i+12^{i+1}2i+1的不可行子单词的数量至少为2i−4ϵnmlog⁡2(1ϵ)\frac{2^{i-4}\epsilon n}{m\log_2(\frac1\epsilon)}mlog2​(ϵ1​)2i−4ϵn​;

    • 备注:

      这个数量仍然不是很直观,代入一些具体的数字,比如设定m=16,i=4,n=264,ϵ=2−16m=16,i=4,n=2^{64},\epsilon=2^{-16}m=16,i=4,n=264,ϵ=2−16,那么长度为2i+1=322^{i+1}=322i+1=32的不可行的子单词至少有2402^{40}240个;

      其实观察上面的式子,nnn的阶数应当要远大于1ϵ\frac1\epsilonϵ1​的阶数,因为一般来说(其实是我做了一些测试下来的感觉)mmm应该是log⁡(∣Q∣)\log(|Q|)log(∣Q∣)的量级,不会很大,因此2i−4ϵnmlog⁡2(1ϵ)\frac{2^{i-4}\epsilon n}{m\log_2(\frac1\epsilon)}mlog2​(ϵ1​)2i−4ϵn​的分母基本是一个很正常大小的数字,数量级主要是看ϵn\epsilon nϵn的大小,因为我们只考虑较短的子单词,因此iii通常也不会取得太大;

    引理2.42.42.4证明:这个在我上一篇与Property Testing中关于不可行单词数量的证明是差不多的(但是这里的情况更加具体,给定了子单词的长度),这里大致的思路也是在[m+1,n−m][m+1,n-m][m+1,n−m]的区间上依次取连续的若干长度最短的不可行子单词,具体取法如下所示:

    1. 从单词www的第m+1m+1m+1个字节位往后开始取,直到取到某个字节位s1s_1s1​子单词不再可行(再少取一位就可行),则R1=wm+1wm+2...ws1R_1=w_{m+1}w_{m+2}...w_{s_1}R1​=wm+1​wm+2​...ws1​​;
    2. 类似的接下来连续不断地取出最短的不可行子单词(R2,R3,...,RhR_2,R_3,...,R_hR2​,R3​,...,Rh​),直到第n−mn-mn−m个字节位截断(因此最后一个RhR_hRh​可能是可行的,不过可以忽略它);

    最终我们有:
    ∣w∣=n=2m+∑j=1h(1+∣Rj∣)|w|=n=2m+\sum_{j=1}^h(1+|R_j|) ∣w∣=n=2m+j=1∑h​(1+∣Rj​∣)
    然后可以证明这样的构造结果是满足引理中的不可行子单词数量下界的(比较复杂,限于篇幅不再赘述);■\blacksquare■

  • 现在我们的目标是将一般的情况归约到上述描述的情形中:

    对于一个给定的DFA MMM以及对应的G=G(M)G=G(M)G=G(M),设C(G)\mathcal{C}(G)C(G)是图GGG的分量图graph of components);

    • 备注:

      定义:C(G)\mathcal{C}(G)C(G)的定义似乎比较复杂,首先C(G)\mathcal{C}(G)C(G)也是一个有向图,它的每一个顶点对应图GGG中的一个强连通分量或一个单一顶点(如果该顶点不属于图GGG中的任何一个强连通分量);

      C(G)\mathcal{C}(G)C(G)的构造目的是为了得到一个有向无环图,因为如果C(G)\mathcal{C}(G)C(G)中存在环,那么环上的各个顶点对应的强连通分量单一顶点在原图GGG中必然属于一个强连通分量;

      所以C(G)\mathcal{C}(G)C(G)的构造就是从这样一个角度看图GGG,图GGG必然由若干最大强连通分量或一个单一顶点构成,其中每一个强连通分量都不能再包含更多其他的顶点,每一个单一顶点都不属于任何强连通分量;于是C(G)\mathcal{C}(G)C(G)必然是一个有向无环图

    定义C(G)\mathcal{C}(G)C(G)中顶点集合为C1,C2,...,CkC_1,C_2,...,C_kC1​,C2​,...,Ck​,即顶点数量为kkk,并假设原图GGG中每一个状态都从q1q_1q1​(q1∈C1q_1\in C_1q1​∈C1​)出发可达;

    则C(G)\mathcal{C}(G)C(G)中从C1C_1C1​出发可以到达每一个其他顶点;

  • 接下来我们描述长度为nnn的单词w∈LMw\in L_Mw∈LM​如何在自动机中移动:

    若单词w∈Lw\in Lw∈L,则它将从q1q_1q1​出发最终落在某个接受状态;对应地,www将从C1C_1C1​出发,并最终终止在一个包含接受状态的分量中(component);

    以下给出可接受三元组admissible triplet)的定义:(A,P,Π)(A,P,\Pi)(A,P,Π);

    定义(admissible path

    • 称C(G)\mathcal{C}(G)C(G)中的一条路径是可接受的admissible),若它从C1C_1C1​(q1∈C1q_1\in C_1q1​∈C1​)出发,最终终止在某个包含接受状态的分量中;

    定义(admissible portals

    • 给定一条admissible pathA=(Ci1,Ci2,...,Cit)A=(C_{i_1},C_{i_2},...,C_{i_t})A=(Ci1​​,Ci2​​,...,Cit​​),称序列P=(pj1,pj2)j=1tP=(p_j^1,p_j^2)_{j=1}^tP=(pj1​,pj2​)j=1t​是可接受序列门控admissible sequence of portals),若其满足如下若干约束:

      1. pj1,pj2∈Cij∀1≤j≤tp_j^1,p_j^2\in C_{i_j}\quad\forall 1\le j\le tpj1​,pj2​∈Cij​​∀1≤j≤t;
      2. p11=q1p_1^1=q_1p11​=q1​;
      3. pt2∈Fp_t^2\in Fpt2​∈F;
      4. (pj−12,pj1)∈E(G)2≤j≤t(p_{j-1}^2,p_j^1)\in E(G)\quad2\le j\le t(pj−12​,pj1​)∈E(G)2≤j≤t;
    • 显然若CijC_{i_j}Cij​​是单一顶点,则pj1=pj2p_j^1=p_j^2pj1​=pj2​;

    定义(admissible partition

    • 给定admissible portals序列PPP,称一个递增的正整数序列Π=(nj)j=1t+1\Pi=(n_j)_{j=1}^{t+1}Π=(nj​)j=1t+1​是可接受的划分admissible partition),若其满足如下若干约束:

      1. n1=0n_1=0n1​=0;
      2. ∀1≤j≤t\forall1\le j\le t∀1≤j≤t,若CijC_{i_j}Cij​​是一个强连通分量的,则必然存在一条路径从pj1→pj2p_j^1\rightarrow p_j^2pj1​→pj2​,记这条路径的长度为nj+1−nj−1n_{j+1}-n_j-1nj+1​−nj​−1;
      3. nt+1=n+1n_{t+1}=n+1nt+1​=n+1;
    • 显然若CijC_{i_j}Cij​​是单一顶点,则nj+1=nj+1n_{j+1}=n_j+1nj+1​=nj​+1;
    • njn_jnj​的含义是当www到达分量CijC_{i_j}Cij​​时已经经过的状态数量,比如在抵达Ci1C_{i_1}Ci1​​时,尚未经过任何状态(n1=0n_1=0n1​=0),抵达Ci2C_{i_2}Ci2​​时,经历的状态数量(n2=N+1n_2=N+1n2​=N+1,NNN为p11→p12p_1^1\rightarrow p_1^2p11​→p12​路径的长度),这里多一个−1-1−1的原因是在跨越分量时需要一次转移;
    • 总之www在区间[nj+1,nj+1−1][n_j+1,n_{j+1}-1][nj​+1,nj+1​−1]上位于CijC_{i_j}Cij​​中;
    • 注意理论上给定(A,P)(A,P)(A,P),有可能不存在Π\PiΠ与之对应;这个我没搞明白为什么?

    至此我们给出了可接受三元组admissible triplet)(A,P,Π)(A,P,\Pi)(A,P,Π)的定义;

    我们的目的是基于这样的考察,若w∈Lw\in Lw∈L,则当然可以找到一个可接受三元组与之对应;否则任意可接受三元组都不能与www对应;

  • 我们根据给定的admissible triplet(A,P,Π)(A,P,\Pi)(A,P,Π)构建一系列子语言:

    1. 设A=(Ci1,Ci2,...,Cit),P=(pj1,pj2)j=1t,Π=(nj)j=1t+1A=(C_{i_1},C_{i_2},...,C_{i_t}),P=(p_j^1,p_j^2)_{j=1}^t,\Pi=(n_j)_{j=1}^{t+1}A=(Ci1​​,Ci2​​,...,Cit​​),P=(pj1​,pj2​)j=1t​,Π=(nj​)j=1t+1​;

    2. ∀1≤j≤t\forall1\le j\le t∀1≤j≤t,我们定义子语言LjL_jLj​,根据如下的方式:

      • 向CijC_{i_j}Cij​​中新增一个状态fjf_jfj​;

      • 定义子自动机MjM_jMj​,其中pj1p_j^1pj1​为MjM_jMj​的初始状态,pj2p_j^2pj2​为MjM_jMj​的唯一的接受状态;

      • 对于每一个q∈Cijq\in C_{i_j}q∈Cij​​以及α∈{0,1}\alpha\in\{0,1\}α∈{0,1},若δM(α,q)∈Cij\delta_M(\alpha,q)\in C_{i_j}δM​(α,q)∈Cij​​,则定义δMj(α,q)=δM(α,q)\delta_{M_j}(\alpha,q)=\delta_M(\alpha,q)δMj​​(α,q)=δM​(α,q),否则定义δMj(α,q)=fj\delta_{M_j}(\alpha,q)=f_jδMj​​(α,q)=fj​;

      • δMj(0,fj)=δMj(1,fj)=fj\delta_{M_j}(0,f_j)=\delta_{M_j}(1,f_j)=f_jδMj​​(0,fj​)=δMj​​(1,fj​)=fj​;

      • 定义LjL_jLj​是由MjM_jMj​接受的语言;

    3. 注意LjL_jLj​满足引理2.42.42.4的条件;

  • 最后我们定义一系列www(∣w∣=n|w|=n∣w∣=n)的子单词w1,w2,...,wtw^1,w^2,...,w^tw1,w2,...,wt,其中wj=wnj+1...wnj+1−1w^j=w_{n_j+1}...w_{n_{j+1}-1}wj=wnj​+1​...wnj+1​−1​,其中1≤j≤t1\le j\le t1≤j≤t,标记∣wj∣=nj+1−nj−1|w^j|=n_{j+1}-n_j-1∣wj∣=nj+1​−nj​−1;

    上述一堆定义引出接下来一个非常重要的引理:

  • 引理2.52.52.5:

    (A,P,Π)(A,P,\Pi)(A,P,Π)是一个admissible triplet,其中A=(Ci1,Ci2,...,Cit),P=(pj1,pj2)j=1t,Π=(nj)j=1t+1A=(C_{i_1},C_{i_2},...,C_{i_t}),P=(p_j^1,p_j^2)_{j=1}^t,\Pi=(n_j)_{j=1}^{t+1}A=(Ci1​​,Ci2​​,...,Cit​​),P=(pj1​,pj2​)j=1t​,Π=(nj​)j=1t+1​;

    设www是长度为nnn的单词且满足dist(w,L)≥ϵn{\rm dist}(w,L)\ge\epsilon ndist(w,L)≥ϵn;

    定义子语言序列(Lj)j=1t(L_j)_{j=1}^t(Lj​)j=1t​以及子单词序列(wj)j=1t(w_j)_{j=1}^t(wj​)j=1t​;

    则存在某个索引1≤j≤t1\le j\le t1≤j≤t,满足dist(wj,Lj)≥ϵn−tt{\rm dist}(w^j,L_j)\ge\frac{\epsilon n-t}tdist(wj,Lj​)≥tϵn−t​;

    • 备注:

      我感觉这里的kkk好像是ttt,上面是说kkk是分量图C(G)\mathcal{C}(G)C(G)顶点的数量;

    引理2.52.52.5证明:(证明很简短)

    • 反证法:

      若不存在这样的索引jjj,则∀1≤j≤t\forall1\le j\le t∀1≤j≤t:

      1. 若nj+1−nj≥2n_{j+1}-n_j\ge2nj+1​−nj​≥2,令wj∗∈Ljw^{j*}\in L_jwj∗∈Lj​是一个长度为nj+1−nj−1n_{j+1}-n_j-1nj+1​−nj​−1的单词,其中dist(wj,wj∗)<ϵn−kk{\rm dist}(w^j,w^{j*})<\frac{\epsilon n-k}kdist(wj,wj∗)<kϵn−k​;
      2. 若nj+1−nj=1n_{j+1}-n_j=1nj+1​−nj​=1,设wj∗=∅w^{j*}=\emptysetwj∗=∅;

      对于1≤j≤t−11\le j\le t-11≤j≤t−1,我们选择αj∈{0,1}\alpha_j\in\{0,1\}αj​∈{0,1}使得δM(αj,pj2)=pj+11\delta_M(\alpha_j,p_j^2)=p_{j+1}^1δM​(αj​,pj2​)=pj+11​,然后通过构造单词w∗=w1∗α1w2∗...αt−1wt∗∈Lw^*=w^{1*}\alpha_1w^{2*}...\alpha_{t-1}w^{t*}\in Lw∗=w1∗α1​w2∗...αt−1​wt∗∈L,于是dist(w,w∗)≤t−1+∑j=1tdist(wj,wj∗)≤t−1+t(ϵn−t)t≤ϵn−1{\rm dist}(w,w^*)\le t-1+\sum_{j=1}^t{\rm dist}(w^j,w^{j*})\le t-1+\frac{t(\epsilon n-t)}t\le \epsilon n-1dist(w,w∗)≤t−1+∑j=1t​dist(wj,wj∗)≤t−1+tt(ϵn−t)​≤ϵn−1,矛盾!■\blacksquare■

    • 备注:

      引理2.52.52.5的结论非常重要,首先子单词序列(wj)j=1t(w_j)_{j=1}^t(wj​)j=1t​的定义方式其实就是子单词在C(G)\mathcal{C}(G)C(G)中的转移路线构成的admissible triplet,但是单词www并不属于LLL,于是根据引理2.52.52.5可知,这样每个区块的子单词,至少存在某一段满足距离LLL是ϵt\frac\epsilon ttϵ​-far

  • 于是,通过上述的引理与各个定义,我们得到了正则语言可检验性的一个证明思路:

    1. 我们的目的是想要检验是否一个长度为nnn的单词www是否与某个admissible triplet相匹配:

      • 若存在这样的匹配(In the positive case),即w∈LMw\in L_Mw∈LM​,则www在MMM中的traversal path直接可以定义得到一个www匹配的admissible triplet

      • 若不存在这样的匹配(In the negative case),即dist(w,L)≥ϵn{\rm dist}(w,L)\ge\epsilon ndist(w,L)≥ϵn;

        引理2.52.52.5指出,任意admissible triplet(A,P,Π)(A,P,\Pi)(A,P,Π),至少有一个子单词wjw^jwj会距离LjL_jLj​非常的远(其实就是在平均值以上,这个我感觉还是挺显然的);

        然后再根据引理2.42.42.4可知,这个wjw^jwj会包含很多短且不可行的子单词(runs);因此只需要采样少量的随机子单词即可证明wjw^jwj确实不可行;从而证明了www不可行;

    2. 事情看起来似乎非常顺利,然而问题在于admissible triplets的数量很多,而且显然与nnn是有关的(事实上这个数量是关于nnn的一个多项式),这样会导致很难遍历所有的admissible triplets来检查www的子单词;

    3. 于是我们用如下的方式来解决这一难题:

      • We place evenly in 1,2,...,n1,2,...,n1,2,...,n a bounded number of transition intervals TsT_sTs​ of a bounded length and postulate that a transition between components of C(G)\mathcal{C}(G)C(G) should happen inside these transition intervals

        • 备注:

          我是真TM的不知道这句话是什么意思,postulate是假设的意思,我感觉噢,只是感觉,应该意思是说希望找个admissible triplet,其中正整数序列Π\PiΠ里面的每个数字分布地相对比较均匀,或者换言之,C(P)\mathcal{C}(P)C(P)里面各个分量地大小比较均衡,总之就是转移的interval是比较合理的;

      • 然后我们证明:

        若w∈Lw\in Lw∈L,则可以对www稍作调整即可满足该限制(restriction);(???)

        若dist(w,L)≥ϵn{\rm dist}(w,L)\ge\epsilon ndist(w,L)≥ϵn,则对于任意这样的admissible triplet,www都远远不能与之匹配;

      • 于是在这样的制约情形下,admissible triplet的数量会限制在只与ϵ\epsilonϵ相关的某个函数之内;

    4. 具体而言,我们做如下的一些标记:

      • m=max⁡j(m(Cj)),l=lcm({g(G(Cj))})m=\max_j(m(C_j)),l={\rm lcm}(\{g(G(C_j))\})m=maxj​(m(Cj​)),l=lcm({g(G(Cj​))}),其中lcm\rm lcmlcm是最小公倍数,jjj只遍历那些强连通分量(即可以忽略单个顶点,不过好像作者的意思就是C(G)\mathcal{C}(G)C(G)的顶点就完事了);
      • 然后就要设定一个非常神奇的数字了:S=129kmlog⁡(1/ϵ)/ϵS=129km\log(1/\epsilon)/\epsilonS=129kmlog(1/ϵ)/ϵ,这里的kkk是C(G)\mathcal{C}(G)C(G)顶点的数量;SSS是transition intervals的数量;(我怀疑这里的129129129是写错了,根据下面应该是128128128才对)
      • 接下来就是将SSS个transition intervals {Ts}s=1S\{T_s\}_{s=1}^S{Ts​}s=1S​均匀的分布在[n]={1,2,...,n}[n]=\{1,2,...,n\}[n]={1,2,...,n}上,其中每个transition interval TsT_sTs​的大小为∣Ts∣=(k−1)(l+m)|T_s|=(k-1)(l+m)∣Ts​∣=(k−1)(l+m);
      • 最后再定义一组非常神奇的数字:ri=128k2mlog⁡2(1ϵ)2iϵ,1≤i≤log⁡(12km/ϵ)r_i=\frac{128k^2m\log^2(\frac1\epsilon)}{2^i\epsilon},1\le i\le\log(12km/\epsilon)ri​=2iϵ128k2mlog2(ϵ1​)​,1≤i≤log(12km/ϵ);

      备注:

      非常的迷,出现了一个未知的变量TsT_sTs​,~~我理解TsT_sTs​应该是一些边(即状态转移)的集合;~~我现在觉得可能就是Ts⊂[n]T_s\subset[n]Ts​⊂[n],而已;

      按道理说S∣Ts∣S|T_s|S∣Ts​∣的大小应该差不多是nnn(不是说均匀分布么),但是这边看起来至少没那么显然… 而且我觉得恐怕大概率不会等于nnn;

      最后一个rir_iri​事实上可以写成−klog⁡(ϵ)2iS-\frac{k\log(\epsilon)}{2^i}S−2iklog(ϵ)​S

    于是我们给出如下的检验算法:

  • 检验算法

    算法输入为单词www,其中∣w∣=n|w|=n∣w∣=n;

    1. 对于每个满足1≤i≤log⁡(12km/ϵ)1\le i\le\log(12km/\epsilon)1≤i≤log(12km/ϵ)的iii,随机采样rir_iri​个随机的www子单词w′w'w′,∣w′∣=2i+1|w'|=2^{i+1}∣w′∣=2i+1;
    2. 对于每一个admissible triplet(A,P,Π)(A,P,\Pi)(A,P,Π):
      A=(Ci1,...,Cit)P=(pj1,pj2)j=1tΠ=(nj)j=1t+1\begin{aligned} A&=(C_{i_1},...,C_{i_t})\\ P&=(p_j^1,p_j^2)_{j=1}^t\\ \Pi&=(n_j)_{j=1}^{t+1} \end{aligned} APΠ​=(Ci1​​,...,Cit​​)=(pj1​,pj2​)j=1t​=(nj​)j=1t+1​​
      对于每个j(2≤j≤t−1)j(2\le j\le t-1)j(2≤j≤t−1),存在s(1≤s≤S)s(1\le s\le S)s(1≤s≤S),使得nj∈Tsn_j\in T_snj​∈Ts​,

      • 如上述方法构造自动机Mj,1≤j≤tM_j,1\le j\le tMj​,1≤j≤t;
      • 丢弃掉(discard)那些距离某个njn_jnj​至多ϵn/(128kmlog⁡(1/ϵ))\epsilon n/(128km\log (1/\epsilon))ϵn/(128kmlog(1/ϵ))的子单词;
      • 对于每一个保留下的子单词RRR,若RRR落在njn_jnj​与nj+1n_{j+1}nj+1​之间,检查RRR是否关于MjM_jMj​可行(从b−nj+1b-n_j+1b−nj​+1的字节位开始);其中bbb是RRR在www中第一个字节所对应的坐标值;
    3. 若对于某个admissible triplet,所有用于检测的子单词都是可行的,则算法输出YesYesYes,否则至少有一个admissible triplet不可行,算法输出NoNoNo;
  • 引理2.62.62.6:若dist(w,L)≥ϵn{\rm dist}(w,L)\ge\epsilon ndist(w,L)≥ϵn,则上述检验算法输出No\rm NoNo的概率至少为34\frac3443​,若w∈Lw\in Lw∈L,则上述检验算法总是输出Yes\rm YesYes;

    引理2.62.62.6证明:略,太复杂了,最终的结论是查询次数不超过300k2mlog⁡3(1ϵ)ϵ\frac{300k^2m\log^3(\frac1\epsilon)}\epsilonϵ300k2mlog3(ϵ1​)​;

  • 定理111:对于任意的正则语言LLL,每一个整数nnn以及每一个充分小正数ϵ>0\epsilon>0ϵ>0,都存在一个关于L∩{0,1}nL\cap\{0,1\}^nL∩{0,1}n单边错误ϵ\epsilonϵ检验算法(one-side error ϵ\epsilonϵ-testing algorithm),它的查询复杂度为clog⁡3(1/ϵ)/ϵc\log^3(1/\epsilon)/\epsilonclog3(1/ϵ)/ϵ,其中常数c>0c>0c>0只依赖于LLL;

3 正则语言的下界 Lower Bound for Regular Languages

  • 命题111:设LLL是定义在{0,1}\{0,1\}{0,1}上正则语言,L={1n:n≥1}L=\{1^n:n\ge1\}L={1n:n≥1},则对于任意的nnn,针对L∩{0,1}nL\cap\{0,1\}^nL∩{0,1}n的ϵ\epsilonϵ检验的查询寻复杂度至少为13ϵ\frac1{3\epsilon}3ϵ1​;

    证明略。

4 上下文无关语言的可检验性 Testability of Context-free Languages

4.1 某些上下文无关的语言是不可检验的 Some Context-free Languages are Non-testable

  • 命题222:上下文无关的语言L={vvRuuR}L=\{vv^Ruu^R\}L={vvRuuR},其中wRw^RwR表示单词www的逆转,是不可检验的;

4.2 Dyck语言的可检验性 Testability of the Dyck Languages

5 总结 Concluding Remarks

参考文献

[1] N. Alon, E. Fischer, M. Krivelevich, M. Szegedy, Efficient testing of large graphs, Proceedings of the 40th IEEE FOCS (1999), to appear.
[2] S. Arora, C. Lund, R. Motwani, M. Sudan, M. Szegedy, Proof verification and intractability of approximation problems, Proceedings of the 33th IEEE FOCS (1992), 14–23.
[3] M. Blum, M. Luby, R. Rubinfeld, Self-testing/correcting with applications to numerical problems. J. Computer System Sciences 47 (1994), 549–595.
[4] M. D. Davis, R. Sigal and E. Weyuker, Computability, Complexityand Languages: Fundamentals of Theoretical Computer Science, Academic Press, 1994.
[5] J. Dixmier, Proof of a conjecture by Erd˝os and Graham concerning the problem of Frobenius, J. Number Theory 34 (1990), no. 2, 198–209.
[6] P. Gemmell, R. Lipton, R. Rubinfeld, M. Sudan, A. Wigderson, Self-testing/correcting for polynomials and forapproximate functions,Proceedings of the 23th ACM STOC (1991), 32–42.
[7] O. Goldreich, S. Goldwasser and D. Ron, Property testing and its connections to learning and approximation. To appear in J. of the ACM, also: Proceedings of the 37th IEEE FOCS (1996), 339–348.
[8] J.E. Hopcroft and J. D. Ullman, Introduction to Automata Theory, Languages, and Computation, Addison-Wesley, 1979.
[9] M. Lewin, A bound for a solution of a linear Diophantine problem, J. London Math. Soc. (2) 6 (1972), 61–69.
[10] R. Lipton, New directions in testing, Unpublished manuscript, 1989.
[11] N. Nisan, M. Szegedy, On the degree of Boolean functions as real polynomials, Proceedings of the 24th ACM STOC (1992), 462–467.
[12] N. Nisan, CREW PRAMs and decision trees, Proceedings of the 21st ACM STOC (1989), 327–335.
[13] R. Rubinfeld, M. Sudan, Robust characterization of polynomials with applications to program testing. SIAM J. of Computing, 25(2) (1996), 252-271.
[14] A. C. Yao, Probabilistic computation, towards a unified measure of complexity. Proceedings of the 18th IEEE FOCS (1977), 222–227.

【学习笔记】正则语言的可检验性(性质检验)相关推荐

  1. 【学习笔记】Property Testing(性质检验)

    序言 性质检验(Property Testing)但是计算机算法理论中非常重要的领域,性质检验本身是一个非常笼统的概念,确切地说,性质检验包括对图性质(二分性.连通性.团的性质.割的性质),离散函数性 ...

  2. 高维统计学习笔记1——LASSO和Oracle性质

    高维统计学习笔记1--LASSO和Oracle性质 主要参考资料:Sara Van De Geer<Estimation and Testing Under Sparsity> 前言 当年 ...

  3. 【ProVerif学习笔记】4:信息安全性质(Security Property)

    1 Reachability和Secrecy 证明Reachability是最基本的能力,因为需要知道攻击者能访问到哪些term,而Secrecy就可以根据这个来评估--能访问到的term不满足Sec ...

  4. RNA-seq流程学习笔记(6)使用md5sum检验下载数据的完整性

    参考文章: 鸟哥的Linux私房菜:检验软件正确性 Linux系统中每个文件有其独特的指纹验证数据,因为每个文件的内容和大小都不相同,所以文件如果在下载过程中因为传输造成数据缺失,就会有一部分的信息不 ...

  5. R语言学习笔记三:两独立样本t检验

    三:两独立样本ttt检验 前文介绍了有关ttt检验的相关知识. 在实际运用中,两独立样本的ttt检验是运用较为广泛的. 1.数据准备 这里使用iris3数据集,这是一个三位数组,我们将使用iris3[ ...

  6. 【信号与系统学习笔记】——奇异函数家族及其性质

    我们在之前的学习中知道,单位冲激函数是一类奇异函数.我们来回顾一下单位冲激函数的操作性定义:x(t)=x(t)∗δ(t)x(t) = x(t) * δ(t)x(t)=x(t)∗δ(t) 也就是说,任何 ...

  7. 考研数据结构学习笔记.树的常考性质

    树的常考性质 树作为重要的数据结构,通常在操作系统,算法等领域起着重要的作用.其特殊性质需要我们了解并且运用,在考研中他们通常会以选择题的形式出现,我们需要熟练掌握并且能够准确地计算. 一.结点数 = ...

  8. 医咖会免费SPSS教程学习笔记—肯德尔协同系数检验

    1.适用情形 超过两位的观察者观察连续变量或者有序分类变量 2.假设条件 3.实操 分析-非参数检验-相关样本-在"目标"下选择"自动比较实测数据和假设数据"- ...

  9. 最优化学习笔记(六)——牛顿法性质分析

    一.牛顿法存在的问题 在单变量的情况下,如果函数的二阶导数f′′<0f'',牛顿法就无法收敛到极小点.类似的,在多变量的情况下,目标函数的hessian矩阵F(x(k))\boldsymbol{ ...

  10. linux学习笔记:磁盘格式化与磁盘检验命令

    我们在磁盘分割需要对文件系统进行格式化,这时用到命令 mkfs (意思是make filesystem) 小技巧: 查看mkfs 支持的文件格式的方法: 输入命令mkfs ,然后按两下TAB键 用法: ...

最新文章

  1. 【第11周复盘】小朋友们 100% 闯关成功!
  2. cidr斜线记法地址块网络前缀_学习笔记之《计算机网络》- 网络层(一)
  3. by截取字段 group_sqlserver group by后获取其他字段(多种方法)
  4. log-slave-updates 引起 MySQL 从节点同步异常慢
  5. eclipse常用以及实用的快捷键
  6. c++中list容器
  7. 130 秒揭秘 EDAS 3.0 如何平滑应对突发流量高峰,为您的业务保驾护航
  8. Problem(三):工作中的记录。。。。
  9. 编程之美读书笔记1.8 - 小飞的电梯调度算法
  10. js里写网页结构, 传函数参数
  11. 20200614每日一句
  12. 【肌电信号】基于matlab GUI脉搏信号处理系统【含Matlab源码 1062期】
  13. 我的世界服务器物品锁bug,【MOD教程】已知MOD服BUG物品解析
  14. OOP的六大原则+一法则
  15. 智能颈部按摩仪设计——2.开发环境搭建
  16. java 事件冷却,基于“牛顿冷却定律”的机器学习算法
  17. C++右值引用与函数返回值
  18. 笔记本电脑充电时会产生强电磁场不宜使用
  19. 五大创新型AI软件公司,下一个AI独角兽就是你
  20. 系统重构数据同步利器之Canal实战篇

热门文章

  1. 【原创】Windows图标助手v2.0
  2. 微信小程序app.json全局配置项
  3. SELinux权限问题解决
  4. 使用qq邮箱发送html格式的邮件
  5. python库吐血整理
  6. gitee项目能用SVN拉取吗_使用Git开发维护Github开源项目的一些经验
  7. DAVINCI DM36x开发攻略——U-BOOT-2010.12及UBL移植
  8. 使用函数创建多个备选BOM
  9. 微信小程序-如何引入地图组件及显示当前所在位置
  10. 关于写作,村上春树提供的几个方法