2-SAT问题相关理论和算法

前言

SAT 问题简介

SAT是可满足性、适定性(Satisfiability)问题的简称。一般形式为k-适定性问题或k-可满足性问题,简称 k-SAT。

何为布尔可满足性问题?给定一条真值表达式,包含逻辑变量、逻辑与、逻辑或以及非运算符,如:
( a ∧ ¬ b ∧ ( ¬ ( c ∨ d ∨ ¬ a ) ∨ ( b ∧ ¬ d ) ) ) ∨ ( ¬ ( ¬ ( ¬ b ∨ a ) ∧ c ) ∧ d ) (a\wedge\neg b\wedge(\neg(c\vee d\vee\neg a)\vee(b\wedge\neg d)))\vee(\neg(\neg(\neg b\vee a)\wedge c)\wedge d) (a¬b(¬(cd¬a)(b¬d)))(¬(¬(¬ba)c)d)

是否存在一组对这些变量的赋值,使得整条式子最终的运算结果为 t r u e true true?若可以,那么这个性质被称为这条逻辑公式的可满足性(satisfiability),如何快速高效地判断任意指定逻辑公式的可满足性是理论计算机科学中的一个重要的问题,也是第一个被证明为NP-完全(NP-complete,NPC)的问题。

k > 2 k>2 k>2时,可满足性问题是NPC问题,因此我们一般只研究 k = 2 k=2 k=2的情况。

2-SAT算法

通常所说的2-SAT问题往往需要我们处理对于 n n n个布尔变量 { x n } ( x i ∈ { 0 , 1 } ) \{x_n\}\left(x_i\in\{0,1\}\right) {xn}(xi{0,1}) m m m个限制。
其每个限制都形如一个 ∨ \vee 运算符连接的两个简单限制条件,简单限制条件为 x i = t r u e x_i=true xi=true(记作 x i x_i xi)或 x i = f a l s e x_i=false xi=false(记作 ¬ x i \neg x_i ¬xi),因此限制条件一共有四种:

  • s k = x i ∨ x j s_k=x_i\vee x_j sk=xixj
  • s k = ¬ x i ∨ x j s_k=\neg x_i\vee x_j sk=¬xixj
  • s k = x i ∨ ¬ x j s_k=x_i\vee\neg x_j sk=xi¬xj
  • s k = ¬ x i ∨ ¬ x j s_k=\neg x_i\vee \neg x_j sk=¬xi¬xj

我们需要满足: ⋀ m i = 1 s i = t r u e \underset{i=1}{\overset m{ \bigwedge }}s_i=true i=1msi=true
也就是需要每一个 s k s_k sk都为真。

其处理方法为:
首先建图,对变量 x i x_i xi建立两个点 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1表示选 x i = 0 x_i=0 xi=0 x i = 1 x_i=1 xi=1,然后在新图上对每个限制按照如下方式连边。
例如对于限制 s k s_k sk,我们讨论这条限制下 a , b ∈ { 0 , 1 } a,b\in\{0,1\} a,b{0,1} x i = a x_i=a xi=a时是否一定有 x j = b x_j=b xj=b,如果一定有,就连有向边 x i , a → x j , b x_{i,a}\rightarrow x_{j,b} xi,axj,b
同理我们讨论 x j = a x_j=a xj=a是否一定有 x i = b x_i=b xi=b,如果一定有,就连有向边 x j , a → x i , b x_{j,a}\rightarrow x_{i,b} xj,axi,b

感性理解这张图,如果 x i , a x_{i,a} xi,a可达 x j , b x_{j,b} xj,b,则说明 x i = a x_i=a xi=a可以推出 x j = b x_j=b xj=b,或者说 x i = a x_i=a xi=a蕴含了 x j = b x_j=b xj=b

因此我们知道这个可满足性问题无解的充要条件为,存在 i i i使得 x i , 0 x_{i,0} xi,0 x i , 1 x_{i,1} xi,1处于同一个强连通分量内,这意味着 x i = 0 x_i=0 xi=0推出 x i = 1 x_i=1 xi=1,同时 x i = 1 x_i=1 xi=1推出 x i = 0 x_i=0 xi=0,因此无解。

因此我们可以使用Tarjan算法求强连通分量来判断2-SAT问题是否有解,事实上我们还可以输出一组可行解。
具体方法如下,首先对我们建图的图求强连通分量缩点,得到一张DAG,然后对DAG进行拓扑排序,则 x i x_i xi对应的两个节点中,对应的强连通分量拓扑序较为靠后的节点对应的权值,是 x i x_i xi取得的权值。
其原理是,如果 x i = a x_i=a xi=a会推出 x i = b x_i=b xi=b,那么就不能选 x i = a x_i=a xi=a,此时只能选 x i = b x_i=b xi=b

这样我们就用Tarjan算法取得了可满足性问题的 O ( n + m ) O(n+m) O(n+m)做法。

具体的连边方式

首先,所有限制都可以转化为 x i = a ⇒ x j = b x_i=a\Rightarrow x_j=b xi=axj=b的形式进行连边,这里记录一些经典的连边方式,这样就不需要每次做转化了。

  • x i = a ⇒ x j = b x_i=a\Rightarrow x_j=b xi=axj=b
    • x i , a → x j , b x_{i,a}\rightarrow x_{j,b} xi,axj,b
    • x j , ¬ b → x i , ¬ a x_{j,\neg b}\rightarrow x_{i,\neg a} xj,¬bxi,¬a
  • a ∨ b a\vee b ab
    • a 0 → b 1 a_0\rightarrow b_1 a0b1
    • b 0 → a 1 b_0\rightarrow a_1 b0a1
  • ¬ a ∨ b \neg a\vee b ¬ab
    • a 1 → b 1 a_1\rightarrow b_1 a1b1
    • b 0 → a 0 b_0\rightarrow a_0 b0a0
  • ¬ a ∨ ¬ b \neg a\vee\neg b ¬a¬b
    • a 1 → b 0 a_1\rightarrow b_0 a1b0
    • b 1 → a 0 b_1\rightarrow a_0 b1a0
  • a = t r u e a=true a=true
    • 转化为 a = 0 ⇒ a = 1 a=0\Rightarrow a=1 a=0a=1
    • a 0 → a 1 a_0\rightarrow a_1 a0a1
  • a = f a l s e a=false a=false
    • 转化为 a = 1 ⇒ a = 0 a=1\Rightarrow a=0 a=1a=0
    • a 1 → a 0 a_1\rightarrow a_0 a1a0
  • a = b a=b a=b
    • 转化为 a = 1 ⇒ b = 1 a=1\Rightarrow b=1 a=1b=1,且 a = 0 ⇒ b = 0 a=0\Rightarrow b=0 a=0b=0
  • a ≠ b a\not=b a=b a ⊗ b a\otimes b ab
    • 转化为 a = 0 ⇒ b = 1 a=0\Rightarrow b=1 a=0b=1,且 a = 1 ⇒ b = 0 a=1\Rightarrow b=0 a=1b=0
  • x 1 , x 2 , x 3 , . . . x_1,x_2,x_3,... x1,x2,x3,...至多一个为真
    • 转化为:
      • x 1 = 1 ⇒ x 2 = 0 x_1=1\Rightarrow x_2=0 x1=1x2=0,且 x 1 = 1 ⇒ x 3 = 0 x_1=1\Rightarrow x_3=0 x1=1x3=0,…
      • x 2 = 1 ⇒ x 1 = 0 x_2=1\Rightarrow x_1=0 x2=1x1=0,且 x 2 = 1 ⇒ x 3 = 0 x_2=1\Rightarrow x_3=0 x2=1x3=0,…
      • x 3 = 1 ⇒ x 1 = 0 x_3=1\Rightarrow x_1=0 x3=1x1=0,且 x 3 = 1 ⇒ x 2 = 0 x_3=1\Rightarrow x_2=0 x3=1x2=0,…
    • 注意这样连出来的边数是 O ( m 2 ) O(m^2) O(m2)级别的
  • x 1 , x 2 , x 3 , . . . x_1,x_2,x_3,... x1,x2,x3,...至多 k > 1 k>1 k>1个为真
    • 2-sat一般不能做
  • x 1 , x 2 , x 3 , . . . x_1,x_2,x_3,... x1,x2,x3,...至少 k ≥ 1 k\geq 1 k1个为真
    • 2-sat一般不能做
  • x 1 , x 2 , x 3 , . . . x_1,x_2,x_3,... x1,x2,x3,...恰好 k ≥ 1 k\geq 1 k1个为真
    • 2-sat一般不能做

其中一些限制条件也可以在连边的时候判掉。

2-SAT原理

我们现在有 n n n个布尔变量,称为 { x n } ( x i ∈ { 0 , 1 } ) \{x_n\}\left(x_i\in \{0,1\}\right) {xn}(xi{0,1}),现在给出 m m m条限制,每一条限制都形如:
x i = a x_i=a xi=a时,有 x j = b x_j=b xj=b a , b ∈ { 0 , 1 } a,b\in\{0,1\} a,b{0,1}
即: x i = a ⇒ x j = b x_i=a\Rightarrow x_j=b xi=axj=b

接下来说一下如何求解这个问题。

图的建立

点的意义

我们使用图论方法对这个问题进行求解,按照经典套路,我们需要在图上定义一个集合,然后把原问题的意义在集合内体现出来。

具体来说,我们有一个集合 S S S,同时在图上有 2 n 2n 2n个点,其中每个比尔变量 x i x_i xi对应两个点,一个叫做 x i , 0 x_{i,0} xi,0,另一个叫做 x i , 1 x_{i,1} xi,1
我们规定 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1当中只能恰好有一个属于集合 S S S,如果 x i , 0 ∈ S x_{i,0}\in S xi,0S,则 x i = 0 x_i=0 xi=0;如果 x i , 1 ∈ S x_{i,1}\in S xi,1S,则 x i = 1 x_i=1 xi=1

我们知道根据限制能够推出一些关系,例如如果 x i , a ∈ S x_{i,a}\in S xi,aS,那么一定有 x j , b ∈ S x_{j,b}\in S xj,bS,我们希望用边表示这一种关系,因此我们规定对于任意元素 u ∈ S u\in S uS u u u在图上可达的所有点 v v v均属于 S S S

边的意义

刚才已经定义了图中的点,以及集合 S S S。现在具体说一下图中的边是如何连接的:
对于限制: x i = a ⇒ x j = b x_i=a\Rightarrow x_j=b xi=axj=b

我们考虑一个一个向着集合 S S S内添加元素的过程,我们必然是找到一个点 u u u加入集合,然后将 u u u的所有后继加入 S S S,然后把这些后继的所有后继加入 S S S
由于我们知道 x i = a x_i=a xi=a时, x j = b x_j=b xj=b,因此对于这个限制,我们在图上连边 x i , a → x j , b x_{i,a}\rightarrow x_{j,b} xi,axj,b,这样就似乎可以表示这个限制了。
(注意连边方式到这里还不完全正确)

此时我们会得到一个暴力算法:

  • 枚举一个未被确定的变量 x i x_i xi
  • 先选择 x i , 0 x_{i,0} xi,0,然后检查 x i , 0 x_{i,0} xi,0可达的所有点,我们将会选中他们。
    • 如果发生冲突(即存在 x j , 0 , x j , 1 ∈ S x_{j,0},x_{j,1}\in S xj,0,xj,1S),那么就说明 x i ≠ 0 x_i\not=0 xi=0,回溯。
  • 如果 x i , 0 x_{i,0} xi,0不能选,那么就选择 x i , 1 x_{i,1} xi,1,然后检查 x i , 1 x_{i,1} xi,1的可达点,检查是否有冲突,如果没有就选上它们,否则就说明无解。

但是我们会发现这个算法是会错的,举例来说,对于以下两个限制:

  • y = 0 ⇒ x = 1 y=0\Rightarrow x=1 y=0x=1
  • y = 1 ⇒ x = 1 y=1\Rightarrow x=1 y=1x=1

我们会连出这张图:
在这里插入图片描述
但是如果我们一开始选择 x 0 x_0 x0,后来就会发现无论选择 y 0 y_0 y0还是 y 1 y_1 y1都会有矛盾,此时就输出无解,显然是不对的。

这样会出错是因为,对于这样的一条限制 y = 0 ⇒ x = 1 y=0\Rightarrow x=1 y=0x=1来说,选择 x x x的值是会对 y y y的值产生影响的,具体来说,如果 x = 0 x=0 x=0,这就说明 y ≠ 0 y\not=0 y=0,即 y = 1 y=1 y=1

换句话说,命题 y = 0 ⇒ x = 1 y=0\Rightarrow x=1 y=0x=1的逆否命题 x ≠ 1 ⇒ y ≠ 0 x\not=1\Rightarrow y\not =0 x=1y=0,即 x = 0 ⇒ y = 1 x=0\Rightarrow y=1 x=0y=1,具有和原命题一致的真假性,因此选择 x x x的值可能会对 y y y造成影响,因此我们需要进一步讨论 x = a ⇒ y = b x=a\Rightarrow y=b x=ay=b说明了 x , y x,y x,y之间的那些关系:

  • 当我们选择了 x a x_a xa时,必然有 y b y_b yb
  • 当我们选择了 x ¬ a x_{\neg a} x¬a时,这条限制不提供任何约束,即有可能选择 y b y_b yb y ¬ b y_{\neg b} y¬b
  • 当我们选择了 y b y_b yb时,这条限制不提供任何约束,即有可能选择 x a x_a xa x ¬ a x_{\neg a} x¬a
  • 当我们选择了 y ¬ b y_{\neg b} y¬b时,必然有 x ¬ a x_{\neg a} x¬a

因此事实上对于限制 x i = a ⇒ x j = b x_i=a\Rightarrow x_{j}=b xi=axj=b来说,我们应该连接两条边:

  • x i , a → x j , b x_{i,a}\rightarrow x_{j,b} xi,axj,b
  • x j , ¬ b → x i , ¬ a x_{j,\neg b}\rightarrow x_{i,\neg a} xj,¬bxi,¬a

此时我们再进行刚才的暴力算法,我们就获得了时间复杂度为 O ( n ⋅ m ) O(n\cdot m) O(nm)的2-sat问题的dfs做法。值得一提的是,这种做法还能同时让我们获得2-sat问题字典序最小的解。

接下来简要对暴力做法的正确性进行说明:

首先我们证明解的充分性,即我们求出的解确实是原问题的一组解:
首先我们知道,对于一个限制 x i = a ⇒ x j = b x_{i}=a\Rightarrow x_{j}=b xi=axj=b,这个限制被违反当且仅当 x i , a , x j , ¬ b ∈ S x_{i,a},x_{j,\neg b}\in S xi,a,xj,¬bS

如果说在算法过程中 x i , a x_{i,a} xi,a x j , ¬ b x_{j,\neg b} xj,¬b先选的话,发生这种情况一定不可能,因为我们选择 x i , a x_{i,a} xi,a时根据连边,一定选择了 x j , b x_{j,b} xj,b,因此后来无法选择 x j , ¬ b x_{j,\neg b} xj,¬b了,矛盾。
如果 x i , a x_{i,a} xi,a x j , ¬ b x_{j,\neg b} xj,¬b后选的话,这种情况还是不可能,因为根据连边的方式,如果我们选择了 x j , ¬ b x_{j,\neg b} xj,¬b,我们一定选择了 x i , ¬ a x_{i,\neg a} xi,¬a,不可能再选择 x i , a x_{i,a} xi,a,因此仍然矛盾。

因此我们就证明,我们构造出的一组解满足所有限制条件,因此是一组合法解。

接下来我们证明解的必要性,即有解的时候,我们一定能够构造出一组解。
只需证明逆否命题,即如果我们构造不出一组解,此时这个问题无解。
我们考虑求解过程在决定变量 x i x_i xi的取值时报告了无解。
此时必然是因为发生了矛盾,首先讨论选取 x i , 0 x_{i,0} xi,0时候的情况,矛盾即存在元素 x j , 0 , x j , 1 ∈ S x_{j,0},x_{j,1}\in S xj,0,xj,1S
此时有两种情况,第一种情况是 x j , 0 , x j , 1 x_{j,0},x_{j,1} xj,0,xj,1都是在 x i , 0 x_{i,0} xi,0加入集合 S S S后加入集合的,此时显然选择 x i , 0 x_{i,0} xi,0会同时推出 x j = 0 x_j=0 xj=0 x j = 1 x_j=1 xj=1,因此 x i ≠ 0 x_i\not=0 xi=0

第二种情况是, x j , a x_{j,a} xj,a是在 x i , 0 x_{i,0} xi,0加入集合 S S S前加入集合的,而 x j , ¬ a x_{j,\neg a} xj,¬a是因为加入 x i , 0 x_{i,0} xi,0而加入集合 S S S的(换句话说存在路径使得 x i , 0 ⇝ x j , ¬ a x_{i,0}\rightsquigarrow x_{j,\neg a} xi,0xj,¬a),这种情况不存在,这是因为,如果存在路径使得 x i , 0 ⇝ x j , ¬ a x_{i,0}\rightsquigarrow x_{j,\neg a} xi,0xj,¬a,由于接下来说到的性质2,我们必然知道存在一条路径使得 x j , a ⇝ x i , 1 x_{j,a}\rightsquigarrow x_{i,1} xj,axi,1,因此当 x j , a ∈ S x_{j,a}\in S xj,aS后, x i , 1 ∈ S x_{i,1}\in S xi,1S,这与 x i x_i xi取值未确定矛盾,因此第二种情况不存在。

不可能存在一种情况使得 x j , 0 , x j , 1 x_{j,0},x_{j,1} xj,0,xj,1在加入 x i , 0 x_{i,0} xi,0前都在集合 S S S内,因为这违反 S S S的定义。

同理我们知道,如果在选择 x i , 1 x_{i,1} xi,1的时候发生矛盾,只可能是因为 x i ≠ 1 x_i\not=1 xi=1。此时我们就得知了 x i ≠ 0 x_i\not=0 xi=0 x i ≠ 1 x_i\not=1 xi=1,因此得到这个可满足性问题无解。

QED.

线性算法

接下来我们说一下这个问题的线性算法,线性算法是这样的:

  • 对建出来的图缩强连通分量
  • 这样会得到一张DAG
  • 如果存在点 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1在一个强连通分量内,则说明无解。
  • 否则有解,对DAG拓扑排序, x i x_i xi的取值是它对应的两个点 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1对应的强连通分量中拓扑序较靠后的那个点的取值。

证明

接下来我们证明一下线性算法的正确性。

性质1

边的对称性:
对于任意一条有向边, ( x i , a , x j , b ) (x_{i,a},x_{j,b}) (xi,a,xj,b),都存在有向边 ( x j , ¬ b , x i , ¬ a ) (x_{j,\neg b},x_{i,\neg a}) (xj,¬b,xi,¬a),我们称为其对称边。

证明:
回忆建图的方式,这条性质是显然成立的。

性质2

路径的对称性:
对于任意一条从 x i , a x_{i,a} xi,a x j , b x_{j,b} xj,b的路径,必然存在对应的一条路径从 x j , ¬ b x_{j,\neg b} xj,¬b x i , ¬ a x_{i,\neg a} xi,¬a

证明:
我们找到从 x i , a x_{i,a} xi,a x j , b x_{j,b} xj,b的路径上的每一条边的对称边,显然它们拼成一条从 x j ¬ b x_{j\neg b} xj¬b x i , ¬ a x_{i,\neg a} xi,¬a的路径。

算法1

我们可以据此提出一个求解2-sat问题的算法:

  • 对建出来的图缩强连通分量
  • 这样会得到一张DAG
  • 如果存在点 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1在一个强连通分量内,则说明无解。
  • 否则有解,我们通过如下过程构造解:
    • 找到一个没有确定的 x i x_i xi
    • 由于 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1不强连通,因此不可能存在二者相互可达。
    • 如果有 x i , 0 ⇝ x i , 1 x_{i,0}\rightsquigarrow x_{i,1} xi,0xi,1,那就令 x i , 1 ∈ S x_{i,1}\in S xi,1S。否则说明一定有 x i , 1 ⇝ x i , 0 x_{i,1}\rightsquigarrow x_{i,0} xi,1xi,0,或者 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1互相不可达,此时令 x i , 0 ∈ S x_{i,0}\in S xi,0S
    • 如果此时我们有 x i , a ∈ S x_{i,a}\in S xi,aS,那就说明有 x i , ¬ a ∉ S x_{i,\neg a}\notin S xi,¬a/S。同时说明 x i , a x_{i,a} xi,a的所有后继都属于 S S S,把它们加入 S S S
    • 同时说明 x i , ¬ a x_{i,\neg a} xi,¬a的所有前驱都不属于 S S S
    • 直到所有的变量取值都确定,此时我们得到了一组可行解。

定理1

缩点后得到的DAG,满足没有任何一个 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1强连通,是原问题有解的必要条件。

证明其逆否命题:
如果存在 x i , 0 , x i , 1 x_{i,0},x_{i,1} xi,0,xi,1强连通,那么我们沿着 x i , 0 ⇝ x i , 1 ⇝ x i , 0 x_{i,0}\rightsquigarrow x_{i,1}\rightsquigarrow x_{i,0} xi,0xi,1xi,0的回路走,上面的边对应的限制条件就说明,当 x i = 0 x_{i}=0 xi=0 x i = 1 x_i=1 xi=1,并且当 x i = 1 x_i=1 xi=1 x i = 0 x_i=0 xi=0,此时显然无解。

QED.

定理2

按照上述算法1流程构造出的解,是原问题的一组解。

证明:
如果这组解不是原问题的一组解,那么一定存在至少一个限制被违背了,设这个限制是 x i = a ⇒ x j = b x_i=a\Rightarrow x_j=b xi=axj=b,这个限制被违反必须有 x i = a x_i=a xi=a x j = ¬ b x_j=\neg b xj=¬b

假如说 x i , a x_{i,a} xi,a x j , ¬ b x_{j,\neg b} xj,¬b后晚加入集合,当我们加入 x j , ¬ b x_{j,\neg b} xj,¬b时,由于这条限制对应连出的边, x i , ¬ a x_{i,\neg a} xi,¬a一定也会被加入集合,因此 x i , a x_{i,a} xi,a不可能加入集合,矛盾。

否则说明 x i , a x_{i,a} xi,a x j , ¬ b x_{j,\neg b} xj,¬b先加入集合,但是这也不可能,因为当我们加入 x i , a x_{i,a} xi,a时,由于这条限制对应连出的边, x j , b x_{j,b} xj,b也一定加入集合,因此 x j , b x_{j,b} xj,b不可能加入集合,矛盾。

QED.

定理3

根据定理1,定理2,我们证明了:
算法1能够求出一组解,是原问题有解的充要条件。它求出的解,是原问题的一组解。

定理4

容易发现Tarjan算法+拓扑排序求解2-sat问题的过程事实上在模拟算法1,因此其的正确性也有保证。

后记

于是皆大欢喜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BioTech - 量子化学与分子力场

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/135787607 量子化学是应用量子力学的规律和方法来研究化学问题的一门学科,主要关注分子的结构、性质和反应过程。 量子化学的理论方法…

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码) Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码,但在远程连接时并没有输入密…

定向减免!函数计算让 ETL 数据加工更简单

业内较为常见的高频短时 ETL 数据加工场景,即频率高时延短,一般费用大头均在函数调用次数上,推荐方案一般为攒批处理,高额的计算成本往往令用户感到头疼,函数计算推出定向减免方案,让 ETL数据加工更简单、更…

浅谈手机APP测试(流程)

前言 APP测试是一个广泛的概念,根据每个app的应用场景不一样,测试的方向也略微的不同,在测试过程中需要灵活应用自身所知的测试手段。 今天就跟大家简单聊聊手机APP测试的一些相关内容。 APP开发流程 (1) 拿到需求分…

2024年,IT行业下一个就业风口在哪?

搜狐:我宣布与华为达成鸿蒙全面合作! 美团:我宣布与华为达成鸿蒙全面合作! 360 :我宣布与华为达成鸿蒙全面合作! 高德:我宣布与华为达成鸿蒙全面合作! 新浪:我宣布与华为…

一站式解决钉钉开票与金蝶云星辰对接问题,让企业管理更轻松!

客户介绍 某企业服务有限公司专注于为企业提供全方位、高质量的企业服务,致力于于企业管理咨询、企业形象策划、市场营销策划、财务管理咨询等方面。该公司拥有一支经验丰富、专业化的团队,他们深入了解企业需求,为客户提供个性化的解决方案…

MoEs学习

和多任务学习的mmoe很像哦(有空再学习一下)moe layer的起源:Switch Transformers paper MoE moe由两个结构组成: Moe Layer :这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如…

如何使用阿里云CDN服务?

如何使用阿里云CDN服务 一、开通阿里云CDN服务 注册自己阿里云账号,找到CDN服务,进行加速即可 二、配置域名信息 1、各配置参数的含义 添加加速域名: 如果需要使用CDN加速指定网站上的业务,则需要将该网站作为源站&#xff0…

“豚门”、“吗喽”,为啥品牌宣传瞄上网红动物?

近期,新茶饮品牌喜茶联名红山动物园,凭借可爱周边拿捏无数消费者,再往前一段时间,还有奈雪联名“吗喽”表情包,为什么品牌宣传会瞄上网红动物,今天媒介盒子就来和大家聊聊。 一、 萌元素引起用户情绪共鸣 …

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

如何系统学习机器学习?

要系统学习机器学习,首先需要掌握一些基础编程技能,如Python。其次,学习基础的数学概念,如线性代数、概率论和统计学。然后,选择一些优质的在线课程和教材进行深入学习。最后,通过实践项目来巩固所学知识。…

html火焰文字特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…

2024.1.23 GNSS 零散知识 学习笔记

1.天线种类 2.接收机 2.四大导航系统的介绍 3.卫星高度与轨道卫星种类 4.GNSS有哪些应用 5.在空间保持静⽌或匀速直线运动(⽆加速度)的坐标系称为惯性坐标系。 6.地⼼惯性坐标系实际上并没有满⾜能成为惯性坐标系的条件&#xff1a; ⾸先&#xff0c;地球及其质⼼都在围绕太阳…

[计算机提升] 切换(域)用户

4.14 切换(域)用户 4.14.1 为什么要切换用户 在Windows系统中&#xff0c;切换用户的主要目的是为了实现多用户共享同一台计算机的便利和安全。当多个人需要使用同一台计算机时&#xff0c;每个人可以登录自己的用户账户&#xff0c;这样可以避免互相干扰和混淆数据。 以下是…

《深入解析Java虚拟机:从JVM体系结构到垃圾回收算法》

文章目录 JVM体系结构JVM的组成 类加载器Class Loader类加载器的作用双亲委派机制JVM自带三个类加载器Bootstrap ClassLoader-根加载器ExtClassLoader-扩展加载器AppClassLoader-应用类加载器 Java历史-沙箱安全机制沙箱概念沙箱的作用本地代码和远程代码沙箱安全机制模型JDK1 …

C语言快速排序(非递归)图文详解

前言&#xff1a; 上一期分析了快速排序的三种写法&#xff0c;这三种写法有一个相同点&#xff0c;都是采用递归形式来实现的&#xff0c;那么有没有非递归的方法实现呢&#xff1f;答案是当然有&#xff0c;用非递归的方法实现快速排序&#xff0c;其实可以借助数据结构中的栈…

【LangChain学习之旅】—(10) 用RouterChain确定客户意图

【【LangChain学习之旅】—&#xff08;10&#xff09; 用RouterChain确定客户意图 任务设定整体框架具体步骤如下&#xff1a; 具体实现构建提示信息的模板构建目标链 Reference&#xff1a;LangChain 实战课 任务设定 首先&#xff0c;还是先看一下今天要完成一个什么样的任…

《鸟哥的Linux私房菜》第1章——总结与简答题回答

目录 一、什么是Linux&#xff0c;有什么作用&#xff1f; 二、Linux发展史 三、Linux发行版 四、简答题部分 一、什么是Linux&#xff0c;有什么作用&#xff1f; Linux包括内核和系统调用两部分&#xff0c;是位于硬件设备与应用程序中间的操作系统。 操作系统其实也是…

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

python爬虫代码示例:爬取京东详情页图片

python爬虫代码示例:爬取京东详情页图片 一、Requests安装及示例 爬虫爬取网页内容首先要获取网页的内容&#xff0c;通过requests库进行获取。 GitHub: https://github.com/requests/requests PyPl: https://pypi.python.org/pypi/requests 官方文档:http://wwwpython-requ…