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

四、假设想要增加一个 PRINT-SET(x) 操作,它是对于给定的结点 x 打印出 x 所在集合的所有成员,顺序可以任意。如何对一棵不相交集合森林的每个结点仅增加一个属性,使得 PRINT-SET(x) 所花费的时间同 x 所在集合元素的个数呈线性关系,并且其他操作的渐近运行时间不改变。这里假设我们可在 O(1) 的时间内打印出集合的每个成员。如果要写代码,请用go语言。

文心一言:

在不相交集合森林(也称为并查集或Disjoint Set Forest)中,通常每个结点(或称为元素)会包含一个指向其父结点的指针,这个结构用于高效地执行合并(UNION)和查找(FIND-SET)操作。为了支持 PRINT-SET(x) 操作,同时保持其他操作的渐近运行时间不变,我们可以在每个结点中增加一个指向集合中下一个元素的指针,形成一个循环链表。

下面是使用Go语言实现这一结构的例子:

package mainimport ("fmt"
)// DisjointSetNode 表示并查集中的结点
type DisjointSetNode struct {parent   *DisjointSetNode // 父结点指针rank     int              // 用于优化UNION操作的秩next     *DisjointSetNode // 指向集合中下一个元素的指针,用于PRINT-SETvalue    interface{}      // 结点值,可以是任意类型
}// FindSet 查找元素x所属的集合的代表元素(根结点)
func FindSet(x *DisjointSetNode) *DisjointSetNode {if x.parent != x {x.parent = FindSet(x.parent) // 路径压缩}return x.parent
}// Union 合并两个集合(通过它们的代表元素)
func Union(x, y *DisjointSetNode) {rootX, rootY := FindSet(x), FindSet(y)if rootX == rootY {return // 已经是同一个集合}if rootX.rank < rootY.rank {rootX.parent = rootY} else if rootX.rank > rootY.rank {rootY.parent = rootX} else { // 如果秩相同,将y的秩加1以确保树的高度尽可能平衡rootY.parent = rootXrootX.rank++}// 在这里不需要更新next指针,因为PRINT-SET操作会重新构建循环链表
}// PrintSet 打印元素x所在集合的所有成员
func PrintSet(x *DisjointSetNode) {root := FindSet(x)current := rootvisited := make(map[*DisjointSetNode]bool) // 用于检查是否已访问过,防止循环visited[root] = truefmt.Printf("Set of %v: ", x.value)for current != nil {fmt.Print(current.value, " ")next := current.next// 如果遇到nil或已访问过的结点,说明循环结束for next != nil && visited[next] {next = next.next}current.next = next // 临时修改next指针以形成循环链表current = nextif next != nil {visited[next] = true}}fmt.Println()// 恢复next指针为nil(可选)current = rootfor current != nil {current.next = nilcurrent = current.next // 注意这里使用原始的next值,它现在是nil}
}func main() {// 示例用法a := &DisjointSetNode{value: 'a', parent: nil, rank: 0, next: nil}b := &DisjointSetNode{value: 'b', parent: nil, rank: 0, next: nil}c := &DisjointSetNode{value: 'c', parent: nil, rank: 0, next: nil}Union(a, b)Union(b, c)PrintSet(a) // 应该打印出 'a b c 'PrintSet(b) // 应该打印出 'a b c 'PrintSet(c) // 应该打印出 'a b c '
}

注意,在上面的 PrintSet 函数中,我们使用了 visited 映射来避免在循环链表中重复访问元素。因为 next 指针在集合合并时不会被更新,所以我们在打印集合时需要手动构建循环链表。打印完集合后,我们将 next 指针恢复为 nil(这是可选的,取决于你是否想在打印后保持集合的内部状态不变)。

此外,上述代码中的 FindSet 使用了路径压缩技术来优化查找操作,使得 FindSet 的平均时间复杂度接近于常数。而 Union 操作则通过比较秩来

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

为了实现 PRINT-SET(x) 操作,我们可以在每个结点上添加一个指向其父节点的指针。这样,当我们想要打印一个集合的所有成员时,我们可以通过遍历这个集合的所有结点并打印它们来实现。具体来说,我们可以从给定的结点 x 开始,沿着父节点指针向上遍历,直到找到一个没有父节点的结点(即根节点)。然后,我们可以再次遍历从根节点到 x 的所有路径,打印出所有遇到的结点。

以下是使用 Go 语言实现的代码:

package mainimport "fmt"type Node struct {parent *Nodevalue  int
}func NewNode(value int) *Node {return &Node{parent: nil, value: value}
}func (n *Node) SetParent(p *Node) {n.parent = p
}func PrintSet(x *Node) {if x == nil {return}// 找到根节点for x.parent != nil {x = x.parent}// 打印从根节点到当前结点的所有路径上的结点for y := x; y != nil; y = y.parent {fmt.Println(y.value)}
}func main() {// 创建一个简单的不相交集合森林示例node1 := NewNode(1)node2 := NewNode(2)node3 := NewNode(3)node4 := NewNode(4)node2.SetParent(node1)node3.SetParent(node1)node4.SetParent(node2)// 测试 PRINT-SET 操作PrintSet(node4) // 输出:1, 2, 4
}

在这个实现中,我们为每个结点添加了一个指向其父节点的指针。PrintSet 函数首先找到给定结点的根节点,然后遍历从根节点到给定结点的所有路径,打印出所有遇到的结点。这样,PRINT-SET(x) 的时间复杂度就是 O(log n),其中 n 是树的高度。其他操作的时间复杂度保持不变。

360智脑:

为了实现 PRINT-SET(x) 操作,我们可以为每个结点添加一个额外的属性,即指向其所在集合的代表结点的指针。这样,当我们需要打印一个集合时,我们可以通过遍历从给定结点到代表结点的路径上的所有结点来实现。由于路径上的结点数量等于集合中的元素数量,因此这个操作的时间复杂度与集合的大小成线性关系。

以下是一个使用 Go 语言实现的示例代码:

type Node struct {parent *Node // 父节点指针rank   int   // 用于路径压缩和按秩合并的秩setRep *Node // 指向集合代表的指针
}// 初始化结点
func MakeSet(x *Node) {x.parent = xx.rank = 0x.setRep = x // 初始时,每个结点都是自己集合的代表
}// 查找结点的代表结点,并进行路径压缩
func FindSet(x *Node) *Node {if x != x.parent {x.parent = FindSet(x.parent)}return x.parent
}// 合并两个集合
func Union(x *Node, y *Node) {link(FindSet(x), FindSet(y))
}// 链接两个结点,按秩合并
func link(x *Node, y *Node) {if x.rank > y.rank {y.parent = xy.setRep = x // 更新 y 的集合代表指针} else {x.parent = yx.setRep = y // 更新 x 的集合代表指针if x.rank == y.rank {y.rank++}}
}// 打印集合
func PrintSet(x *Node) {rep := FindSet(x)printSetRecursive(rep)
}// 递归打印集合
func printSetRecursive(node *Node) {fmt.Println(node)current := nodefor current.parent != current {current = current.parentfmt.Println(current)}
}// 测试代码
func main() {nodes := []*Node{&Node{}, &Node{}, &Node{}, &Node{}}for _, node := range nodes {MakeSet(node)}Union(nodes[0], nodes[1])Union(nodes[2], nodes[3])Union(nodes[1], nodes[2])PrintSet(nodes[0])
}

在这个实现中,MakeSetFindSetUnion 函数保持了原有的时间复杂度不变,而 PrintSet 函数通过递归地打印从给定结点到代表结点的路径上的所有结点来实现打印集合的操作。由于每次递归都会打印一个结点,因此打印整个集合的时间复杂度与集合的大小成线性关系。

智谱清言:

为了实现 PRINT-SET(x) 操作,我们可以为每个结点添加一个额外的属性,即指向其所在集合的代表结点的指针。这样,当我们需要打印一个集合时,我们可以通过遍历从给定结点到代表结点的路径上的所有结点来实现。由于路径上的结点数量等于集合中的元素数量,因此这个操作的时间复杂度与集合的大小成线性关系。

以下是一个使用 Go 语言实现的示例代码:

type Node struct {parent *Node // 父节点指针rank   int   // 用于路径压缩和按秩合并的秩setRep *Node // 指向集合代表的指针
}// 初始化结点
func MakeSet(x *Node) {x.parent = xx.rank = 0x.setRep = x // 初始时,每个结点都是自己集合的代表
}// 查找结点的代表结点,并进行路径压缩
func FindSet(x *Node) *Node {if x != x.parent {x.parent = FindSet(x.parent)}return x.parent
}// 合并两个集合
func Union(x *Node, y *Node) {link(FindSet(x), FindSet(y))
}// 链接两个结点,按秩合并
func link(x *Node, y *Node) {if x.rank > y.rank {y.parent = xy.setRep = x // 更新 y 的集合代表指针} else {x.parent = yx.setRep = y // 更新 x 的集合代表指针if x.rank == y.rank {y.rank++}}
}// 打印集合
func PrintSet(x *Node) {rep := FindSet(x)printSetRecursive(rep)
}// 递归打印集合
func printSetRecursive(node *Node) {fmt.Println(node)current := nodefor current.parent != current {current = current.parentfmt.Println(current)}
}// 测试代码
func main() {nodes := []*Node{&Node{}, &Node{}, &Node{}, &Node{}}for _, node := range nodes {MakeSet(node)}Union(nodes[0], nodes[1])Union(nodes[2], nodes[3])Union(nodes[1], nodes[2])PrintSet(nodes[0])
}

在这个实现中,MakeSetFindSetUnion 函数保持了原有的时间复杂度不变,而 PrintSet 函数通过递归地打印从给定结点到代表结点的路径上的所有结点来实现打印集合的操作。由于每次递归都会打印一个结点,因此打印整个集合的时间复杂度与集合的大小成线性关系。

天工:

为了实现 PRINT-SET(x) 操作,我们需要在不相交集合森林中的每个结点上增加一个指向其父节点的指针。这样,我们可以通过沿着树的路径从结点 x 向上遍历到根节点,然后从根节点向下遍历到所有叶子节点来打印出集合的所有成员。这种遍历可以在每个结点上花费常数时间,因此总时间是线性的。

下面是一个使用Go语言实现的示例代码:

type DisjointSetNode struct {parent *DisjointSetNode // 指向父节点的指针rank   int              // 用于路径压缩和按秩合并的秩value  string           // 结点的值
}func MakeSet(x *DisjointSetNode) {x.parent = xx.rank = 0
}func FindSet(x *DisjointSetNode) *DisjointSetNode {if x.parent != x {x.parent = FindSet(x.parent) // 路径压缩}return x.parent
}func Union(x *DisjointSetNode, y *DisjointSetNode) {link(FindSet(x), FindSet(y))
}func link(x *DisjointSetNode, y *DisjointSetNode) {if x.rank > y.rank {y.parent = x} else {x.parent = yif x.rank == y.rank {y.rank++}}
}func PrintSet(x *DisjointSetNode) {root := FindSet(x)printHelper(root)
}func printHelper(node *DisjointSetNode) {if node != nil {fmt.Println(node.value)printHelper(node.parent)}
}// 示例用法
func main() {nodes := []*DisjointSetNode{&DisjointSetNode{value: "A"},&DisjointSetNode{value: "B"},&DisjointSetNode{value: "C"},&DisjointSetNode{value: "D"},}for _, node := range nodes {MakeSet(node)}Union(nodes[0], nodes[1])Union(nodes[2], nodes[3])Union(nodes[0], nodes[2])PrintSet(nodes[1]) // 打印出集合 {"A", "B", "C", "D"}
}

在这个实现中,MakeSet 函数创建一个新的集合,其中包含单个元素。FindSet 函数找到一个元素的集合的代表,并在返回之前执行路径压缩。Union 函数将两个集合合并为一个。PrintSet 函数打印出给定结点所在集合的所有成员。

请注意,这个实现假设我们可以在常数时间内打印出集合的每个成员。如果打印操作不是常数时间,那么 PrintSet 的总时间将与集合的大小成正比。此外,这个实现没有改变其他操作(如 MakeSetFindSetUnion)的渐近运行时间。

灵小智:

为了实现 PRINT-SET(x) 操作,我们可以通过修改不相交集合森林的每个结点,使其具有指向集合中所有成员的指针。这样,当调用 PRINT-SET(x) 时,只需遍历该结点指向的所有成员并打印出来,时间复杂度与集合元素个数成线性关系。

以下是一个示例的 Go 代码,演示如何修改不相交集合森林的结点以支持 PRINT-SET(x) 操作:

package mainimport "fmt"type Node struct {parent *Noderank   intmembers []int
}func MakeSet(x int) *Node {return &Node{parent: nil, rank: 0, members: []int{x}}
}func Find(node *Node) *Node {if node.parent == nil {return node}return Find(node.parent)
}func Union(x, y *Node) {rootX := Find(x)rootY := Find(y)if rootX == rootY {return}if rootX.rank < rootY.rank {rootX, rootY = rootY, rootX}rootY.parent = rootXrootX.members = append(rootX.members, rootY.members...)if rootY.rank == rootX.rank {rootX.rank++}
}func PrintSet(x *Node) {for _, member := range x.members {fmt.Println(member)}
}func main() {// 示例用法node1 := MakeSet(1)node2 := MakeSet(2)Union(node1, node2)PrintSet(node1)
}

通过将每个结点扩展为包含成员列表,我们可以在 O(1) 的时间内打印出集合的每个成员,同时保持其他操作的渐近运行时间不变。

chatgpt:

为了实现给每个节点增加一个属性以支持 PRINT-SET(x) 操作的线性时间复杂度,可以使用路径压缩和按秩合并的思想。具体代码如下(Go语言):

package mainimport "fmt"type Node struct {parent *Noderank   intvalue  interface{} // 节点的值,可以根据需求修改类型
}func MakeSet(x *Node) {x.parent = xx.rank = 0
}func Find(x *Node) *Node {if x != x.parent {x.parent = Find(x.parent) // 路径压缩}return x.parent
}func Union(x, y *Node) {rootX := Find(x)rootY := Find(y)if rootX == rootY {return}if rootX.rank < rootY.rank {rootX.parent = rootY} else if rootX.rank > rootY.rank {rootY.parent = rootX} else {rootY.parent = rootXrootX.rank++}
}// 增加一个属性用于记录集合元素数量,并在合并时更新该属性值
func AddPrintSetAttribute(root *Node, value interface{}) {root.value = value // 设置节点值为集合元素数量
}// 打印出给定节点所在集合的所有成员(遍历打印)
func PrintSet(root *Node) {current := Find(root)for current != nil {fmt.Println(current.value)current = current.parent}
}func main() {node1 := &Node{}node2 := &Node{}node3 := &Node{}node4 := &Node{}MakeSet(node1)MakeSet(node2)MakeSet(node3)MakeSet(node4)AddPrintSetAttribute(node1, 1)AddPrintSetAttribute(node2, 2)AddPrintSetAttribute(node3, 3)AddPrintSetAttribute(node4, 4)Union(node1, node2) // 合并集合 {1, 2}Union(node3, node4) // 合并集合 {3, 4}PrintSet(Find(node1)) // 打印出集合 {1, 2} 的所有成员PrintSet(Find(node3)) // 打印出集合 {3, 4} 的所有成员
}

上述代码使用不相交集合森林的数据结构,并在每个节点中增加一个属性来记录集合元素数量。通过路径压缩和按秩合并的策略,使得 PRINT-SET(x) 操作的时间复杂度与 x 所在集合元素个数成线性关系,并且其他操作(如 MakeSet、Find、Union)的渐近运行时间不变。最后,在打印时遍历打印出给定节点所在集合的所有成员。

混元:

为了实现 PRINT-SET(x) 操作,我们可以在每个结点 x 上增加一个属性 parent,用来记录 x 的父结点。同时,我们需要一个字典(或哈希表)来存储每个集合的根结点及其成员列表。这样,在执行 PRINT-SET(x) 时,我们可以从 x 开始向上查找其根结点,然后打印出该集合的所有成员。

首先,我们需要定义一个结构体来表示结点,并包含 parent 属性:

type Node struct {value intparent *Node
}

接下来,我们需要实现以下几个操作:

  1. 初始化不相交集合森林
  2. 查找结点的根结点
  3. 合并两个集合
  4. 执行 PRINT-SET(x) 操作

以下是相应的 Go 语言实现:

package mainimport "fmt"type Node struct {value intparent *Node
}// 初始化不相交集合森林
func initDisjointSetForest(size int) []*Node {nodes := make([]*Node, size)for i := range nodes {nodes[i] = &Node{value: i}}return nodes
}// 查找结点的根结点
func find(node *Node) *Node {if node.parent == nil {return node}node.parent = find(node.parent) // 路径压缩return node.parent
}// 合并两个集合
func union(node1, node2 *Node) {root1 := find(node1)root2 := find(node2)if root1 != root2 {root1.parent = root2}
}// 执行 PRINT-SET(x) 操作
func printSet(node *Node, sets map[int][]*Node) {root := find(node)for _, n := range sets[root.value] {fmt.Printf("%d ", n.value)}fmt.Println()
}func main() {nodes := initDisjointSetForest(10)sets := make(map[int][]*Node)for _, node := range nodes {sets[node.value] = append(sets[node.value], node)}union(nodes[1], nodes[2])union(nodes[3], nodes[4])union(nodes[5], nodes[6])printSet(nodes[1], sets) // 输出: 1 2printSet(nodes[3], sets) // 输出: 3 4printSet(nodes[5], sets) // 输出: 5 6
}

在这个实现中,PRINT-SET(x) 操作的时间复杂度为 O(n),其中 n 是 x 所在集合的元素个数。其他操作的渐近运行时间保持不变。

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

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

相关文章

C++ | Leetcode C++题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; class Solution {const int L 10;unordered_map<char, int> bin {{A, 0}, {C, 1}, {G, 2}, {T, 3}}; public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;int n s.length();if (n < L…

内网穿透实现方案(免费版)_免费内网穿透

#巴比达内网穿透——我的网络救星# 作为一个常常在网络世界里摸索的人&#xff0c;我一直在寻找一款真正好用的内网穿透工具。相信很多朋友都和我有过一样的经历&#xff0c;为了找到合适的工具&#xff0c;试了一个又一个&#xff0c;却总是失望而归。但这次&#xff0c;我真…

2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

大厂程序员上班猝死成常态?

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 近日&#xff0c;连续看到大厂程序员猝死、低血糖晕倒的新闻&#xff0c;同为程序员感到很难受。互联网加班成常态这是既定事实&#xff0c;尤其在这个内卷严重、经济不景气的环境中&#xff0c;加班…

C++编程(一)C++与C语言的一些区别

文章目录 一、QtCreator基本使用&#xff08;一&#xff09;编码格式&#xff1a;&#xff08;二&#xff09;C编程1. 文件后缀2. 编译3. 头文件 二、名字空间&#xff08;一&#xff09;概念以及访问方式1. 概念2. 访问方式&#xff08;1&#xff09;通过作用域限定符进行访问…

数据挖掘常见算法(聚类)

划分方法 K-均值算法(K-means算法) 方法: 首先选择K个随机的点,称为聚类中心.对于数据集中的,每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类.计算每一个组的平均值,将改组所关联的中心点移动到平均值的位置重复2~…

波士顿大学开发通过患者的声音检测早期阿尔茨海默氏症迹象的AI系统

波士顿大学的研究人员开发了一种人工智能系统&#xff0c;能够通过患者的声音检测阿尔茨海默病的早期迹象。目前尚无治愈这种疾病的方法&#xff0c;但及早发现可以改善患者的治疗选择。研究人员结合自然语言处理和机器学习&#xff0c;开发了一种可以自动预测患者阿尔茨海默病…

RocketMq源码解析九:刷盘机制及过期文件删除

一、刷盘机制 刷盘策略在不同时间进行刷写磁盘。RocketMQ的存储是基于JDK NIO的内存映射机制(MappedByteBuffer)的,消息存储首先将消息追加到内存,再根据配置的刷写磁盘 同步刷盘表示消息追加到内存后,立即将数据刷写到文件系统中。代码的调用链如下: submi…

新手必备!短视频剪辑常用的18个技巧——剪映篇

导入素材&#xff1a;这里我们可以选择自己拍摄好的素材&#xff08;图片、视频或录制好的音频&#xff09;&#xff0c;按照顺序导入剪辑区剪辑。这一步是剪辑的基础&#xff0c;确定剪辑的大体思路与成片框架&#xff01;别忽略了&#xff0c;剪映官方素材库提供的素材&#…

【数学建模】—【Python库】—【Numpy】—【学习】

目录 ​编辑 1. NumPy安装 2. ndarray对象 1. 创建ndarray 1.从列表或元组创建&#xff1a; 2.使用内置函数创建&#xff1a; 2. ndarray属性 3. 数组运算 1. 基本运算 2. 数学函数 3.统计函数 4. 数组索引与切片 1. 一维数组索引与切片 2.多维数组索引与切片 5.…

免费直播课程!6月30日

<面向人工智能领域的开发工程师&#xff0c;特别是机器学习/深度学习方向> 在这里报名听课&#xff1a; F学社-全球FPGA技术提升平台 (zzfpga.com) TIPS&#xff1a; 报名后将在页面内弹出「腾讯会议号和会议密码」&#xff0c;注意复制保存哦~

python笔记----少儿编程课程

第1课&#xff1a; 认识新朋友-python 知识点&#xff1a; 1、在英文状态下编写Python语句。 2、内置函数print()将结果输出到标准的控制台上&#xff0c;它的基本语法格式如下&#xff1a; print("即将输出的内容") #输出的内容要用引号引起来&#xff0c;可…

Jmeter插件管理器,websocket协议,Jmeter连接数据库,测试报告的查看

目录 1、Jmeter插件管理器 1、Jmeter插件管理器用处&#xff1a;Jmeter发展并产生大量优秀的插件&#xff0c;比如取样器、性能监控的插件工具等。但要安装这些优秀的插件&#xff0c;需要先安装插件管理器。 2、插件的下载&#xff0c;从Availabale Plugins中选择&#xff…

android Studio 无线开发调试: PC机远程安卓电脑 免费

背景 公司的安卓机比较大&#xff0c;还有连接着串口设备不好挪动。 但是遇到问题调试很麻烦。想找到一套远程调试方法。 实现 要求&#xff1a; adb android Studio 2023.3.1 安卓机IP:1928.168.1.228 直接用adb远程连接&#xff1a;adb connect 1928.168.1.228 默认端口…

Kotlin 中的数据类型有隐式转换吗?

在 Kotlin 中&#xff0c;数据类型不可隐式转换。在 Java 中&#xff0c;如果数据是从小到大&#xff0c;是可以隐式转换的&#xff0c;数据类型将自动提升。 下面以 int 类型的数据为例&#xff0c;在 Java 中这样写是可以的&#xff1a; int a 2312; long b a;但是在 Kot…

ONLYOFFICE8.1-------宝藏级别桌面编辑器测评

简介 ONLYOFFICE 8.1 是一个功能强大的办公套件&#xff0c;提供了一系列广泛的功能&#xff0c;用于文档管理、协作和沟通。它包括用于创建和编辑文本文档、电子表格、演示文稿等的工具。ONLYOFFICE 8.1 的一些关键特性包括&#xff1a; 1. 协作&#xff1a;ONLYOFFICE 8.1 允…

[数据结构】——七种常见排序

文章目录 前言 一.冒泡排序二.选择排序三.插入排序四.希尔排序五.堆排序六.快速排序hoare挖坑法前后指针快排递归实现&#xff1a;快排非递归实现&#xff1a; 七、归并排序归并递归实现&#xff1a;归并非递归实现&#xff1a; 八、各个排序的对比图 前言 排序&#xff1a;所谓…

小程序发布必须进行软件测试吗?测试内容有哪些?

在如今移动互联网时代&#xff0c;小程序已成为许多企业广泛采用的一种营销手段&#xff0c;然而&#xff0c;发布小程序之前进行充分的软件测试是至关重要的&#xff0c;因为它不仅可以确保小程序的质量&#xff0c;还可以避免潜在的风险和损失。 在进行小程序发布前进行软件…

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤&#xff1a; 2. 注册微信开发者账号步骤&#xff1a; 3. 创建 UniApp 项目步骤&#xff1a; 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…

linux rocky9.2系统搭建sqle数据库审核平台

文章目录 前言一、环境准备?二、开始部署前言 关于SQLE SQLE 是由上海爱可生信息技术股份有限公司 开发并开源,支持SQL审核、索引优化、事前审核、事后审核、支持标准化上线流程、原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展…