五、用go语言,给定 n 个元素的顺序统计树中的一个元素 x 和一个自然数 i ,如何在O(lgn)的时间内确定工在该树线性序中的第 i 个后继?

文心一言,代码正常运行:

在顺序统计树(也称为平衡二叉搜索树)中,要找到一个元素 x 的第 i 个后继,我们可以使用以下步骤:

从根节点开始,使用递归或迭代方式沿着树向下遍历,找到节点 n,使得 x 在以 n 为根的子树中的秩为 i。

如果 n 的右子树不为空,并且 n 的右子树中的最大元素(即右子树的根节点的值)的秩小于 i,那么 x 的第 i 个后继就是 n 的右子树中的最大元素。

否则,x 的第 i 个后继是 n 的右子树中的第 i 个后继。

以下是使用 Go 语言实现该算法的示例代码:

package main  

import "fmt"  

type Node struct {
key int
parent *Node
left *Node
right *Node
rank int
} func OS_KEY_RANK(T *Node, k int) int {
if T == nil {
return -1
}
if T.key == k {
return T.rank
} else if k < T.key {
return OS_KEY_RANK(T.left, k)
} else {
return OS_KEY_RANK(T.right, k)
}
} func findSuccessor(T *Node, x int, i int) *Node {
if T == nil {
return nil
}
if T.key == x {
return findSuccessorInSubtree(T, i)
} else if x < T.key {
return findSuccessor(T.left, x, i)
} else {
return findSuccessor(T.right, x, i)
}
} func findSuccessorInSubtree(T *Node, i int) *Node {
if T == nil || T.right == nil {
return nil
}
if T.rank+1 == i {
return T.right // 当前节点的右子节点是第 i 个后继
} else if T.rank < i {
return findSuccessorInSubtree(T.right, i-T.rank-1) // 在右子树中继续查找第 i 个后继
} else {
return findSuccessorInSubtree(T.parent, i-T.rank) // 在父节点所在子树中继续查找第 i 个后继
}
} func main() {
// 构造一棵顺序统计树,以一个简单的例子为例,其中所有元素都不同
root := &Node{key: 28, rank: 0} // 根节点
root.left = &Node{key: 35, rank: 1} // 左子节点
root.right = &Node{key: 43, rank: 1} // 右子节点
root.left.left = &Node{key: 24, rank: 2} // 左子节点的左子节点
root.left.right = &Node{key: 8, rank: 2} // 左子节点的右子节点
root.right.right = &Node{key: 7, rank: 2} // 右子节点的右子节点
// ... 可以继续构造更多的节点,这里只是展示了一部分示例结构。实际中顺序统计树应满足二叉搜索树的性质。 x := 35 // 要查找的后继元素的键值
i := 2 // 第几个后继,从1开始计数,而不是从0开始。例如,要查找第2个后继。
successor := findSuccessor(root, x, i) // 查找第 i 个后继元素所在的节点指针(如果存在的话)
if successor != nil {
fmt.Printf("The %dth successor of key %d is %d.\n", i, x, successor.key) // 如果找到了后继元素,输出结果。这里假设输出成功继元素的键值。可以根据实际需求进行修改。
} else {
fmt.Printf("No %dth successor found for key %d in the tree.\n", i, x) // 如果未找到后继元素,输出提示信息。同样,可以根据实际需求进行修改。
}
}

讯飞星火,代码不能运行:

为了在 O(log n) 的时间内确定元素 x 在顺序统计树中的第 i 个后继,我们可以使用以下算法:

1.从根节点开始遍历顺序统计树。

2.如果当前节点的关键字小于等于 x,则向右子树移动。

3.如果当前节点的关键字大于 x,则向左子树移动。

4.当当前节点的关键字等于 x 时,我们需要找到其右子树中最左侧的节点。这个节点就是 x 的第 i 个后继。

5.重复步骤 4,直到找到第 i 个后继或者遍历完整个顺序统计树。

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

package main

import "fmt"

type Node struct {
Key int
Color string
Left *Node
Right *Node
} func findSuccessor(root *Node, x int, i int) *Node {
successor := nil
count := 0 node := root
for node != nil {
if node.Key <= x {
node = node.Right
} else {
successor = node
node = node.Left
}
} if successor == nil {
return nil
} node = successor.Right
for node != nil {
count++
if count == i {
return node
}
node = node.Left
} return nil
} func main() {
// 构建一个红黑树 T,并找到关键字为 35 的节点 x
// 然后调用 findSuccessor(T, x, i)
// ...
}

请注意,这个代码示例仅用于说明如何找到顺序统计树中元素的第 i 个后继,实际应用中需要根据具体情况进行调整。

360智脑,代码正常运行:

要在O(lgn)的时间内确定一个元素x在顺序统计树中的第i个后继,我们可以使用一个名为“后继器”的数据结构。后继器可以让我们在对数时间内找到一个元素的后继。以下是一个在Go语言中实现后继器的示例:

package main 

import "fmt"

type Node struct {
Key int
Left *Node
Right *Node
} type Successor struct {
Current *Node
Stack []*Node
} func (s *Successor) Push(node *Node) {
s.Stack = append(s.Stack, node)
s.Current = node
} func (s *Successor) Pop() {
if len(s.Stack) == 0 {
return
} s.Current = s.Stack[len(s.Stack)-1]
s.Stack = s.Stack[:len(s.Stack)-1]
} func (s *Successor) Peek() *Node {
return s.Stack[len(s.Stack)-1]
} func findKthSuccessor(root *Node, x int, k int) int {
succ := &Successor{}
node := root for {
if node == nil {
return 0
} if node.Key > x {
succ.Push(node.Right)
node = node.Left
} else if node.Key < x {
succ.Push(node.Left)
node = node.Right
} else {
break
}
} for k > 1 {
if node.Right != nil {
succ.Push(node.Right)
node = node.Right
} else {
succ.Pop()
node = succ.Peek()
} k--
} return node.Key
} func main() {
root := &Node{Key: 5}
root.Left = &Node{Key: 3}
root.Right = &Node{Key: 8}
root.Left.Left = &Node{Key: 1}
root.Left.Right = &Node{Key: 4}
root.Right.Left = &Node{Key: 6}
root.Right.Right = &Node{Key: 10} for i := 1; i <= 10; i++ {
fmt.Printf("第 %d 个后继: %d\n", i, findKthSuccessor(root, 5, i))
}
}

在这个示例中,我们首先定义了一个Node结构体来表示顺序统计树的节点。然后,我们实现了Successor结构体,它使用一个栈来存储在寻找后继过程中访问的节点。findKthSuccessor函数使用后继器来找到元素x的第k个后继。

请注意,这个示例仅用于说明如何在O(lgn)时间内确定一个元素的第i个后继。实际应用中,您可能需要根据具体需求调整代码和数据结构。

智谱清言,代码正常运行:

在顺序统计树中,每个节点都包含一个元素,并且每个节点的左子节点包含小于该节点的元素,而右子节点包含大于该节点的元素。因此,我们可以通过二分查找的方法来找到节点x的后继。

以下是一个Go语言的函数,它接受一个顺序统计树的根节点、一个元素x和一个自然数i,然后在O(lgn)的时间内返回x在该树线性序中的第i个后继:

package main
import (
"fmt"
)
type Node struct {
Element int
Left, Right *Node
}
func FindSuccessor(root *Node, x int, i int) *Node {
if root == nil {
return nil
}
// 首先,找到包含元素x的节点
current := root
for current.Left != nil && current.Left.Element != x {
current = current.Left
}
if current.Left == nil {
return nil // x 不在树中
}
// 现在,current 是包含 x 的节点
// 我们需要找到 x 的第 i 个后继
if i == 1 {
return current.Right // x 的第一个后继是其右子节点
}
// 如果不是第一个后继,我们需要递归地在右子树中找到 i-1 的后继
return FindSuccessor(current.Right, x, i-1)
}
func main() {
// 创建一个顺序统计树
root := &Node{Element: 5}
root.Left = &Node{Element: 3}
root.Right = &Node{Element: 7}
root.Left.Left = &Node{Element: 2}
root.Left.Right = &Node{Element: 4}
root.Right.Right = &Node{Element: 8}
// 找到元素 4 的第 2 个后继
successor := FindSuccessor(root, 4, 2)
if successor != nil {
fmt.Printf("The successor of %d is %d\n", 4, successor.Element)
} else {
fmt.Println("Element not found or no successor")
}
}

在这个函数中,我们首先通过二分查找找到包含元素x的节点。然后,如果i等于1,我们就返回这个节点的右子节点,因为它是x的第一个后继。如果i大于1,我们就递归地在右子树中寻找i-1的后继。

这个算法的时间复杂度是O(lgn),因为最坏情况下,我们需要遍历树的所有节点。

通义千问:

在顺序统计树(如红黑树或AVL树)中查找给定元素 x 的第 i 个后继,即在线性序中位于 x 后面的第 i 个元素,可以采用以下步骤实现:

type Node struct {
Key int
Color bool // 红黑树的颜色属性
Left, Right *Node
// 其他相关属性...
} // 假设已有一个方法 countSmaller 计算以某个节点为根的子树中小于给定值的数量
func countSmaller(node *Node, key int) int {
if node == nil || node.Key >= key {
return 0
}
leftCount := countSmaller(node.Left, key)
if node.Key > key {
return leftCount + 1 + count(node.Right)
}
return leftCount + count(node.Right)
} // count 方法用于计算以某个节点为根的子树中的节点数量
func count(node *Node) int {
if node == nil {
return 0
}
return 1 + count(node.Left) + count(node.Right)
} // 查找给定元素 x 的第 i 个后继
func findSuccessor(tree *Node, x int, i int) (*Node, error) {
if tree == nil || i <= 0 {
return nil, errors.New("Invalid input: tree is empty or i is not positive") // 首先找到元素 x 在树中的位置
rank := countSmaller(tree, x) // 如果rank+i超过树的大小,则没有足够的后继
if rank+i > count(tree) {
return nil, errors.New("No such successor exists")
} // 开始从x所在位置向右搜索
currentNode := tree
for {
// 如果当前节点是目标节点的直接后继,且计数器为i,则返回该节点
if currentNode.Key > x {
succRank := rank + 1
if succRank == i {
return currentNode, nil
}
rank = succRank
} // 移动到下一个可能的后继节点
if currentNode.Key < x {
currentNode = currentNode.Right
} else if currentNode.Key > x { // 注意这里不是等于,因为所有关键字都不同
currentNode = currentNode.Left
i -= 1 // 因为已经走过一个大于x的节点
} else if currentNode.Key == x {
currentNode = currentNode.Right
} // 当找到第 i 个后继时退出循环
if i == 0 {
return currentNode, nil
}
}
} // 使用示例
successorNode, err := findSuccessor(root, x, i)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("The %d-th successor of element %d is: %d\n", i, x, successorNode.Key)
}

这个findSuccessor函数首先通过countSmaller确定元素 x 的秩,然后根据秩和所需后继的位置,在正确方向上遍历树来找到目标节点。由于顺序统计树的平衡性质,上述操作的时间复杂度为 O(log n)。请注意,代码需要在实际项目中配合完整的红黑树或其他顺序统计树数据结构实现,并处理边界情况。

天工,代码不能运行:

在 Go 语言中,可以使用二分查找的方式来实现这一功能。首先,我们需要创建一个顺序统计树,然后可以在 O(lgn) 的时间内找到元素 x 的位置,接着可以使用类似二分查找的方法来找到元素 x 的第 i 个后继。

这里是一个基本的实现:

package main

import (
"fmt"
) type Node struct {
val int
left *Node
right *Node
} func main() {
// 创建顺序统计树
// ... // 找到元素 x 的位置
node := findNode(tree, x) // 如果 node 不存在或者没有后继,则返回 nil
if node == nil || node.right == nil {
fmt.Println("No successor found.")
return
} // 从元素 x 的右子树中开始,找到第 i 个节点
node = node.right
for i > 0 {
if node.left == nil {
// 如果当前节点的左子节点为 nil,则返回 nil
fmt.Println("No successor found.")
return
}
node = node.left
i--
} // 返回第 i 个节点
fmt.Println(node.val)
} func findNode(tree *Node, val int) *Node {
// 使用二分查找来找到元素 x 的位置
// ...
}

这个代码的基本思想是,首先找到元素 x 的位置,然后从元素 x 的右子树中开始,找到第 i 个节点。由于顺序统计树的特性,这个操作可以在 O(lgn) 的时间内完成。

需要注意的是,这个代码只是一个基本的实现,实际使用时可能需要根据具体的应用场景进行一些调整。

灵小智,代码正常运行:

在使用Go语言实现顺序统计树(Order Statistic Tree)时,要在O(lgn)的时间内确定某个元素x在该树线性序中的第i个后继,可以使用以下步骤:
  1. 定义一个辅助函数rank(node),该函数用于返回以"node"为根节点的子树的节点数量(包括自身)。即,rank(node) = 左子树节点数 + 1。

  2. 定义一个辅助函数select_(node, i),该函数用于在以"node"为根节点的子树中选择第i个后继节点。

    a. 如果i等于rank(node.left) + 1,则说明当前节点就是第i个后继节点,返回该节点。

    b. 如果i小于rank(node.left) + 1,则递归调用select_(node.left, i)在左子树中查找第i个后继节点。

    c. 如果i大于rank(node.left) + 1,则递归调用select_(node.right, i - rank(node.left) - 1)在右子树中查找第(i - rank(node.left) - 1)个后继节点。

  3. 在主函数中调用select_(root, i),其中root表示顺序统计树的根节点,i表示要查找的第i个后继节点的位置。

这样,通过递归调用select_函数,在每一层递归中,我们都将问题规模缩小到原来的一半,所以总的时间复杂度为O(lgn)。

以下是使用Go语言的示例代码:

package main

import "fmt"

type Node struct {
key int
left, right *Node
size int // 节点子树的大小
} func rank(node *Node) int {
if node == nil {
return 0
}
return node.size
} func select_(node *Node, i int) *Node {
if node == nil {
return nil
} r := rank(node.left) + 1
if i == r {
return node
} else if i < r {
return select_(node.left, i)
} else {
return select_(node.right, i-r)
}
} func getOrderStatisticSuccessor(root *Node, x *Node, i int) *Node {
rankX := rank(x) + 1
if rankX+i <= root.size {
return select_(root, rankX+i) // 在整个树中查找第(rank(x)+i)个后继节点
}
return nil
} // 示例测试代码
func main() {
// 创建顺序统计树
root := &Node{key: 10}
root.left = &Node{key: 5}
root.right = &Node{key: 15}
root.left.left = &Node{key: 2}
root.left.right = &Node{key: 8}
root.right.left = &Node{key: 12}
root.right.right = &Node{key: 18} // 在顺序统计树中找到某个节点和第i个后继节点
x := root.left // 假设为5
i := 2
successor := getOrderStatisticSuccessor(root, x, i)
if successor != nil {
fmt.Printf("第%d个后继节点是:%d\n", i, successor.key)
} else {
fmt.Printf("第%d个后继节点不存在\n", i)
}
}

希望这个例子能够帮助你理解如何使用Go语言在O(lgn)的时间内确定顺序统计树中某个元素的第i个后继节点。如果有任何疑问,请随时提问。

chatgpt:

要在O(lgn)的时间内确定顺序统计树中元素x的第i个后继,可以使用以下递归算法:

type Node struct {
key int
left, right *Node
size int // 记录子树节点数目
} // 返回节点 x 在树 T 中的第 i 个后继节点
func Successor(T *Node, x *Node, i int) *Node {
rank := OS_KEY_RANK(T, x.key) + i + 1
return Select(T, rank)
} // 返回树 T 中秩为 k 的节点
func Select(T *Node, k int) *Node {
if T == nil || k <= 0 || k > T.size {
return nil // 越界或空树,返回空指针
}
leftSize := size(T.left)
if leftSize+1 == k {
return T // 找到秩为k的节点,返回它
} else if leftSize >= k { // 目标在左子树中,递归左子树查找
return Select(T.left, k)
} else { // 目标在右子树中,递归右子树查找,并更新目标秩值
return Select(T.right, k-leftSize-1)
}
} // 返回节点的秩
func OS_KEY_RANK(T *Node, k int) int {
if T == nil {
return 0
}
if k < T.key {
return OS_KEY_RANK(T.left, k)
} else if k > T.key {
return 1 + size(T.left) + OS_KEY_RANK(T.right, k)
} else {
return size(T.left)
}
} // 返回子树的节点数目(包括根节点)
func size(T *Node) int {
if T == nil {
return 0
}
return T.size
}

以上代码中,Successor()函数接受一个顺序统计树T、一个元素x和一个自然数i,并返回在线性序中元素x的第i个后继节点。该算法通过调用辅助函数OS_KEY_RANK()获取元素x在树T中的秩,然后再调用辅助函数Select()找到秩为rank的节点作为结果。

注意:这只是一个示例代码,实际使用时需要确保顺序统计树的正确性和完整性,并进行相应错误处理。

kimi,代码正常运行:

在顺序统计树(Order Statistic Tree)中,要在一个具有 n 个元素的树中找到元素 x 的第 i 个后继,我们可以使用迭代的查找方法,这通常可以在 O(log n) 的时间内完成。以下是 Go 语言中实现这一操作的示例代码:

package main

import (
"fmt"
) type Node struct {
key int
left *Node
right *Node
} func findSuccessor(node *Node, x int, i int) *Node {
if node == nil {
return nil
} // 如果当前节点的键值小于 x,后继在右子树中
if node.key < x {
return findSuccessor(node.right, x, i)
} // 如果当前节点的键值大于 x,后继在左子树中
if node.key > x {
if i > 0 {
i-- // 因为左子树的节点数需要减去
}
return findSuccessor(node.left, x, i)
} // 当前节点的键值等于 x,我们需要找到第 i 个后继
if node.right != nil {
// 右子树中所有节点都是后继
rightCount := countNodes(node.right)
if i <= rightCount {
// 如果 i 小于右子树的节点数,后继在右子树中
return findSuccessor(node.right, x, i)
}
// 如果 i 大于右子树的节点数,后继在左子树中
i -= rightCount + 1 // 减去右子树的节点数和右子节点
} // 如果没有右子树,或者 i 大于右子树的节点数,后继在左子树中
return findSuccessor(node.left, x, i)
} func countNodes(node *Node) int {
if node == nil {
return 0
}
return 1 + countNodes(node.left) + countNodes(node.right)
} func main() {
// ...(省略树的构建代码) // 假设我们有一个顺序统计树 T,并且它的根节点是 T.root
// 假设我们想要找到元素 x 的第 i 个后继
x := 10 // 示例元素
i := 3 // 示例后继位置 successor := findSuccessor(T.root, x, i) if successor != nil {
fmt.Printf("The %d-th successor of key %d is %d\n", i, x, successor.key)
} else {
fmt.Println("No successor found at the specified position.")
}
}

在这个代码中,findSuccessor 函数递归地搜索树以找到元素 x 的第 i 个后继。countNodes 函数用于计算子树中的节点数。如果当前节点的键值小于 x,我们继续在右子树中搜索。如果当前节点的键值大于 x,我们继续在左子树中搜索,并根据需要调整 i 的值。如果当前节点的键值等于 x,我们需要在右子树中找到第 i 个后继,或者在左子树中继续搜索。

请注意,这个代码示例假设树的节点结构中包含了一个 key 字段,用于存储每个节点的键值。在实际的顺序统计树实现中,这个字段用于维护树的有序性。

混元,代码正常运行:

在顺序统计树中,我们可以使用以下方法在 O(lgn) 的时间内确定元素 x 的第 i 个后继:

  1. 首先,从根节点开始遍历顺序统计树,找到包含元素 x 的子树。
  2. 在找到的子树中,找到元素 x 的位置。
  3. 在元素 x 的右子树中,找到第 i 个后继。

以下是使用 Go 语言编写的在 O(lgn) 时间内确定元素 x 的第 i 个后继的函数:

package main

import "fmt"

type Node struct {
key int
left *Node
right *Node
} func findSuccessor(root *Node, target int, i int) (int, bool) {
if root == nil {
return 0, false
} if root.key == target {
return findSuccessorInRightSubtree(root.right, i)
} else if root.key > target {
return findSuccessor(root.left, target, i)
} else {
rank, found := findSuccessor(root.right, target, i)
if found {
return rank, true
}
return findSuccessorInRightSubtree(root.right, i)
}
} func findSuccessorInRightSubtree(root *Node, i int) (int, bool) {
if root == nil {
return 0, false
} if root.left == nil {
if i == 1 {
return root.key, true
} else {
return findSuccessorInRightSubtree(root.right, i-1)
}
} else {
rank, found := findSuccessorInRightSubtree(root.left, i)
if found {
return rank, true
}
if i == 1 {
return root.key, true
} else {
return findSuccessorInRightSubtree(root.right, i-1)
}
}
} func main() {
root := &Node{
key: 10,
left: &Node{
key: 5,
left: &Node{
key: 2,
},
right: &Node{
key: 8,
},
},
right: &Node{
key: 15,
left: &Node{
key: 12,
},
right: &Node{
key: 20,
},
},
} target := 10
i := 2
successor, found := findSuccessor(root, target, i)
if found {
fmt.Printf("元素 %d 的第 %d 个后继是 %d\n", target, i, successor)
} else {
fmt.Printf("元素 %d 的第 %d 个后继不存在\n", target, i)
}
}

在这个示例中,我们定义了一个 Node 结构体来表示顺序统计树的结点。findSuccessor 函数接受一个根结点、一个目标值和一个整数 i 作为参数,然后在顺序统计树中查找具有给定值的结点的第 i 个后继。我们使用递归的方式遍历顺序统计树,根据当前结点的值与目标值的大小关系,向左或向右子树移动。当找到具有给定值的结点时,在其右子树中查找第 i 个后继;如果遍历到叶子结点(NIL)仍未找到目标值,则返回 false。

在 main 函数中,我们创建了一个顺序统计树的示例,并调用 findSuccessor 函数查找值为 10 的结点的第 2 个后继。如果找到了后继,我们打印后继的值;否则,打印未找到后继的消息。

文心一言 VS 讯飞星火 VS chatgpt (188)-- 算法导论14.1 5题的更多相关文章

  1. 【对比】文心一言对飚ChatGPT实操对比体验

    前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...

  2. 【个人首测】百度文心一言 VS ChatGPT GPT-4

    昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...

  3. 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

    "文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...

  4. 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果

    百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...

  5. 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

    目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...

  6. 阿里版ChatGPT:通义千问pk文心一言

    随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...

  7. 基于讯飞语音API应用开发之——离线词典构建

    最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...

  8. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  9. android讯飞语音开发常遇到的问题

    场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...

  10. 初探机器学习之使用讯飞TTS服务实现在线语音合成

    最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...

随机推荐

  1. Spring Boot CMD 运行日志输出中文乱码

    Spring Boot 在Windows CMD 中运行,日志输出中文乱码name="CONSOLE" 设置成 charset utf-8 ,在windows cmd 中运行时,l ...

  2. 多线程 ThreadPoolTaskExecutor 应用

    1.如何判断线程池所有任务是否执行完毕 package com.vipsoft.web; import org.junit.jupiter.api.Test; import org.slf4j.Log ...

  3. Spring Boot Admin 查看 Client 日志

    日志配置如下:如何将不同业务模块产生的日志 分多文件记录 此时 Spring Boot Admin 中看不了 Client 的日志 Logfile ViewerBy default the logfi ...

  4. CNS0项目创建交货单增加销售办事处

    1.业务需求 1.1.销售办事处介绍 销售办事处是指在企业中负责销售活动的区域性单位或部门.在SD模块中,可以表示企业的不同销售地点.销售办公室.分销中心或分公司. 销售办事处扮演着多种角色和职责,例 ...

  5. 深入浅出开源监控系统Prometheus(上)

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/4NC4spF6cEvXuIBKVbIU7A作者:ZhangShuo Prometheus是继 ...

  6. svg组件封装

    svg图标优点 文件体积小,能够被大量的压缩 图片可无限放大而不失真(矢量图的基本特征) 在视网膜显示屏上效果极佳 能够实现互动和滤镜效果 svg图标使用 1.安装相应的npm包: yarn add ...

  7. docker目录迁移流程

    概述 在安装测试最新版本的HOMER7的过程中,docker作为基础工具碰到一些问题,针对问题进行总结. docker的默认工作目录在/var目录,而在我们的环境中,/var目录空间预留不足,随着do ...

  8. BFS(广度优先搜索) poj3278

    ***今天发现一个很有趣的是,这道题应该几个月前就会了,但是一次比赛中总是WA,果断C++提交,然后就过了,然后就很无语了,G++不让过C++能过,今天又交一遍发现把队列定义为全局变量就都能过了,至于 ...

  9. 关闭 cockpit 登陆提示

    sudo rm /etc/issue.d/cockpit.issue sudo rm /etc/motd.d/cockpit

  10. Web API接口返回实现类集合的姿势了解

    大家好,我是沙漠尽头的狼. 一. 问题描述 如下图,定义两个子类Student和Employ,都继承自抽象类PersonBase: public abstract class PersonBase { ...