本节所需的前置知识

定义1:令M是一个在所有输入上都停机的确定型图灵机。M的空间复杂度定义为函数f:N→Nf:\ N\rightarrow Nf: N→N,其中f(n)f\left(n\right)f(n)是M在任何长为n的输入上扫描带子方格的最大数。若空间复杂度为f(n)f\left(n\right)f(n),则称M在空间f(n)f\left(n\right)f(n)内运行。如果M是对所有输入在所有分支都停机的非确定型图灵机,则M的空间复杂度定义为对任何长为n的输入,在任何计算分支上所扫描的带子方格的最大数。

定义2:令f:N→R+f:N\rightarrow R^+f:N→R+为一个函数。空间复杂度类SPACE(f(n))SPACE\left(f\left(n\right)\right)SPACE(f(n))和NSPACE(f(n))NSPACE\left(f\left(n\right)\right)NSPACE(f(n))定义为:

SPACE(f(n))=SPACE\left(f\left(n\right)\right)=SPACE(f(n))={L|L是被O(fn)O(f_n)O(fn​)空间的确定型图灵机判定的语言}

NSPACE(f(n))=NSPACE\left(f\left(n\right)\right)=NSPACE(f(n))={L|L是被O(fn)O(f_n)O(fn​)空间的非确定型图灵机判定的语言}

引理3:设M是有q个状态和g个带子符号的LBA。对于长为n的带子,则M恰有qngnqng^nqngn个不同的格局。

  • 推论:如果M在f(n)f\left(n\right)f(n)的空间内运行,ω\omegaω是长为n的输入,则M在ω\omegaω上的格局数是n2O(f(n))n2^{O\left(f\left(n\right)\right)}n2O(f(n)),若f(n)≥log⁡nf\left(n\right)\geq\log{n}f(n)≥logn,则n2O(f(n))=2O(f(n))n2^{O\left(f\left(n\right)\right)}=2^{O\left(f\left(n\right)\right)}n2O(f(n))=2O(f(n))。

定理4:(萨维奇定理)对于任何函数f:N→R+f:N\rightarrow R^+f:N→R+,其中f(n)≥nf\left(n\right)\geq nf(n)≥n,有:
NSPACE(f(n))⊆SPACE(f2(n))NSPACE\left(f\left(n\right)\right)\subseteq SPACE\left(f^2\left(n\right)\right)NSPACE(f(n))⊆SPACE(f2(n))

第一部分:PSPACE类与PSPACE完全性

定义5:PSPACE是可以被确定型图灵机在多项式空间内判定的语言类,NPSPACE是可以被非确定型图灵机在多项式空间内判定的语言类,EXPSPACE是可以被确定型图灵机在指数空间内判定的语言类。

PSPACE=⋃kSPACE(nk),NPSPACE=⋃kNSPACE(nk),EXPSPACE=⋃kSPACE(2nk)PSPACE=\bigcup_{k} S P A C E\left(n^k\right),NPSPACE=\bigcup_{k} N S P A C E\left(n^k\right),EXPSPACE=\bigcup_{k} S P A C E\left(2^{n^k}\right)PSPACE=⋃k​SPACE(nk),NPSPACE=⋃k​NSPACE(nk),EXPSPACE=⋃k​SPACE(2nk)

根据萨维奇定理的结论可知,NPSPACE类和PSPACE类等价,因为任何多项式的平方仍然是多项式。对于一个图灵机,如果它的时间复杂度为T(n)T\left(n\right)T(n),那么其空间复杂度至多为T(n)T\left(n\right)T(n),这是因为每一步计算最多访问一个格子,这个结论对确定型图灵机和非确定型图灵机都成立。注意到多项式空间图灵机M如果判定语言L,则交换M的接受状态和拒绝状态可以得到M′M^\primeM′判定L‾\overline{L}L,所以可知PSPACE关于补运算封闭,coNP⊆PSPACEcoNP\subseteq PSPACEcoNP⊆PSPACE。除此之外,根据引理3的推论,我们知道对于空间复杂度O(f(n))O\left(f\left(n\right)\right)O(f(n))的图灵机,其存在一个格局数上限为2O(f(n))2^{O\left(f\left(n\right)\right)}2O(f(n)),由于一个可判定的图灵机运行时间不能超过其格局总数(这是LBA部分的结论,如果超过则已经进入循环),空间复杂度O(f(n))O\left(f\left(n\right)\right)O(f(n))的图灵机时间复杂度不超过2O(f(n))2^{O\left(f\left(n\right)\right)}2O(f(n)),这是EXPTIME(∪kTIME(2nk))EXPTIME(\cup_kTIME\left(2^{n^k}\right))EXPTIME(∪k​TIME(2nk))的范畴。

因此,我们可以导出目前学习的复杂度类的关系如下:

P⊆NP⊆PSPACE(NPSPACE)⊆EXPTIMEP\subseteq NP\subseteq PSPACE\left(NPSPACE\right)\subseteq EXPTIMEP⊆NP⊆PSPACE(NPSPACE)⊆EXPTIME

P⊆coNP⊆PSPACE(NPSPACE)⊆EXPTIMEP\subseteq coNP\subseteq PSPACE\left(NPSPACE\right)\subseteq EXPTIMEP⊆coNP⊆PSPACE(NPSPACE)⊆EXPTIME

我们可以证明时间层次定理,其表述为对于任何时间可构造函数t:N→Nt:N\rightarrow Nt:N→N,存在语言A,在时间O(t(n))O\left(t\left(n\right)\right)O(t(n))内可判定但在时间o(t(n)logt(n))o\left(\frac{t\left(n\right)}{logt\left(n\right)}\right)o(logt(n)t(n)​)内不可判定,由此可得P⫋EXPTIMEP⫋EXPTIMEP⫋EXPTIME。因此,可以确定这些类的关系式间至少有一个真包含。目前学界普遍认为这四种类关系全为真包含。

复杂度关系图

第二部分:一个PSPACE完全的实例——TQBF问题。

定义6:对于一个语言A,称它为PSPACE完全当且仅当其属于PSPACE类并且PSPACE类中的每一个语言B都可以多项式时间归约到B,即B≤pAB\le_pAB≤p​A。如果仅满足B≤pAB\le_pAB≤p​A,则成A为PSPACE难。

这里存在一个值得注意的点是,我们要求的是多项式时间归约而非多项式空间规约。其主要原因是担心在使用多项式空间归约时,完全问题的容易解法不一定能导出其它归约到它的问题的容易解法。因此,在定义一个复杂度类时,规约模型必须比用来定义类本身的模型更加受限。

一个经典的PSPACE完全问题是TQBF问题(True Quantified Boolean Formula),其的定义是TQBF={<ϕ>∣ϕTQBF=\{<\phi>|\phiTQBF={<ϕ>∣ϕ是真的全量词化的布尔公式}。这里面存在几个新的定义,在SAT问题中我们定义了形如ϕ=(x∨y)∧(x‾∨y)\phi=\left(x\vee y\right)\land\left(\overline{x}\vee y\right)ϕ=(x∨y)∧(x∨y)的布尔公式,在其中添加量词实际上就是对某个变量添加约束:

∃\exists∃是存在量词,∃xϕ\exists x\phi∃xϕ的意思是对于变量x的某个值(0/1)(0/1)(0/1),语句ϕ\phiϕ为真。

∀\forall∀是全称量词,∀xϕ\forall x\phi∀xϕ的意思是对于变量x的全体值,语句ϕ\phiϕ全为真。

因此,我们可以称所有带量词的布尔公式为量词化布尔公式。除此之外,还称∃x\exists x∃x和∀x\forall x∀x中的x受到该量词约束,x本身还存在取值的域,一个例子是对于∃x[2x=5]\exists x\left[2x=5\right]∃x[2x=5]在x∈Rx\in Rx∈R和x∈Zx\in Zx∈Z时前者为真后者为假。量词本身作用的范围是量化变量后的第一对括弧出现的语句段,该段称为辖域,如果所有量词的辖域都是其后所有语句部分(即所有量词都在最前面),则称这种语句为前束范式。值得注意的是,每个带量词的布尔公式都可以转化为与其等价的具有前束范式形式的量词化布尔公式。一个例子如下:ϕ=∀x∃y(x∨y)\phi=\forall x\exists y\left(x\vee y\right)ϕ=∀x∃y(x∨y)

如果一个量词化布尔公式所有变量都出现在某一量词的辖域内,则该公式为全量词化的(有时也称句子)。换言之,公式中每个变量都是受约束的。这种公式可以判断其真假性。

定理7:TQBF是PSPACE完全的。

证明分为两步,首先证明TQBF∈PSPACE:TQBF\in PSPACE:TQBF∈PSPACE:

给定一个判定全量词化布尔公式ϕ\phiϕ的算法A:
A= “对于输入的全量词化布尔公式<ϕ><\phi><ϕ>

  • 检查整条公式,如果整个公式不含量词,则其为一个常数运算表达式,计算其的值,如为真则接受,如为假则拒绝。
  • 若ϕ\phiϕ可以表示为∃xψ\exists x\psi∃xψ,则在ψ\psiψ上递归调用算法A。首先用0替换x,然后再重新用1替换x,如果这两种替换有一个结果是接受的,则接受,否则拒绝。
  • 若ϕ\phiϕ可以表示为∀xψ\forall x\psi∀xψ,则在ψ\psiψ上递归调用算法A。首先用0替换x,然后再重新用1替换x,如果这两种替换的两个结果都是接受的,则接受,否则拒绝。”

算法A可以判定全量词化布尔公式,又发现该公式递归层数恰为变量的个数,而每一层又只需要存储当前层变量被替换为0还是1,所以空间复杂度为O(Nvar)O\left(N_{var}\right)O(Nvar​),其中NvarN_{var}Nvar​是公式中变量个数。因此,算法A可以在线性空间内运行。
证明的第二步就是证明对于任意一个图灵机M在nkn^knk空间内判定的语言A,有A≤pTQBFA\le_pTQBFA≤p​TQBF。换言之, 我们所设计的多项式时间归约g可以满足ω∈A⟺g(ω)∈TQBF\omega\in A\Longleftrightarrow g\left(\omega\right)\in TQBFω∈A⟺g(ω)∈TQBF。对于ω∈A\omega\in Aω∈A,我们可以得到M在ω\omegaω上的接受计算历史,其为从cstartc_{start}cstart​到cacceptc_{accept}caccept​的有限序列。根据引理3的推论我们有以下两个重要结论:

  • ∀ω∈A\forall\omega\in A∀ω∈A,可以得到M在ω\omegaω上的一个长不超过2dnk2^{dn^k}2dnk的接受计算历史。
  • ∀ω∉A\forall\omega\notin A∀ω∈/​A,可以得到M在ω\omegaω上的一个长不超过2dnk2^{dn^k}2dnk的拒绝计算历史。

类似SAT的P完全性证明,我们可以设计一个dnk×2dnkdn^k\times2^{dn^k}dnk×2dnk的格局表:

现在设定对应格局的符号c,它对应一组布尔变量{ci,s∣i=1,2,…,nk+1,s∈Q∪Γ∪⊔}\{c_{i,s}|i=1,2,\ldots,n^k+1,s\in Q\cup\Gamma\cup\sqcup\ \}{ci,s​∣i=1,2,…,nk+1,s∈Q∪Γ∪⊔ },对于某个变量指派不同的真假值可以表示具体的格局。如对于格局101q210⊔⊔…101q_210\sqcup\sqcup\ldots101q2​10⊔⊔…可以表示为布尔公式ψci=c1,1∧c2,0∧c3,1∧c4,q2∧c5,1∧c6,0∧c7⊔…∧c0,0‾…\psi_{c_i}=c_{1,1}\land c_{2,0}\land c_{3,1}\land c_{4,q_2}\land c_{5,1}\land c_{6,0}\land c_{7\sqcup}\ldots\land\overline{c_{0,0}}\ldotsψci​​=c1,1​∧c2,0​∧c3,1​∧c4,q2​​∧c5,1​∧c6,0​∧c7⊔​…∧c0,0​​…。

如果这里仅仅采用类似于库克-列文定理的策略,设计ϕ=ϕcell∧ϕstart∧ϕmove∧ϕaccept\phi=\phi_{cell}\land\phi_{start}\land\phi_{move}\land\phi_{accept}ϕ=ϕcell​∧ϕstart​∧ϕmove​∧ϕaccept​,变量总数会变为O(2dnk)O\left(2^{dn^k}\right)O(2dnk),因为格局表的大小变大了。但是注意到这样设计的布尔公式不存在量词,所以需要设计一个包含量词限制的布尔公式,从而使得ϕ\phiϕ的长度下降。

构造公式ϕc1,c2,t\phi_{c_1,c_2,t}ϕc1​,c2​,t​其表示图灵机M至多用t步从c1c_1c1​走到c2c_2c2​,那么我们现在需要判定的是ϕcstart,caccept,2dnk\phi_{c_{start},c_{accept},2^{dn^k}}ϕcstart​,caccept​,2dnk​。

首先设计ϕc1,c2,≤1\phi_{c_1,c_{2,}\le1}ϕc1​,c2,​≤1​,其包含两种部分,首先是ϕc1,c2,0\phi_{c_1,c_{2,}0}ϕc1​,c2,​0​,这只需要检查所有变量是否包含相同布尔值就可以了。
ϕc1,c2,0=⋀1≤i≤nk+1,s∈c[(c1i,s∧c2i,s)∨(c1i,s‾∧c2i,s‾)]\phi_{c_1,c_{2,}0}=\bigwedge_{1\le i\le n^k+1,s\in c}\left[\left(c_{1i,s}\land c_{2i,s}\right)\vee\left(\overline{c_{1i,s}}\land\overline{c_{2i,s}}\right)\right]ϕc1​,c2,​0​=⋀1≤i≤nk+1,s∈c​[(c1i,s​∧c2i,s​)∨(c1i,s​​∧c2i,s​​)]
对于ϕc1,c2,1\phi_{c_1,c_{2,}1}ϕc1​,c2,​1​,我们需要检查是否是一步迁移,其可以表示为:
ϕc1,c2,1=⋁(p,a,q,b,D)∈δ[ψc1→c2(p,a,q,b,D)]\phi_{c_1,c_{2,}1}=\bigvee_{\left(p,a,q,b,D\right)\in\delta}\left[\psi_{c_1\rightarrow c_2}^{\left(p,a,q,b,D\right)}\right]ϕc1​,c2,​1​=⋁(p,a,q,b,D)∈δ​[ψc1​→c2​(p,a,q,b,D)​]
其中ψc1→c2(p,a,q,b,D)\psi_{c_1\rightarrow c_2}^{\left(p,a,q,b,D\right)}ψc1​→c2​(p,a,q,b,D)​表示这一步是通过迁移δ(p,a)=(q,b,D)\delta\left(p,a\right)=\left(q,b,D\right)δ(p,a)=(q,b,D)得来的,其表达为:
ψc1→c2(p,a,q,b,D)=⋁1≤j≤nkΨc1→c2j,(p,a,q,b,D)\psi_{c_1\rightarrow c_2}^{\left(p,a,q,b,D\right)}=\bigvee_{1\le j\le n^k}\Psi_{c_1\rightarrow c_2}^{j,\left(p,a,q,b,D\right)}ψc1​→c2​(p,a,q,b,D)​=⋁1≤j≤nk​Ψc1​→c2​j,(p,a,q,b,D)​
Ψc1→c2j,(p,a,q,b,R)\Psi_{c_1\rightarrow c_2}^{j,\left(p,a,q,b,R\right)}Ψc1​→c2​j,(p,a,q,b,R)​需要枚举的是当前状态p的位置,枚举得到一个位置后检查带头向右转移是否正确,其它位置是否不变(同理可以导出Ψc1→c2j,(p,a,q,b,L)\Psi_{c_1\rightarrow c_2}^{j,\left(p,a,q,b,L\right)}Ψc1​→c2​j,(p,a,q,b,L)​):
Ψc1→c2j,(p,a,q,b,R)=c1j,p∧c1j+1,a∧c2j,b∧c2j+1,q∧⋀1≤i≤nk+1,i≠j.j+1,s∈c[(c1i,s∧c2i,s)∨(c1i,s‾∧c2i,s‾)]\Psi_{c_1\rightarrow c_2}^{j,\left(p,a,q,b,R\right)}=c_{1j,p}\land c_{1j+1,a}\land c_{2j,b}\land c_{2j+1,q}\land\bigwedge_{1\le i\le n^k+1,i\neq j.j+1,s\in c}\left[\left(c_{1i,s}\land c_{2i,s}\right)\vee\left(\overline{c_{1i,s}}\land\overline{c_{2i,s}}\right)\right]Ψc1​→c2​j,(p,a,q,b,R)​=c1j,p​∧c1j+1,a​∧c2j,b​∧c2j+1,q​∧⋀1≤i≤nk+1,i​=j.j+1,s∈c​[(c1i,s​∧c2i,s​)∨(c1i,s​​∧c2i,s​​)]

那么对于t>1,我们就可以引入量词并进行递归:一个最简单的想法是设计为:
ϕc1,c2,t=∃m[ϕc1,m,t2∨ϕm,c2,t2]\phi_{c_1,c_2,t}=\exists m\left[\phi_{c_1,m,\frac{t}{2}}\vee\phi_{m,c_2,\frac{t}{2}}\right]ϕc1​,c2​,t​=∃m[ϕc1​,m,2t​​∨ϕm,c2​,2t​​]
这种设计下的ϕc1,c2,t\phi_{c_1,c_2,t}ϕc1​,c2​,t​是正确的,它本质是枚举了中间格局,随后进行递归,但是如果计算公式长度会发现这个公式太长了。注意到递归会停止在ϕc1,c2,≤1\phi_{c_1,c_{2,}\le1}ϕc1​,c2,​≤1​,根据上文的设计,得这一层的长度为L=O(n2k)L=O\left(n^{2k}\right)L=O(n2k)。注意到递归每一次分裂得到两个子公式,逻辑上会递归log(2dnk)∼dnklog\left(2^{dn^k}\right)\sim dn^klog(2dnk)∼dnk层,最终会得到2dnk×L2^{dn^k}\times L2dnk×L那么长的公式,这是指数级别的,不可行。
可以再引入存在量词∀¬\forall¬∀¬来解决这个问题:
ϕc1,c2,t=∃m∀(c3,c4)∈{(c1,m),(m,c2)}[ϕc3,c4,t2]\phi_{c_1,c_2,t}=\exists m\forall\left(c_3,c_4\right)\in\{\left(c_1,m\right),\left(m,c_2\right)\}\left[\phi_{c_3,c_4,\frac{t}{2}}\right]ϕc1​,c2​,t​=∃m∀(c3​,c4​)∈{(c1​,m),(m,c2​)}[ϕc3​,c4​,2t​​]
这种书写方式本质是把原本递归产生的两个子公式“折叠”成了一个子公式。通过∀(c3,c4)∈{(c1,m),(m,c2)}\forall\left(c_3,c_4\right)\in\{\left(c_1,m\right),\left(m,c_2\right)\}∀(c3​,c4​)∈{(c1​,m),(m,c2​)},就表明了格局c_3和c_4可以取c_1,m或者m,c_2,从而实现了用一个子公式表达上文两个子公式的效果。此时我们不妨令f(t)为ϕc1,c2,tf\left(t\right)为\phi_{c_1,c_2,t}f(t)为ϕc1​,c2​,t​的长度,可以列出如下的递推式:
f(t)=f(t−1)+O(nk)=f(0)+t×O(nk)=L+t×O(nk)f\left(t\right)=f\left(t-1\right)+O\left(n^k\right)=f\left(0\right)+t\times O\left(n^k\right)=L+t\times O\left(n^k\right)f(t)=f(t−1)+O(nk)=f(0)+t×O(nk)=L+t×O(nk)
从而有
f(dnk)=O(n2k)+dnk×O(nk)=O(n2k)f\left(dn^k\right)=O\left(n^{2k}\right)+dn^k\times O\left(n^k\right)=O\left(n^{2k}\right)f(dnk)=O(n2k)+dnk×O(nk)=O(n2k)
因此可以得到ϕcstart,caccept,2dnk\phi_{c_{start},c_{accept},2^{dn^k}}ϕcstart​,caccept​,2dnk​的长度为O(n2k)O\left(n^{2k}\right)O(n2k)的。
接着我们再设计布尔公式ψstart(c)和ψaccept(c)\psi_{start}\left(c\right)和\psi_{accept}(c)ψstart​(c)和ψaccept​(c)用来判断起始格局和接受格局,最后就能得到我们所需要的全量化布尔公式:
g(ω)=∃c∃d[ψstart(c)∧ψaccept(d)∧ϕc,d,2dnk]g\left(\omega\right)=\exists c\exists d\left[\psi_{start}\left(c\right)\land\psi_{accept}\left(d\right)\land\phi_{c,d,2^{dn^k}}\right]g(ω)=∃c∃d[ψstart​(c)∧ψaccept​(d)∧ϕc,d,2dnk​]
对于ψstart(c)和ψaccept(c)\psi_{start}\left(c\right)和\psi_{accept}(c)ψstart​(c)和ψaccept​(c),它们本质和ϕc1,c2,0\phi_{c_1,c_{2,}0}ϕc1​,c2,​0​一样是检查检查所有变量是否包含相同布尔值,也就是O(nk)O\left(n^k\right)O(nk)的,所以对于函数g:ω→g(ω)g:\omega\rightarrow g\left(\omega\right)g:ω→g(ω)它的复杂度为O(n2k)O\left(n^{2k}\right)O(n2k),因此g是一个从A到TQBF的多项式时间归约。
从而有A≤pTQBFA\le_pTQBFA≤p​TQBF,第一步又证明了TQBF∈PSPACETQBF\in PSPACETQBF∈PSPACE,综上可得TQBF是PSPACE完全的。


PSPACE完全性学习笔记相关推荐

  1. 算法学习 (门徒计划)4-3 专项面试题解析 学习笔记

    算法学习 (门徒计划)4-3 专项面试题解析 学习笔记 前言 LeetCode 1367. 二叉树中的列表 解题思路 示例代码 LeetCode 958. 二叉树的完全性检验 解题思路 示例代码 Le ...

  2. 【学习笔记】【leetcode分门别类整理】【C++】

    文章目录 参考 一.经典手撕 - 分治 1.1 .原地堆排 1.2 .快排 1.3.归并(逆序对).插入 排序 1.4.并查集. 前缀树 1.5.string类实现 1.6.单例模式 - 懒汉.饿汉 ...

  3. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  4. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  6. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  7. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  8. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  9. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

最新文章

  1. linux如何擦除光盘,在Linux操作系统下去掉光盘源的实用技巧
  2. python如何调用文件进行换位加密_数据文件加密算法–换位加密法 | 学步园
  3. Pytorch固定随机性
  4. 手动安装K8s第三节:etcd集群部署
  5. 2018年4月份,阿里最新的java程序员面试题目
  6. xssfsheet removerow 剩下空白行怎么处理_你看不上的农业会计!我却凭借其账务处理,过上你求之不得的生活...
  7. stm32驱动_STM32直流电机启动(一)驱动电路的介绍
  8. linux 程序调试日志,Linux程序调试
  9. 跨域访问被禁止的演示示例
  10. MapXtreme2004鹰眼程序
  11. 戴尔计算机软件的安装,买的新戴尔电脑怎么安装软件
  12. xml文件怎么转换成wps_word文档怎样转换成xml 怎么将XML文档转成WORD文档
  13. 关于target is null for setProperty的问题总结
  14. Recurrent Feature Reasoning for Image Inpainting解读
  15. 可变参C API va_list,va_start,va_arg_va_end以及c++可变参模板
  16. 多线程实现 qq 群聊的服务端和客户端
  17. 蜜蜂问题- 斐波那契数列
  18. su鉴定故障和su拒绝权限
  19. Python定时获取外网IP地址并发送邮件
  20. jpg怎么转换doc

热门文章

  1. angular中forRootforChild的作用
  2. 腾讯云不同账号内网联通
  3. 利用Amber热力学积分计算相对自由能变化
  4. ffmpeg 视频去水印
  5. LED驱动器满足功率、空间和成本挑战
  6. nginx下使用SSI
  7. 通达信20个经典公式_20个欧美时尚达人高领毛衣+大衣造型集锦:冬季最高级的穿搭公式...
  8. 弘辽科技:拼多多商品访客数怎么提高?怎么访客越来越少?
  9. 一个程序员的连续套现
  10. Step Hero NFT奇幻主题游戏