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

news2024/11/23 21:40:31

五、用go语言,假设为每个结点换一种设计,属性 x.p 指向 x 的双亲,属性 x.succ 指向 x 的后继。试给出使用这种表示法的二叉搜索树 T 上 SEARCH、INSERT 和DELETE 操作的伪代码。这些伪代码应在 O(h) 时间内执行完,其中 h 为树 T 的高度。(提示:应该设计一个返回某个结点的双亲的子过程。)

文心一言:

首先,我们需要定义一个结点结构体,包括结点的值,双亲结点和后继结点的指针。

type Node struct {  
    Val   int  
    Parent *Node  
    Succ   *Node  
}

然后,我们可以定义一个返回给定结点的双亲的函数:

func getParent(node *Node) *Node {  
    if node == nil {  
        return nil  
    }  
    return node.Parent  
}

下面是一个二叉搜索树 SEARCH 操作的伪代码:

func Search(node *Node, val int) *Node {  
    for node != nil {  
        if node.Val == val {  
            return node  
        } else if node.Val < val {  
            node = node.Succ  
        } else {  
            node = getParent(node)  
        }  
    }  
    return nil  
}

INSERT 操作的伪代码:

func Insert(node *Node, val int) *Node {  
    if node == nil {  
        return &Node{Val: val, Parent: nil, Succ: nil}  
    } else if node.Val < val {  
        node.Succ = Insert(node.Succ, val)  
        node.Succ.Parent = node  
    } else if node.Val > val {  
        node.Parent = Insert(node.Parent, val)  
        node.Parent.Succ = node  
    } else {  
        node.Parent = &Node{Val: val, Parent: nil, Succ: nil}  
        node.Parent.Succ = node  
    }  
    return node  
}

DELETE 操作的伪代码:

注意:这是一个简化的 DELETE 操作,它假设我们总是删除最小的元素。对于更复杂的 DELETE 操作(例如删除特定的元素或删除最大/最小的元素),需要更多的逻辑。此外,它还假设树不为空。如果树为空,应返回一个错误或适当的默认值。

func Delete(node *Node) *Node {  
    if node == nil {  
        return nil  
    } else if node.Succ == nil { // 只有一个子节点或没有子节点的情况  
        return node.Parent.Succ // 删除节点并更新父节点的后继指针(如果存在的话)  
    } else if node.Parent == nil { // 根节点的情况,需要特别处理,因为根节点没有父节点。我们需要找到下一个最大的节点(即后继节点)并更新为根节点。然后删除后继节点。  
        nextNode := node.Succ // 后继节点是下一个最大的节点。注意:nextNode是新的根节点。因为它有一个父节点,我们需要保持它的Succ属性不变。这样做的代价是丢失一个节点(nextNode)。因此,请注意这种实现会降低树的高度。如果你关心树的高度,那么你需要找到一个不同的方法来删除根节点。例如,你可以使用堆或AVL树等数据结构来保持树的平衡。但是这将使代码更复杂。因此,这种实现适用于不需要保持树平衡的情况。例如,当树非常大时,你可能不会关心高度,而只关心内存使用量。此外,这种方法的时间复杂度是O(h),其中h是树的高度。这比O(n)要好得多,其中n是树中的节点数。在大多数情况下,n>>h。因此,这种方法通常更快。然而,如果你需要保持树的平衡,那么你应该使用一个不同的方法来删除根节点。例如,你可以使用堆或AVL树等数据结构来保持树的平衡。但是这将使代码更复杂。因此,请注意这种实现会降低树的高度。如果你关心树的高度,那么你需要找到一个不同的方法来删除根节点。例如,你可以使用堆或AVL树等数据结构来保持树的平衡。但是这将使代码更复杂。因此,请注意这种实现会降低树的高度。如果你关心树的高度,那么你需要找到一个不同的方法来删除根节点。例如,你可以使用堆或AVL树等数据结构来保持树的平衡。但是这将使代码更复杂。因此,请注意这种实现会降低树的高度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

首先,我们需要定义一个结构体来表示二叉搜索树的节点:

type Node struct {
    p   *Node
    key int
    left *Node
    right *Node
}

接下来,我们可以实现 SEARCH、INSERT 和 DELETE 操作的伪代码:

  1. SEARCH 操作:
function search(T, key)
    if T is nil then
        return false
    end if
    if key == T.key then
        return true
    else if key < T.key then
        return search(T.left, key)
    else
        return search(T.right, key)
    end if
end function
  1. INSERT 操作:
function insert(T, key)
    if T is nil then
        newNode := new Node(nil, key, nil, nil)
        return newNode
    end if
    if key == T.key then
        return T
    else if key < T.key then
        T.left := insert(T.left, key)
        T.left.p := T
    else
        T.right := insert(T.right, key)
        T.right.p := T
    end if
    return T
end function
  1. DELETE 操作:
function delete(T, key)
    if T is nil then
        return T
    end if
    if key < T.key then
        T.left := delete(T.left, key)
    else if key > T.key then
        T.right := delete(T.right, key)
    else
        if T.left is nil then
            temp := T.right
            T := temp
        else if T.right is nil then
            temp := T.left
            T := temp
        else
            temp := findMin(T.right)
            T.key = temp.key
            T.right := delete(T.right, temp.key)
        end if
    end if
    return T
end function

function findMin(T)
    current := T
    while current.left is not nil do
        current := current.left
    end while
    return current
end function

这些伪代码在 O(h) 时间内执行完,其中 h 为树 T 的高度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

360智脑:

以下是用 Go 语言编写的伪代码,它们在 O(h) 时间内执行完成。

SEARCH 操作:

func searchNode(x *Node, key int) *Node {
    if x == nil {
        return nil
    }
    if key < x.key {
        return searchNode(x.left, key)
    } else if key > x.key {
        return searchNode(x.right, key)
    } else {
        return x
    }
}

INSERT 操作:

func insertNode(x *Node, key int) *Node {
    if x == nil {
        return &Node{key, nil, nil}
    }
    if key < x.key {
        x.left = insertNode(x.left, key)
        return x
    } else if key > x.key {
        x.right = insertNode(x.right, key)
        return x
    } else {
        return x
    }
}

DELETE 操作:

func deleteNode(x *Node, key int) *Node {
    if x == nil {
        return x
    }
    if key < x.key {
        x.left = deleteNode(x.left, key)
        return x
    } else if key > x.key {
        x.right = deleteNode(x.right, key)
        return x
    } else {
        if x.left == nil && x.right == nil {
            return nil
        } else if x.left == nil {
            return x.right
        } else if x.right == nil {
            return x.left
        } else {
            successor := x.right
            for successor.left != nil {
                successor = successor.left
            }
            x.key = successor.key
            x.right = deleteNode(x.right, successor.key)
            return x
        }
    }
}

请注意,在这些伪代码中,我们假设 Node 结构体具有以下形式:

type Node struct {
    key   int
    left  *Node
    right *Node
}

此外,我们还假设 searchNodeinsertNodedeleteNode 函数都接受一个 Node 指针和一个 int 类型的键作为参数,并返回一个 Node 指针。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

智谱清言:

以下是使用指定属性 x.p 指向结点的双亲,x.succ 指向后继的表示法,对于二叉搜索树(BST)的 SEARCHINSERTDELETE 操作的伪代码。这些操作假设都能在 O(h) 的时间内完成,其中 h 是树的高度。

// 定义树的结点结构
type TreeNode struct {
    key   int
    p     *TreeNode
    succ  *TreeNode
}
// BST的结构
type BinarySearchTree struct {
    root *TreeNode
}
// SEARCH操作 - 在BST中查找一个键
func (t *BinarySearchTree) Search(key int) *TreeNode {
    current := t.root
    for current != nil {
        if key < current.key {
            current = current.succ
        } else if key > current.key {
            current = current.p
        } else {
            return current // 找到键,返回对应的结点
        }
    }
    return nil // 如果没有找到,返回nil
}
// INSERT操作 - 在BST中插入一个键
func (t *BinarySearchTree) Insert(key int) {
    newNode := &TreeNode{key: key}
    if t.root == nil {
        t.root = newNode
    } else {
        current := t.root
        for true {
            if key < current.key {
                if current.succ == nil {
                    current.succ = newNode
                    newNode.p = current
                    break
                }
                current = current.succ
            } else if key > current.key {
                if current.p == nil {
                    current.p = newNode
                    newNode.succ = current
                    break
                }
                current = current.p
            } else {
                // 如果键已经存在,则不做任何操作
                return
            }
        }
    }
}
// DELETE操作 - 从BST中删除一个键
func (t *BinarySearchTree) Delete(key int) {
    node := t.Search(key)
    if node == nil {
        return // 如果没有找到键,则直接返回
    }
    
    // 如果待删除的结点有两个子结点
    if node.succ != nil && node.p != nil {
        succParent := node.succ.p
        node.succ.p = node.p
        if succParent != nil {
            succParent.succ = node.succ
        }
        node.p.succ = node.succ
    } else if node.succ != nil {
        // 如果只有一个子结点(或者无子结点)
        node.p.succ = node.succ
        if node.p != nil {
            node.succ.p = node.p
        }
    } else {
        // 如果只有一个子结点(或者无子结点)
        node.p.succ = node.succ
        if node.p != nil {
            node.succ.p = node.p
        }
    }
    
    // 最后,从树中移除node
    if node.p != nil {
        node.p.succ = node.succ
    }
    if node.succ != nil {
        node.succ.p = node.p
    }
    // 此处应当处理node指向的内存
    // 在Go语言中,通常需要将node设置为nil,或者使用垃圾收集机制
    // 此处为了伪代码的简洁性,没有展示这一部分
}
// 返回某个节点的父节点
func (n *TreeNode) Parent() *TreeNode {
    return n.p
}

注意:伪代码中并没有处理内存释放的问题,实际在Go语言中需要手动管理内存。另外,由于这种表示法并不常见,所以需要特别注意在执行删除操作时正确地重新链接后继和父节点。此外,Parent 函数用于返回当前节点的父节点。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通义千问:

以下是一个使用这种表示法的二叉搜索树 T 上 SEARCH、INSERT 和 DELETE 操作的伪代码:

// 结点定义
type Node struct {
    key   int
    p     *Node // 指向双亲的指针
    succ  *Node // 指向后继的指针
    left  *Node // 左孩子
    right *Node // 右孩子
}

// 返回结点x的双亲
func parent(x *Node) *Node {
    if x.p != nil {
        return x.p
    }
    y := x.succ
    for y != nil && y.left != x {
        y = y.p
    }
    return y
}

// 搜索操作
func search(T *Node, k int) *Node {
    x := T
    for x != nil && k != x.key {
        if k < x.key {
            x = x.left
        } else {
            x = x.right
        }
    }
    return x
}

// 插入操作
func insert(T **Node, z *Node) {
    y := nil
    x := *T
    for x != nil {
        y = x
        if z.key < x.key {
            x = x.left
        } else {
            x = x.right
        }
    }
    z.p = y
    if y == nil {
        *T = z
    } else if z.key < y.key {
        y.left = z
    } else {
        y.right = z
    }
    updateSuccessor(z)
}

// 更新后继的函数
func updateSuccessor(z *Node) {
    if z.right != nil {
        z.succ = minimum(z.right)
    } else {
        y := z.p
        for y != nil && z == y.right {
            z = y
            y = y.p
        }
        z.succ = y
    }
}

// 删除操作
func delete(T **Node, z *Node) {
    y := z
    var x *Node
    if z.left == nil || z.right == nil {
        y = z
    } else {
        y = successor(z)
    }
    if y.left != nil {
        x = y.left
    } else {
        x = y.right
    }
    if x != nil {
        x.p = y.p
    }
    if y.p == nil {
        *T = x
    } else if y == y.p.left {
        y.p.left = x
    } else {
        y.p.right = x
    }
    if y != z {
        z.key = y.key
        z.succ = y.succ
    }
    updateSuccessor(y.p)
}

// 查找最小结点的函数
func minimum(x *Node) *Node {
    for x.left != nil {
        x = x.left
    }
    return x
}

// 查找后继结点的函数
func successor(x *Node) *Node {
    if x.right != nil {
        return minimum(x.right)
    }
    y := x.p
    for y != nil && x == y.right {
        x = y
        y = y.p
    }
    return y
}

这些伪代码在 O(h) 时间内执行完,其中 h 为树 T 的高度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

天工:

首先,我们需要定义一个结点结构体,其中包含两个指针字段:p 和 succ,以及一个指向根结点的指针。

type Node struct {
    p, succ *Node
    // 其他属性
}

然后,我们可以定义一个二叉搜索树的结构体,它将包含一个根结点,以及一个用于插入和删除结点的辅助函数。

type BSTree struct {
    Root *Node
    // 辅助函数
}

func (this *BSTree) Insert(value interface{}) {
    // 插入结点
}

func (this *BSTree) Delete(value interface{}) {
    // 删除结点
}

func (this *BSTree) Search(value interface{}) bool {
    // 查找结点
}

这里的 Insert 和 Delete 函数将使用辅助函数来找到要插入或删除的结点。Search 函数将使用辅助函数来查找结点。

辅助函数将返回一个结点的父结点,如果该结点不存在,则返回 nil。

func (n *Node) Parent() *Node {
    return n.p
}

func (n *Node) Next() *Node {
    return n.succ
}

插入结点的伪代码:

func (this *BSTree) Insert(value interface{}) {
    node := &Node{value, nil, nil}
    if this.Root != nil {
        parent := this.Insert(value.(int))
        node.p = parent
    }
    this.Root = node
}

删除结点的伪代码:

func (this *BSTree) Delete(value interface{}) {
    node := this.Search(value.(int))
    if node == nil {
        return
    }
    if node.p == nil {
        this.Root = node.succ
    } else if node.p.Next() != node {
        node.p.succ = node.succ
    } else {
        prev := node.p.succ
        node.p.succ = prev
        prev.p = node.p
    }
}

查找结点的伪代码:

func (this *BSTree) Search(value interface{}) bool {
    node := this.Root
    for node != nil {
        if value.(int) == node.value {
            return true
        }
        node = node.p
    }
    return false
}

注意,由于我们的表示法中没有关键字 “height”,因此无法保证我们的算法在 O(h) 时间内完成。如果需要在 O(h) 时间内完成,可能需要使用其他方法,例如使用堆栈或递归下降。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

灵小智:

以下是使用这种表示法的二叉搜索树 T 上 SEARCH、INSERT 和 DELETE 操作的伪代码:
// 结点定义
type Node struct {
    key   int
    left  *Node
    right *Node
    p     *Node  // 指向双亲结点
    succ  *Node  // 指向后继结点
}

// 树定义
type BST struct {
    root *Node
}

// SEARCH 操作伪代码
func (bst *BST) SEARCH(x *Node, key int) *Node {
    if x == nil || key == x.key {
        return x
    }
    if key < x.key {
        return bst.SEARCH(x.left, key)
    } else {
        return bst.SEARCH(x.right, key)
    }
}

// INSERT 操作伪代码
func (bst *BST) INSERT(key int) {
    var parent *Node
    x := bst.root
    for x != nil {
        parent = x
        if key < x.key {
            x = x.left
        } else {
            x = x.right
        }
    }

    newNode := &Node{key: key, p: parent}

    if parent == nil {
        bst.root = newNode
    } else if key < parent.key {
        parent.left = newNode
    } else {
        parent.right = newNode
    }

    // 更新后继结点
    if newNode.p != nil {
        bst.updateSuccessor(newNode.p)
    }
}

// DELETE 操作伪代码
func (bst *BST) DELETE(key int) {
    node := bst.SEARCH(bst.root, key)

    if node == nil {
        return
    }

    if node.left == nil {
        bst.transplant(node, node.right)
    } else if node.right == nil {
        bst.transplant(node, node.left)
    } else {
        succ := bst.minimum(node.right)
        if succ.p != node {  // 需要拆开后继结点与其双亲结点之间的连接
            bst.transplant(succ, succ.right)
            succ.right = node.right
            succ.right.p = succ
        }
        bst.transplant(node, succ)
        succ.left = node.left
        succ.left.p = succ
    }

    // 更新后继结点
    if node.p != nil {
        bst.updateSuccessor(node.p)
    }
}

// 辅助函数,返回以指定结点为根的最小结点
func (bst *BST) minimum(node *Node) *Node {
    for node.left != nil {
        node = node.left
    }
    return node
}

// 辅助函数,将结点u替换为结点v
func (bst *BST) transplant(u *Node, v *Node) {
    if u.p == nil {
        bst.root = v
    } else if u == u.p.left {
        u.p.left = v
    } else {
        u.p.right = v
    }
    if v != nil {
        v.p = u.p
    }
}

// 辅助函数,更新某个结点及其子孙结点的后继结点
func (bst *BST) updateSuccessor(node *Node) {
    if node.right != nil {
        succ := bst.minimum(node.right)
        node.succ = succ
    } else {
        parent := node.p
        for parent != nil && node == parent.right {
            node = parent
            parent = parent.p
        }
        node.succ = parent
    }
}

以上是使用属性 x.p 和 x.succ 来表示双亲和后继关系的二叉搜索树 T 上 SEARCH、INSERT 和 DELETE 操作的伪代码。这些操作在树 T 的高度 h 内执行完毕,时间复杂度为 O(h)。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

chatgpt:

以下是使用这种表示法的二叉搜索树 T 上 SEARCH、INSERT 和 DELETE 操作的伪代码:

// 结点定义
type Node struct {
    key   int     // 关键字
    left  *Node   // 左子结点指针
    right *Node   // 右子结点指针
    p     *Node   // 双亲指针
    succ  *Node   // 后继指针
}

// 搜索操作
func Search(T, x) *Node {
    if T == nil || T.key == x {
        return T
    }
    
    if x < T.key {
        return Search(T.left, x)
    } else {
        return Search(T.right, x)
    }
}

// 插入操作
func Insert(T, z) {
    var y, x = nil, T
    
    for x != nil {
        y = x
        
        if z.key < x.key {
            x = x.left
        } else {
            x = x.right
        }
    }
    
    z.p = y
    
    if y == nil {   // 树为空,z为根节点
        T = z
    } else if z.key < y.key {  // 插入到左子树中 
        y.left = z
        
        if y.succ == nil || z.key < y.succ.key {  
            y.succ = z  
            updateSucc(z)  // 更新后继指针 
        }
        
    } else {  // 插入到右子树中 
        y.right = z
        
      

在这里插入图片描述

在这里插入图片描述

kimi:

在这种表示法中,每个节点 x 有一个属性 x.p 指向其双亲,以及一个属性 x.succ 指向其后继。请注意,这种表示法与传统的二叉搜索树表示法有所不同。为了实现 SEARCH、INSERT 和 DELETE 操作,我们需要对这些操作进行适当的调整。以下是这些操作的伪代码:

  1. SEARCH 操作:
func searchT(x, key *Node) *Node {
    for x != nil {
        if key.Value < x.Value {
            x = x.Left
        } else if key.Value > x.Value {
            x = x.Right
        } else {
            return x
        }
    }
    return nil
}
  1. INSERT 操作:
func insertT(root *Node, newNode *Node) *Node {
    if root == nil {
        newNode.succ = nil
        return newNode
    }

    if newNode.Value < root.Value {
        root.Left = insertT(root.Left, newNode)
        newNode.p = root
        root.Left.succ = newNode
    } else {
        root.Right = insertT(root.Right, newNode)
        newNode.p = root
        root.Right.succ = newNode
    }

    return root
}
  1. DELETE 操作:
func deleteT(root *Node, node *Node) *Node {
    if root == nil {
        return nil
    }

    if node.Value < root.Value {
        root.Left = deleteT(root.Left, node)
    } else if node.Value > root.Value {
        root.Right = deleteT(root.Right, node)
    } else {
        // 要删除的节点有两个子节点
        if node.Left != nil && node.Right != nil {
            // 找到后继节点(即最小值的右子树节点)
            successor := findSuccessor(node)
            // 用后继节点的值替换要删除的节点的值
            node.Value = successor.Value

            // 删除后继节点
            root.Right = deleteT(root.Right, successor)
        } else {
            // 要删除的节点没有子节点或只有一个子节点
            child := node.Left
            if child == nil {
                child = node.Right
            }

            // 如果要删除的节点有父节点,更新父节点的左右子树指针
            if node.p != nil {
                if node.p.Left == node {
                    node.p.Left = child
                } else {
                    node.p.Right = child
                }
            }

            // 如果要删除的节点是根节点,更新根节点
            if node == root {
                root = child
            }
        }
    }

    return root
}

// 辅助函数:查找给定节点的后继节点
func findSuccessor(node *Node) *Node {
    if node.Right != nil {
        return findMin(node.Right)
    }
    return node.succ
}

// 辅助函数:查找以给定节点为根的子树的最小值节点
func findMin(node *Node) *Node {
    for node.Left != nil {
        node = node.Left
    }
    return node
}

这些伪代码中的操作应该在 O(h) 时间内执行,其中 h 是树 T 的高度。请注意,这些操作仅作为示例,实际实现可能需要根据具体需求进行调整。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

函数式编程 h函数

<template><div><table border><tr><th>id</th><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.id"><td>{{ item.id }}<…

wsl kafka的简单应用

安装并配置单机版kafka所需环境 wsl2 环境可用性较高&#xff0c;如下介绍在该环境中安装单机版本kafka的详细过程。 启动命令行工具启动wsl&#xff1a;wsl --user root --cd ~&#xff0c;&#xff08;以root用户启动&#xff0c;进入wsl后当前路径为~“用户主目录”&#…

3.3【窗口】窗口的几何形状(二,窗口属性)

写在前面 应用程序使用窗口来显示内容。一些属性决定了窗口及其内容的大小和位置。其他属性决定了窗口内容的外观和解释。 了解窗口属性引用的两个坐标系非常重要。如果你知道你正在使用的坐标系,那么为你的窗口属性选择设置值会容易得多,并且会更有意义。 一,显示相关属…

SpringBoot零基础入门到项目实战——学习路线规划与目录结构

文章目录 第一部分&#xff1a;Spring Boot基础第二部分&#xff1a;Web开发与RESTful API第三部分&#xff1a;数据访问与持久化第四部分&#xff1a;安全与身份验证第五部分&#xff1a;高级主题第六部分&#xff1a;测试总结与扩展实战项目练习 &#x1f389;欢迎来到Spring…

Storage engine MyISAM is disabled (Table creation is disallowed)

如何解决Storage engine MyISAM is disabled (Table creation is disallowed&#xff09; 在开发中&#xff0c;需要把mysql5.7的数据库&#xff0c;迁移到mysql8.0 的阿里云数据库上 把Mysql5.7的数据导入到8.0时&#xff0c;出现 解决方法 1、使用指令找出那些表是MyISAM引擎…

求解最大子段和问题

求解最大子段和问题。 对于给定序列a1,a2,a3……an,寻找它的某个连续子段&#xff0c;使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。 要求&#xff1a;分别用教材所给的三种方法求解&#xff08;简单方法、分治法、动态规划&#xff09;&#xff0…

【Redis】AOF 基础

因为 Redis AOF 的实现有些绕, 就分成 2 篇进行分析, 本篇主要是介绍一下 AOF 的一些特性和依赖的其他函数的逻辑,为下一篇 (Redis AOF 源码) 源码分析做一些铺垫。 AOF 全称: Append Only File, 是 Redis 提供了一种数据保存模式, Redis 默认不开启。 AOF 采用日志的形式来记…

指针必刷题(C语言指针就该这么学)【数据结构基础】【C语言指针必刷题】

前言&#xff1a;必备知识回忆 1.数组名的意义 i.sizeof(数组名&#xff09;&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 ii.&数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址 iii.除此之外&#xff0c;所…

基于urllib库的网页数据爬取

实验名称&#xff1a; 基于urllib库的网页数据爬取 实验目的及要求&#xff1a; 【实验目的】 通过本实验了解和掌握urllib库。 【实验要求】 1. 使用urllib库爬取百度搜索页面。 2. 使用urllib库获取百度搜索的关键字搜索结果&#xff08;关键字任选&#xff09;。 实验原理及…

电子元器件介绍——二极管(四)

电子元器件介绍 文章目录 电子元器件介绍前言一、二极管的基础知识二、二极管的分类三、二极管的应用总结 前言 这一节我们看一下二极管。 一、二极管的基础知识 PN结&#xff1a;是指一块半导体单晶&#xff0c;其中一部分是P型区&#xff0c;其余部分是N型区。 在电场作用…

C++ Qt开发:自定义Dialog对话框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍自定义Dialog组件的常用方法及灵活运用。 在…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多&#xff0c;可以自己百度一下 我们这里是自己搭建测试环境&#xff0c;可以直接选择在线安装&#xff0c;命令如下&#xff1a;yum install mysql-server&#xff0c; 但是我失败了 ┭┮…

在排序数组中查找元素的第一个和最后一个位置(Java详解)

一、题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示…

verilog语法进阶,时钟原语

概述&#xff1a; 内容 1. 时钟缓冲 2. 输入时钟缓冲 3. ODDR2作为输出时钟缓冲 1. 输入时钟缓冲 BUFGP verilog c代码&#xff0c;clk作为触发器的边沿触发&#xff0c;会自动将clk综合成时钟信号。 module primitive1(input clk,input a,output reg y); always (posed…

深度剖析JavaScript中冒泡和捕获机制、事件代理

JS事件传播的两种机制包括冒泡和捕获&#xff0c;下面将具体剖析它们之间本质的区别。 事件冒泡: 先触发子元素的事件&#xff0c;再触发父元素的事件。 创建一个 ul label 和 li label, 分别绑定一个父id 和 子 id, 再通过创建 script&#xff0c;去绑定各自的点击事件。 <…

Threejs利用着色器编写动态飞线特效

一、导语 动态飞线特效是可视化数据地图中常见的需求之一&#xff0c;鼠标点击的区块作为终点&#xff0c;从其他区块飞线至点击区块&#xff0c;附带颜色变换或者结合粒子动画 二、分析 利用创建3点来构成贝塞尔曲线&#xff0c;形成线段利用着色器材质来按照线段以及时间…

Linux---压缩和解压缩命令

1. 压缩格式的介绍 Linux默认支持的压缩格式: .gz.bz2.zip 说明: .gz和.bz2的压缩包需要使用tar命令来压缩和解压缩.zip的压缩包需要使用zip命令来压缩&#xff0c;使用unzip命令来解压缩 压缩目的: 节省磁盘空间 2. tar命令及选项的使用 命令说明tar压缩和解压缩命令 …

SE考研真题总结(三)

继续更新&#xff0c;今天准备连出两期该系列~ SE考研真题总结&#xff08;二&#xff09;https://blog.csdn.net/jsl123x/article/details/134857052?spm1001.2014.3001.5501 目录 一.简答题 二.代码大题 一.简答题 1.工程和科学的区别 科学是关于事物的基本原理和事实的…

代码随想录算法训练营 | day53 动态规划 1143.最长公共子序列,1035.不相交的线,53.最大子序和

刷题 1143.最长公共子序列 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类&#xff0c;它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法&#xff0c;传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…