文心一言 VS 讯飞星火 VS chatgpt (292)-- 算法导论21.3 5题

五、证明:任何具有 m 个 MAKE-SET、UNION 和 FIND-SET 操作的序列,这里所有的 LINK 操作都出现在 FIND-SET 操作之前,如果同时使用路径压缩和按秩合并启发式策略,则这些操作只需 O(m) 的时间。在同样情况下,如果只使用路径压缩启发式策略,又会如何?如果要写代码,请用go语言。

文心一言:

同时使用路径压缩和按秩合并

证明

使用路径压缩和按秩合并策略时,我们可以确保:

  1. MAKE-SET 操作:初始化一个新的集合,时间复杂度为 O(1)。
  2. FIND-SET 操作:在路径压缩后,查找元素所属的集合(即根节点)可以在常数时间内完成,时间复杂度为 O(1)(因为路径上的所有节点都直接指向了根节点)。
  3. UNION 操作:使用按秩合并策略,我们总是将秩(高度)较小的树合并到秩较大的树上。合并后,如果两棵树秩相同,我们任选一棵树的秩加1。这保证了合并后的树的高度增长是缓慢的。由于FIND-SET操作之前已经完成了所有的UNION操作,因此这些UNION操作已经合并了所有必要的集合,且每个集合的树高度都是最优的。因此,每个UNION操作的时间复杂度也是 O(α(n)),其中 α 是Ackermann函数的反函数,对于实际应用来说可以视为一个非常小的常数。

由于每个操作都是 O(1) 或 O(α(n)),且 α(n) 可以视为常数,因此 m 个操作的总时间复杂度为 O(m)。

只使用路径压缩

分析

只使用路径压缩时,FIND-SET 操作的时间复杂度仍然是 O(1)。然而,UNION 操作的时间复杂度可能会增加,因为没有按秩合并来限制树的高度增长。在最坏情况下,每次UNION操作都可能导致树的高度翻倍,但这并不意味着总的时间复杂度会增加到非O(m)。因为尽管单个UNION操作可能较慢,但由于所有UNION操作都在FIND-SET操作之前完成,这些UNION操作可以看作是一次性的预处理步骤。因此,即使单次UNION操作可能不是常数时间,但整个序列的时间复杂度仍然是 O(m)。

但是,需要注意的是,在实际应用中,没有按秩合并可能会导致某些FIND-SET操作(尽管是常数时间复杂度)因为需要遍历较长的路径而变慢。

Go语言代码示例(简化版)

下面是一个简化的Go语言并查集实现,包含了MAKE-SET、FIND-SET和UNION操作,并使用了路径压缩和按秩合并策略:

package mainimport ("fmt"
)type UnionFind struct {parent []int // 存储每个元素的父节点,初始时为自己rank   []int // 存储每个元素(作为根时)的秩(树的高度)
}func NewUnionFind(n int) *UnionFind {uf := &UnionFind{parent: make([]int, n),rank:   make([]int, n),}for i := 0; i < n; i++ {uf.parent[i] = iuf.rank[i] = 0}return uf
}// 查找元素x所属的集合(根节点)并进行路径压缩
func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路径压缩}return uf.parent[x]
}// 合并两个集合(包含元素x和y的集合)
func (uf *UnionFind) Union(x, y int) {rootX, rootY := uf.Find(x), uf.Find(y)if rootX == rootY {return}if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else {uf.parent[rootY] = rootXuf.rank[rootX]++ // 秩相同,任选一棵树的秩加1}
}func main() {// 示例使用uf := NewUnionFind(10)uf.Union(1, 2)uf.Union(3, 4)fmt.Println(uf.Find(1), "==", uf.Find(2)) // 应该输出相同的根节点fmt.Println(uf.Find(3), "==", uf.Find(4)) // 应该输出相同的根节点// ... 其他操作 ...
}

注意:这个代码示例没有包含完整的错误处理(比如检查索引是否越界

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

首先,我们来证明同时使用路径压缩和按秩合并启发式策略的情况。

假设我们有 m 个 MAKE-SET、UNION 和 FIND-SET 操作,并且所有的 LINK 操作都出现在 FIND-SET 操作之前。在这种情况下,我们可以使用并查集数据结构来实现这些操作。并查集是一种用于处理不相交集合的数据结构,它支持两种主要操作:MAKE-SET(创建一个新的集合)和 UNION(将两个集合合并为一个集合)。此外,我们还可以使用 FIND-SET 操作来查找一个元素所属的集合。

为了实现路径压缩和按秩合并启发式策略,我们需要在每个节点上存储两个额外的信息:它的父节点和它的秩。父节点用于表示当前节点在并查集中的位置,而秩则表示当前节点所在树的高度。当我们执行 FIND-SET 操作时,我们会沿着从当前节点到根节点的路径进行压缩,即将沿途的所有节点的父节点直接设置为根节点。这样,下次再执行 FIND-SET 操作时,我们就可以更快地找到根节点。

同时,在执行 UNION 操作时,我们将根据两个集合的秩来决定如何合并它们。具体来说,我们将把秩较小的树连接到秩较大的树上,并将较小树的根节点的父节点设置为较大树的根节点。这样可以确保合并后的树的高度尽可能小,从而使得后续的 FIND-SET 操作更加高效。

下面是一个简单的 Go 语言实现:

package mainimport "fmt"type DisjointSet struct {parent []intrank   []int
}func NewDisjointSet(n int) *DisjointSet {djs := &DisjointSet{parent: make([]int, n),rank:   make([]int, n),}for i := range djs.parent {djs.parent[i] = idjs.rank[i] = 0}return djs
}func (djs *DisjointSet) MakeSet(x int) {djs.parent[x] = xdjs.rank[x] = 0
}func (djs *DisjointSet) Find(x int) int {if djs.parent[x] != x {djs.parent[x] = djs.Find(djs.parent[x])}return djs.parent[x]
}func (djs *DisjointSet) Union(x, y int) {rootX := djs.Find(x)rootY := djs.Find(y)if rootX == rootY {return}if djs.rank[rootX] < djs.rank[rootY] {djs.parent[rootX] = rootY} else if djs.rank[rootX] > djs.rank[rootY] {djs.parent[rootY] = rootX} else {djs.parent[rootY] = rootXdjs.rank[rootX]++}
}func main() {djs := NewDisjointSet(10)djs.MakeSet(0)djs.MakeSet(1)djs.MakeSet(2)djs.MakeSet(3)djs.MakeSet(4)djs.MakeSet(5)djs.MakeSet(6)djs.MakeSet(7)djs.MakeSet(8)djs.MakeSet(9)djs.Union(0, 1)djs.Union(2, 3)djs.Union(4, 5)djs.Union(6, 7)djs.Union(8, 9)fmt.Println("Parents:", djs.parent)fmt.Println("Ranks:", djs.rank)
}

在这个实现中,我们首先创建了一个 DisjointSet 结构体,其中包含两个切片:parentrankparent 切片用于存储每个元素的父节点,而 rank 切片用于存储每个元素的秩。我们还实现了 NewDisjointSetMakeSetFindUnion 方法,分别用于初始化并查集、创建新的集合、查找元素的根节点以及合并两个集合。

Find 方法中,我们使用了路径压缩技巧,即在查找过程中将当前节点的父节点直接设置为根节点。这样,下次再查找同一个节点时,我们就可以更快地找到根节点。在 Union 方法中,我们根据两个集合的秩来决定如何合并它们,以确保合并后的树的高度尽可能小。

最后,我们在 main 函数中创建了一个具有 10 个元素的并查集,并对其中的元素进行了一些操作。运行这段代码,我们可以看到每个元素的父节点和秩的值。这表明我们的实现是正确的,并且可以在 O(m) 的时间内完成 m 个 MAKE-SET、UNION 和 FIND-SET 操作。

360智脑:

为了证明在使用路径压缩和按秩合并启发式策略时,任何具有 m 个 MAKE-SET、UNION 和 FIND-SET 操作的序列的总运行时间为 O(m),我们可以采用 amortized analysis(分摊分析)的方法。具体来说,我们将使用一种称为 “会计方法” 的分析技巧。

使用路径压缩和按秩合并

  1. 定义潜在函数

    • 让 ( rank(x) ) 表示节点 x 的秩。
    • 定义潜在函数 ( \Phi ) 为所有树中所有节点的秩的总和。
  2. 分析操作的成本

    • MAKE-SET(x):创建一个新集合,其成本为 1(因为要分配一个新的树)。
    • UNION(x, y):将两个树合并,假设合并后树的秩增加了,成本为 1(因为可能需要更新指向父节点的指针)。
    • FIND-SET(x):查找集合代表,成本为 ( rank(x) )(因为在最坏情况下,可能需要遍历整条路径)。
  3. 计算总成本

    • 每次 MAKE-SET 和 UNION 操作的实际成本为 1,但它们对潜在函数的影响最多增加 1(因为秩最多增加 1)。
    • 每次 FIND-SET 操作的实际成本为 ( rank(x) ),但由于路径压缩,之后的 FIND-SET 操作将会更快。具体来说,每次 FIND-SET 操作会使路径上的每个节点的秩至少增加 1,因此潜在函数至少增加 ( rank(x) )。
  4. 分摊成本

    • 我们可以将每次 FIND-SET 操作的实际成本分摊到其路径上的每个节点,每个节点分摊的成本为 1。这样,每次 FIND-SET 操作的分摊成本为 ( rank(x) ),与实际成本相同。
    • 因此,总分摊成本为所有操作的分摊成本之和,这等于所有节点的秩的总和,即潜在函数 ( \Phi )。
  5. 结论

    • 由于每个操作的分摊成本不超过其实际成本,且潜在函数 ( \Phi ) 的增长,速度不超过操作的数量 m,总分摊成本为 O(m)。
    • 因此,总实际成本也为 O(m)。

只使用路径压缩

当只使用路径压缩而不使用按秩合并时,情况稍微复杂一些,但我们仍然可以使用类似的分析方法。

  1. 定义潜在函数

    • 让 ( depth(x) ) 表示节点 x 到根的路径长度。
    • 定义潜在函数 ( \Phi ) 为所有树中所有节点的深度的总和。
  2. 分析操作的成本

    • MAKE-SET(x):创建一个新集合,其成本为 1。
    • UNION(x, y):将两个树合并,成本为 1(因为可能需要更新指向父节点的指针)。
    • FIND-SET(x):查找集合代表,成本为 ( depth(x) )。
  3. 计算总成本

    • 每次 MAKE-SET 和 UNION 操作的实际成本为 1,但它们对潜在函数的影响最多增加 1。
    • 每次 FIND-SET 操作的实际成本为 ( depth(x) ),但由于路径压缩,之后的 FIND-SET 操作将会更快。具体来说,每次 FIND-SET 操作会使路径上的每个节点的深度至少增加 1,因此潜在函数至少增加 ( depth(x) )。
  4. 分摊成本

    • 我们可以将每次 FIND-SET 操作的实际成本分摊到其路径上的每个节点,每个节点分摊的成本为 1。这样,每次 FIND-SET 操作的分摊成本为 ( depth(x) ),与实际成本相同。
    • 因此,总分摊成本为所有操作的分摊成本之和,这等于所有节点的深度的总和,即潜在函数 ( \Phi )。
  5. 结论

    • 由于每个操作的分摊成本不超过其实际成本,且潜在函数 ( \Phi ) 的增长,速度不超过操作的数量 m,总分摊成本为 O(m)。
    • 因此,总实际成本也为 O(m)。

综上所述,无论是否使用按秩合并启发式策略,只要使用路径

智谱清言:

首先,我们需要明确一点,题目中的时间复杂度O(m)是指每种操作的平均时间复杂度为O(1),即每个操作的时间复杂度与操作的数量成线性关系。这意味着无论操作的具体数量如何变化,每个操作的平均时间都保持在一个常数范围内。

接下来,我们来详细解释路径压缩和按秩合并对并查集操作的影响。

  1. 路径压缩:当执行FIND-SET操作时,路径压缩会将查找路径上的所有节点直接连接到根节点上。这意味着无论查找路径有多长,执行FIND-SET操作的时间复杂度都将被降低到O(1)。
  2. 按秩合并:当执行UNION操作时,按秩合并会优先将较小的树的根节点连接到较大树的根节点上,并且如果两棵树的秩相同,则选择其中一棵树作为根,另一棵树的根节点连接到它上面。这样可以避免树的高度增长过快,从而保持操作的时间复杂度低。
    现在,我们来看看代码实现。由于题目要求使用Go语言,我们可以实现一个简单的并查集结构体,并实现MAKE-SET、UNION、FIND-SET和LINK操作。这里我们只实现路径压缩和按秩合并的启发式策略。
package main
import ("fmt"
)
type UnionFind struct {parent map[int]intrank   map[int]int
}
func NewUnionFind(n int) *UnionFind {uf := &UnionFind{parent: make(map[int]int),rank:   make(map[int]int),}for i := 0; i < n; i++ {uf.parent[i] = iuf.rank[i] = 0}return uf
}
func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路径压缩}return uf.parent[x]
}
func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX != rootY {if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}}
}
func main() {m := 10 // 操作的数量uf := NewUnionFind(m)// 假设我们有m个MAKE-SET操作for i := 0; i < m; i++ {uf.MakeSet(i)}// 假设我们有m个UNION操作for i := 0; i < m; i++ {uf.Union(i, i+1)}// 假设我们有m个FIND-SET操作for i := 0; i < m; i++ {uf.Find(i)}// 假设我们有m个LINK操作,这里我们不实际执行LINK操作,因为题目中要求LINK操作出现在FIND-SET操作之前// for i := 0; i < m; i++ {// 	uf.Link(i, i+1)// }// 输出结果,验证是否所有的集合都被正确合并for i := 0; i < m; i++ {fmt.Println("Find(", i, ") =", uf.Find(i))}
}

在这个代码中,我们实现了并查集的基本操作,并使用了路径压缩和按秩合并的启发式策略。注意,LINK操作在这个实现中没有实际执行,因为我们只关心MAKE-SET、UNION和FIND-SET操作的时间复杂度。

如果只使用路径压缩启发式策略,而不使用按秩合并

天工:

为了证明这个问题,我们需要分析并查集操作在使用路径压缩和按秩合并启发式策略时的性能。我们将首先解释这两种启发式策略是如何工作的,然后提供一个Go语言的代码示例来说明这些操作。

路径压缩和按秩合并的工作原理

  • 路径压缩:在执行 FIND-SET 操作时,我们不仅返回代表元素,还将路径上的所有节点直接连接到根节点,从而减少后续 FIND-SET 操作的时间。
  • 按秩合并:在进行 UNION 操作时,我们总是将秩较小的树连接到秩较大的树上,以此保持树的高度尽可能小。

证明使用两种启发式策略的情况

假设有一个包含 m m m 个操作的序列,其中所有的 LINK 操作都在 FIND-SET 操作之前。如果我们同时使用路径压缩和按秩合并,那么每个操作的平均时间复杂度可以认为是常数级的。这是因为路径压缩减少了树的高度,使得 FIND-SET 操作更快;而按秩合并保证了树的高度不会因为 UNION 操作而增加太多。因此,整个序列的操作可以在 O ( m ) O(m) O(m) 的时间内完成。

仅使用路径压缩的情况

如果只使用路径压缩而不使用按秩合并,虽然路径压缩本身可以减少树的高度,但是没有按秩合并的限制,树的高度可能会增加。尽管如此,路径压缩的累积效应仍然可以显著减少树的高度,因此整个序列的操作时间复杂度仍然是亚线性的。实际上,Tarjan 和 Van Leeuwen 在他们的论文中证明了即使在只有路径压缩的情况下,并查集操作的摊还时间复杂度也是 O ( m α ( n ) ) O(m \alpha(n)) O(mα(n)),其中 α ( n ) \alpha(n) α(n) 是阿克曼函数的反函数,它增长了少数级别,因此在实际应用中可以认为是常数。

Go语言代码示例

下面是一个使用路径压缩和按秩合并的并查集的Go语言代码示例:

type UnionFind struct {parent []intrank   []int
}func NewUnionFind(n int) *UnionFind {uf := &UnionFind{parent: make([]int, n),rank:   make([]int, n),}for i := 0; i < n; i++ {uf.parent[i] = iuf.rank[i] = 0}return uf
}func (uf *UnionFind) FindSet(x int) int {if x != uf.parent[x] {uf.parent[x] = uf.FindSet(uf.parent[x]) // 路径压缩}return uf.parent[x]
}func (uf *UnionFind) UnionSet(x, y int) {xRoot := uf.FindSet(x)yRoot := uf.FindSet(y)if xRoot == yRoot {return}if uf.rank[xRoot] < uf.rank[yRoot] {uf.parent[xRoot] = yRoot} else if uf.rank[xRoot] > uf.rank[yRoot] {uf.parent[yRoot] = xRoot} else {uf.parent[yRoot] = xRootuf.rank[xRoot]++}
}

在这个代码示例中,我们定义了一个 UnionFind 结构体,它包含了 parent 数组和 rank 数组。FindSet 方法实现了路径压缩,而 UnionSet 方法实现了按秩合并。这个代码展示了如何在Go语言中实现并查集,并应用了路径压缩和按秩合并的启发式策略。

需要注意的是,虽然理论上的时间复杂度是 O ( m ) O(m) O(m) O ( m α ( n ) ) O(m \alpha(n)) O(mα(n)),但在实际编码中,我们通常不会显式计算这个复杂度,而是通过测试和分析来确保算法的效率。

chatgpt:

以下是使用Go语言实现的并查集代码,其中同时使用路径压缩和按秩合并启发式策略:

package mainimport "fmt"type UnionFind struct {parent []intrank   []int
}func NewUnionFind(n int) *UnionFind {uf := &UnionFind{parent: make([]int, n),rank:   make([]int, n),}for i := range uf.parent {uf.parent[i] = i}return uf
}func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x])}return uf.parent[x]
}func (uf *UnionFind) Union(x, y int) {rootX, rootY := uf.Find(x), uf.Find(y)if rootX == rootY {return}if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}
}func main() {n := 10 // 假设有10个元素makesetOps := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} // MAKE-SET操作序列,每个元素作为一个集合的代表unionOps := [][]int{{0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9}, // UNION操作序列{0, 2}, {4, 6}, {8, 0}, {3, 5},         // UNION操作序列}uf := NewUnionFind(n)for _, op := range makesetOps {uf.Find(op) // 路径压缩}for _, op := range unionOps {x, y := op[0], op[1]uf.Union(x, y)}fmt.Println(uf.parent) // 输出并查集的代表元素数组,每个元素所属的集合}

使用路径压缩启发式策略,只需将代码中的rank部分去除即可。

混元:

为了证明这个问题,我们可以使用势能分析法(potential analysis)。我们定义一个势能函数,用来衡量系统的状态,然后分析每个操作对这个势能函数的影响。通过这种方式,我们可以将动态复杂度转化为静态复杂度。

首先,我们定义以下概念:

  1. MAKE-SET(x): 创建一个新的集合,包含元素 x。
  2. UNION(x, y): 合并包含元素 x 和 y 的两个集合。
  3. FIND-SET(x): 找到包含元素 x 的集合的代表元素。

我们使用按秩合并(union by rank)和路径压缩(path compression)两种启发式策略。

按秩合并和路径压缩

我们定义势能函数如下:

  • 对于每个集合,我们用一个整数表示其秩(即树的高度)。
  • 对于每个元素 x,我们定义势能函数 Φ(x) 为以 x 为根的子树的秩。

初始时,所有元素的势能为 0。

对于 MAKE-SET(x) 操作,我们创建一个新的集合,秩为 0,因此势能增加 0。

对于 UNION(x, y) 操作,我们找到两个元素 x 和 y 的根节点,假设分别为 root(x) 和 root(y)。我们将秩较小的根节点连接到秩较大的根节点上。这个操作可能会增加势能(如果 root(x) 和 root(y) 的秩不同),但增加的势能最多为 1。

对于 FIND-SET(x) 操作,我们沿着从 x 到其根节点的路径进行路径压缩。这个操作会减少势能,因为我们将沿途的所有节点的父节点直接指向了根节点,从而降低了树的高度。

在每次 FIND-SET 操作后,由于路径压缩,树的高度至多减少 1,而 UNION 操作至多增加 1 的势能。因此,总的时间复杂度为 O(m),其中 m 是操作的数量。

只使用路径压缩

如果我们只使用路径压缩而不使用按秩合并,那么在 UNION 操作中,我们可能会将任意两个节点合并,这可能导致树的高度增加。在最坏的情况下,每次 UNION 操作都可能导致树的高度翻倍,从而导致势能的增加。然而,由于 FIND-SET 操作仍然可以进行路径压缩,树的高度最终会被压缩下来。尽管如此,由于 UNION 操作的不确定性,我们不能保证整体的时间复杂度仍然是 O(m)。实际上,不使用按秩合并可能导致最坏情况下的时间复杂度退化到 O(m log n)。

Go 语言代码实现

以下是使用按秩合并和路径压缩的 Go 语言实现:

package mainimport "math"type DSU struct {parent []intrank   []int
}func NewDSU(n int) *DSU {parent := make([]int, n)rank := make([]int, n)for i := range parent {parent[i] = irank[i] = 0}return &DSU{parent, rank}
}func (dsu *DSU) Find(x int) int {if dsu.parent[x] != x {dsu.parent[x] = dsu.Find(dsu.parent[x]) // Path compression}return dsu.parent[x]
}func (dsu *DSU) Union(x, y int) {rootX := dsu.Find(x)rootY := dsu.Find(y)if rootX != rootY {if dsu.rank[rootX] > dsu.rank[rootY] {dsu.parent[rootY] = rootX} else if dsu.rank[rootX] < dsu.rank[rootY] {dsu.parent[rootX] = rootY} else {dsu.parent[rootY] = rootXdsu.rank[rootX]++ // Increment rank if roots had the same rank}}
}func main() {// Example usage:dsu := NewDSU(10)dsu.Union(1, 2)dsu.Union(3, 4)dsu.Union(2, 3)_ = dsu.Find(4) // Path compression
}

请注意,这段代码仅用于演示目的,并没有直接证明上述分析。在实际应用中,你需要根据具体的操作序列来分析性能。

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

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

相关文章

Class Constructors and Destructors (类的构造函数和析构函数)

Class Constructors and Destructors [类的构造函数和析构函数] 1. Declaring and Defining Constructors (声明和定义构造函数)2. Using Constructors (使用构造函数)3. Default Constructors (默认构造函数)4. Destructors (析构函数)5. Improving the Stock Class (改进 Sto…

前端小案例,用锚点(哈希值)实现Tab组件切换

在前端开发的世界里&#xff0c;使用现代化的技术和方法来实现常见的组件是非常重要的。今天&#xff0c;我们将通过一个具体的案例来展示如何使用现代化的CSS和ES6来创建一个优雅且功能丰富的Tab组件。本文将详细介绍实现思路、代码分析&#xff0c;并提供一些实用的开发技巧。…

25 防火墙基础操作

1 防火墙进入WEB页面操作 华三防火墙的默认用户:admin/密码:admin 将IP地址改在同一网段的信息 在防火墙的管理地址 GE/0/0/1&#xff1a;192.168.0.1 主机的地址是:192.168.0.101 思考一下为什么Ping不通 security-zone name Management import interface GigabitEthernet1/…

音视频开发34 FFmpeg 编码- 将h264和acc文件打包成flv文件

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流&#xff0c;并将它们编码和封装输出到输出⽂件&#xff0c;输出格式是根据⽂件 扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作&#xff1a; avformat_write_header &#xff1a; 写⽂…

Qt WPS(有源码)

项目源码地址&#xff1a;WPS完整源码 一.项目详情 该项目仿照WPS&#xff0c;实现了部分的功能&#xff0c;能够很方便对文本和HTML进行修改&#xff0c;并且有打印功能&#xff0c;可以很方便的生成PDF。 应用界面 项目架构分析 这个项目主要可分为两个部分&#xff0c;一…

使用RNN模型构建人名分类器

使用RNN模型构建人名分类器 1 项目需求和实现分析 短文本分类问题 2 数据处理三部曲 场景1&#xff1a;数据处理三部曲示意图 场景2&#xff1a;三个字母onehot编码形状分析 3 构建RNN模型 4 构建训练函数并进行训练 - 有关模型、损失函数、优化器三者在pytorch中的表示 5…

叶老师的新水杯c++

题目描述 最近叶老师换了个带吸管的水杯。 贝贝发现当叶老师使用带吸管的水杯时&#xff0c;每天会喝 x 毫升的水。而使用不带吸管的水杯时&#xff0c;每天会喝 y 毫升的水。 请问在 n 天的时间内&#xff0c;叶老师喝水量的上限与下限相差多少&#xff1f; 输入 第一行为…

聚焦Python分布式爬虫必学框架Scrapy打造搜索引擎(一)

Scrapy综述 Scrapy总体架构 Scrapy架构图(绿线是数据流向) 适用于海量静态页面的数据下载 Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯&#xff0c;信号、数据传递等。 Scheduler(调度器): 它负责接受引擎发送过来的Request请求&…

ELK 企业实战7

ELKkafkafilebeat企业内部日志分析系统 1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff…

FastAPI教程——部署

部署 部署FastAPI应用程序相对容易。 部署是什么意思 部署应用程序意味着执行必要的步骤以使其可供用户使用。 对于Web API来说&#xff0c;通常涉及将上传到云服务器中&#xff0c;搭配一个性能和稳定性都不错的服务器程序&#xff0c;以便你的用户可以高效地访问你的应用…

智慧校园-报修管理系统总体概述

智慧校园报修管理系统是专为优化教育机构内部维修报障流程而设计的信息化解决方案&#xff0c;它通过集成现代信息技术&#xff0c;为校园设施的维护管理带来革新。该系统以用户友好和高效运作为核心&#xff0c;确保了从报修请求提交到问题解决的每一个步骤都顺畅无阻。 师生或…

分享画布绘制矩形

简介 实现功能&#xff0c;在画布上绘制矩形&#xff0c;移动矩形。 在线演示 绘制矩形 实现代码 <!DOCTYPE html><html><head> <title>绘制矩形</title> </head><body><div style"margin: 10px"><input typ…

FastDFS部署

版本介绍 安装fastdfs共需要俩个安装包 fastdfs-5.05.tar.gz libfastcommon-1.0.7.tar.gz编译安装 libfastcommon tar -xvf libfastcommon-1.0.7.tar.gz cd libfastcommon-1.0.7 make.sh make.sh install 3. 设置软链接 libfastcommon.so默认安装到了/usr/lib64/libfastcommon.…

5-linux文件路径与文件目录系统

目录 ①文件路径 目录跳转 绝对路径与相对路径 ②文件目录系统 目录系统组成 目录命名规则 命令补充 ls命令补充 file filename查看文件类型 less查看文本文件 ①文件路径 目录跳转 pwd:查看当前工作目录。 cd:改变目录。 ls:列出目录内容。 [root########## ~]# …

某易六月实习笔试

第一题 下面代码需要更改的地方已指出。 解题思路 模拟题&#xff0c;用双指针记录双方当前式神&#xff0c;再记录一下当前谁先手&#xff0c;直到有一方指针越界。 把下面代码now1变为now(now1)%2就行。 第二题 解题思路 01背包变种&#xff0c;只是背包的容量变为多个维度…

CLAY或许是今年最值得期待的3D生成模型,号称质量最好+布线最好+支持的输入模态最多+支持材质生成。

CLAY是一种大规模可控生成模型,用于创建高质量的3D资产,它结合了多分辨率变分自编码器和简化的潜在扩散变压器,通过多种输入形式生成详细的3D几何结构和物理渲染材质。 CLAY或许是今年最值得期待的3D生成模型,号称质量最好+布线最好+支持的输入模态最多+支持材质生成。 相…

vue2+three.js实现火焰效果

// 火焰getFireMaterial() {const vertex ${ShaderChunk.logdepthbuf_pars_vertex} bool isPerspectiveMatrix(mat4) {return true; } varying vec4 m_pos; varying vec2 vUv; varying vec3 _flame; uniform float uTime; vec2 hash( vec2 p ){p vec2( dot(p,vec2(150.1,350…

EDA期末复习——基础知识

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

SaaS 出海:Databend Cloud 的定位与实践

提到 “SaaS 出海”这个词大家肯定并不陌生&#xff0c;SaaS 企业将业务拓展到海外市场已经成为许多 SaaS 公司的重要战略方向。随着企业对于灵活性、可扩展性以及成本效益需求的不断增长&#xff0c; SaaS 模式提供了理想的解决方案。对于寻求出海机会的 SaaS 企业来说&#x…

神州信息与国科量子联合进军量子网络应用服务市场(中国军民两用通信技术展览会)

量子通信&#xff0c;智联未来 —— 神州信息与国科量子共启安全通信新纪元 在信息技术飞速发展的今天&#xff0c;信息安全已成为全球关注的焦点。神州数码信息服务股份有限公司&#xff08;神州信息&#xff09;与国科量子通信网络有限公司&#xff08;国科量子&#xff09;…