算法入门篇(五)之 树的应用

目录

1.树和二叉树

1.1树(Tree)

1.1.1 特点

1.1.2 使用场景

1.1.3 示例

1.2二叉树(Binary Tree)

1.2.1 特点

1.2.2 使用场景

1.2.3 示例

2.二叉树遍历

2.1 先序遍历、中序遍历、后序遍历、层次遍历

2.1.1 先序遍历(Preorder Traversal)

2. 1.2 中序遍历(Inorder Traversal)

2.1.3 后序遍历(Postorder Traversal)

2.1.4 层次遍历(Level-Order Traversal)

2.2遍历序列还原树

2.2.1 介绍

2.2.2 思路

2.2.3 示例

2.3 P1305、UVA536、UVA548

2.3.1 P1305

2.3.2 UVA536

2.3.3 UVA548

3.哈夫曼树

3.1 哈夫曼编码

3.1.1 定义与背景

3.1.2 基本原理

3.1.3 编码过程

3.1.4 解码过程

3.1.5 应用场景

3.1.6 总结

3.2 可变基哈夫曼编码

3.2.1 定义与特点

3.2.2 构建过程

3.2.3 编码与解码

3.2.4 应用场景

3.2.5 注意事项

3.3 POJ3253、POJ1521、UVA12676、UVA240

3.3.1 POJ 3253: Fence Repair (Planks)

3.3.2 POJ 1521: Pie Progress

3.3.3 UVA 12676: "Grocery Store"

3.3.4 UVA 240: "Returning Home"

 


1.树和二叉树

树(Tree)和二叉树(Binary Tree)是计算机科学中非常基础且重要的数据结构。它们用于存储和操作数据项,以反映层级或分支关系。下面,我将对这两种数据结构进行详细说明,并在需要时提供C#语言的简单实现示例。

1.1树(Tree)

树是一种递归定义的数据结构,包含一个根节点和零个或多个子树,每个子树本身也是一棵树。树中的每个节点都包含数据部分和指向其子节点的链接(也称为边或分支)。

1.1.1 特点

  • 每个节点可以有零个或多个子节点。

  • 没有父节点的节点称为根节点。

  • 每个非根节点有且仅有一个父节点。

  • 除了根节点外,每个节点都有唯一的路径通向根节点。

  • 如果存在一条从节点P到节点Q的路径,且P和Q不相同,则称P是Q的祖先,Q是P的后代。

1.1.2 使用场景

  • 文件系统:文件和目录的层级关系可以用树来表示。

  • 组织结构图:公司的部门、职位等层级关系。

  • 决策树:在机器学习和数据挖掘中用于分类和决策。

  • 表达式树:在编译器设计中用于表示数学表达式。

1.1.3 示例

由于树的实现依赖于具体的应用场景,这里不直接给出具体的C#代码,但你可以通过定义节点类(包含数据和子节点列表)来开始实现一个基本的树结构。

Python代码示例:

class TreeNode:def __init__(self, value):self.value = valueself.children = []def add_child(self, child_node):self.children.append(child_node)# 使用示例
root = TreeNode("root")
child1 = TreeNode("child1")
child2 = TreeNode("child2")
root.add_child(child1)
root.add_child(child2)# 添加子节点的子节点
child1_1 = TreeNode("child1_1")
child1.add_child(child1_1)# 打印树(简单遍历)
def print_tree(node, level=0):print('  ' * level + '->', node.value)for child in node.children:print_tree(child, level + 1)print_tree(root)

1.2二叉树(Binary Tree)

二叉树是树的一种特殊形式,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。

1.2.1 特点

  • 每个节点最多有两个子节点。

  • 节点的子节点有左右之分,且顺序不能颠倒。

  • 没有子节点的节点称为叶子节点。

  • 只有一个子节点的节点称为单支节点。

  • 深度(Depth)为根节点到最远叶子节点的最长路径上的节点数。

  • 高度(Height)为从该节点到最远叶子节点的最长路径上的边数。

1.2.2 使用场景

  • 搜索树:如二叉搜索树(BST),用于高效地查找、插入和删除数据。

  • 堆:一种特殊的完全二叉树,用于实现优先队列。

  • 表达式树:在编译器中用于解析和计算表达式的值。

1.2.3 示例

C# 代码示例:

public class TreeNode
{public int Val { get; set; }public TreeNode Left { get; set; }public TreeNode Right { get; set; }public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null){Val = val;Left = left;Right = right;}
}// 使用TreeNode类可以构建二叉树,例如:
TreeNode root = new TreeNode(1);
root.Left = new TreeNode(2);
root.Right = new TreeNode(3);
root.Left.Left = new TreeNode(4);
root.Left.Right = new TreeNode(5);

这个示例中,我们定义了一个TreeNode类来表示二叉树的节点,并通过这个类构建了一个简单的二叉树。每个节点包含一个整数值Val和两个指向其子节点的引用LeftRight。通过这种方式,我们可以递归地构建更复杂的二叉树结构。

Python代码示例(二叉搜索树):

class BinaryTreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef insert(self, value):if value < self.value:if self.left is None:self.left = BinaryTreeNode(value)else:self.left.insert(value)else:if self.right is None:self.right = BinaryTreeNode(value)else:self.right.insert(value)# 使用示例
bst = BinaryTreeNode(10)
bst.insert(5)
bst.insert(15)
bst.insert(0)
bst.insert(7)# 简单的中序遍历打印BST
def inorder_traversal(node):if node:inorder_traversal(node.left)print(node.value, end=' ')inorder_traversal(node.right)inorder_traversal(bst)  # 输出应该是按升序排列的节点值

2.二叉树遍历

2.1 先序遍历、中序遍历、后序遍历、层次遍历

在树形结构中,尤其是二叉树,有四种常见的遍历方式:先序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)、后序遍历(Postorder Traversal)和层次遍历(Level-Order Traversal,也称为广度优先遍历Breadth-First Search, BFS)。下面我将分别介绍这四种遍历方式,并给出在Python中的示例代码。

2.1.1 先序遍历(Preorder Traversal)

先序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。

Python代码示例:

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Nonedef preorderTraversal(root):if root is None:return []result = []stack = [root]while stack:node = stack.pop()result.append(node.val)if node.right:stack.append(node.right)if node.left:stack.append(node.left)return result

2. 1.2 中序遍历(Inorder Traversal)

中序遍历首先遍历左子树,然后访问根节点,最后遍历右子树。

Python 示例代码

def inorderTraversal(root):if root is None:return []result = []stack = []node = rootwhile stack or node:while node:stack.append(node)node = node.leftnode = stack.pop()result.append(node.val)node = node.rightreturn result

2.1.3 后序遍历(Postorder Traversal)

后序遍历首先遍历左子树,然后遍历右子树,最后访问根节点。

Python 示例代码(使用两个栈):

def postorderTraversal(root):if root is None:return []result, stack, output = [], [root], []while stack:node = stack.pop()output.append(node)if node.left:stack.append(node.left)if node.right:stack.append(node.right)while output:result.append(output.pop().val)return result

2.1.4 层次遍历(Level-Order Traversal)

层次遍历从根节点开始,从上到下,从左到右遍历树的每个节点。

Python 示例代码

from collections import dequedef levelOrderTraversal(root):if root is None:return []queue = deque([root])result = []while queue:level_size = len(queue)level_nodes = []for _ in range(level_size):node = queue.popleft()level_nodes.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)result.append(level_nodes)return result

2.2遍历序列还原树

遍历序列还原树是一个在给定树的遍历序列(通常是先序遍历、中序遍历或后序遍历)的基础上,尝试重建原始树结构的过程。由于后序遍历单独使用无法唯一确定一棵二叉树(除非树的所有节点值都是唯一的),这里我们主要讨论使用先序遍历和中序遍历序列来还原二叉树的情况。

2.2.1 介绍

  • 先序遍历:首先访问根节点,然后遍历左子树,最后遍历右子树。

  • 中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树。

由于先序遍历的第一个元素总是根节点,而中序遍历将左子树和右子树分开,我们可以利用这一特性来递归地重建二叉树。

2.2.2 思路

  1. 从先序遍历序列中取出第一个元素作为根节点。

  2. 在中序遍历序列中找到这个根节点,它将中序遍历序列分为左子树和右子树两部分。

  3. 递归地对左子树和右子树的中序遍历和先序遍历序列进行上述操作。

2.2.3 示例

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef buildTree(preorder, inorder):if not preorder or not inorder:return None# 先序遍历的第一个元素为根节点root_val = preorder[0]root = TreeNode(root_val)# 在中序遍历中找到根节点的索引mid_index = inorder.index(root_val)# 切割中序遍历数组,得到左子树和右子树的中序遍历inorder_left = inorder[:mid_index]inorder_right = inorder[mid_index+1:]# 根据中序遍历的切割点,确定先序遍历中左子树和右子树的节点数# 进而切割先序遍历数组preorder_left = preorder[1:mid_index+1]preorder_right = preorder[mid_index+1:]# 递归构建左子树和右子树root.left = buildTree(preorder_left, inorder_left)root.right = buildTree(preorder_right, inorder_right)return root# 示例
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
root = buildTree(preorder, inorder)# 遍历验证(例如,中序遍历)
def inorderTraversal(root):if root:inorderTraversal(root.left)print(root.val, end=' ')inorderTraversal(root.right)inorderTraversal(root)  # 输出应该是 9 3 15 20 7

注意:这个代码示例中,我们假设树中不存在重复的元素,因为如果有重复元素,中序遍历的切割点可能不是唯一的,这将导致无法唯一确定一棵二叉树。如果树中允许有重复元素,那么可能需要额外的信息(如节点索引、节点父子关系等)来唯一确定树的结构。

此外,这段代码使用了递归方法来构建树,它可能不适用于非常大的树,因为递归会占用大量的调用栈空间。对于大型数据集,可能需要考虑使用迭代方法或优化递归算法。

2.3 P1305、UVA536、UVA548

P1305、UVA536、和UVA548 是三个不同的编程竞赛或在线评测系统中的题目编号,它们分别来自不同的平台或竞赛。根据题目编号和常见的编程竞赛题目类型给出一些一般性的建议和解题思路。

2.3.1 P1305

题目可能类型:这通常是一个来自中国某在线评测系统(如洛谷)的题目编号。由于没有具体的题目名称或描述,我们无法确定具体的题目类型,但可能是数据结构、算法设计、字符串处理、图论等常见的编程竞赛题目。

解题思路

  • 首先,查看题目描述,理解题目要求和输入输出格式。

  • 分析题目所给数据规模,选择合适的算法和数据结构。

  • 设计算法,可能需要使用到递归、分治、贪心、动态规划、搜索(DFS/BFS)等策略。

  • 编写代码,注意边界条件和特殊情况的处理。

  • 调试并测试代码,确保在各种情况下都能得到正确的结果。

2.3.2 UVA536

题目类型:UVA(University of Valladolid Algorithm Repository)是一个在线的编程竞赛和算法练习平台,UVA536可能是一个具体的题目编号。由于UVA上的题目类型非常广泛,从简单的编程练习到复杂的算法设计都有,所以无法直接确定UVA536的具体类型。

解题思路

  • 类似于P1305,首先查看题目描述,理解题目要求和输入输出格式。

  • 分析题目难度和数据规模,选择合适的算法和数据结构。

  • 注意UVA平台可能有一些特殊的输入输出格式要求,如多组输入、特定格式的输出等。

  • 编写代码并调试,确保在各种情况下都能通过UVA的评测系统。

2.3.3 UVA548

题目类型:同样,UVA548也是UVA平台上的一个题目编号,其类型和难度无法直接确定。

解题思路

  • 遵循与UVA536相同的解题步骤。

  • 由于UVA平台上的题目可能较为经典或具有挑战性,因此可能需要花费更多的时间和精力来分析和解决问题。

  • 利用在线资源,如论坛、博客等,查找其他人的解题思路和代码实现,这有助于拓宽思路并快速找到问题的解决方案。

总之,对于这三个题目编号,最重要的是仔细阅读题目描述,理解题目要求,并根据题目类型和难度选择合适的算法和数据结构来解决问题。同时,注意调试和测试代码,确保在各种情况下都能得到正确的结果。

3.哈夫曼树

3.1 哈夫曼编码

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种重要的编码方式,尤其在数据压缩领域有着广泛的应用。以下是对哈夫曼编码的详细介绍:

3.1.1 定义与背景

  • 定义:哈夫曼编码是一种可变字长编码(VLC),它根据字符出现的概率来构造异字头的平均长度最短的码字,从而实现对数据的有效压缩。

  • 背景:该编码方法由David A. Huffman在1952年提出,基于香农(Shannon)在1948年和范若(Fano)在1949年阐述的编码思想。

3.1.2 基本原理

  • 构建哈夫曼树:哈夫曼编码的核心是构建一棵哈夫曼树(也称为最优二叉树)。在哈夫曼树中,出现频率越高的字符离根节点越近,出现频率越低的字符则离根节点越远。

  • 编码规则:通过自底向上遍历哈夫曼树,可以得到每个字符对应的哈夫曼编码。通常,左子树编码为0,右子树编码为1。

3.1.3 编码过程

  1. 统计字符频率:首先,对需要编码的数据进行扫描,统计每个字符出现的频率。

  2. 构建哈夫曼树:根据字符频率构建哈夫曼树,具体过程包括多次合并频率最小的两个节点,并将它们作为新节点的子节点,新节点的频率为两个子节点频率之和。

  3. 生成编码表:遍历哈夫曼树,为每个字符生成对应的哈夫曼编码,并存储在编码表中。

  4. 数据编码:使用编码表对原始数据进行编码,得到压缩后的数据。

3.1.4 解码过程

  • 解码是编码的逆过程,通过哈夫曼树和编码表可以恢复出原始数据。

  • 从压缩数据的第一个位开始,根据哈夫曼树的路径(0或1)找到对应的字符,直到遍历完所有数据。

3.1.5 应用场景

  • 数据压缩:哈夫曼编码被广泛用于无损数据压缩领域,特别是在图像、音频和视频压缩中。通过变长编码,出现频率高的符号被赋予较短的编码,从而减少了存储所需的比特数。

  • 通信系统:在通信领域,使用哈夫曼编码可以减少传输数据的位数,降低传输成本。这在无线通信、互联网通信等场景中尤为重要。

  • 文件存储:哈夫曼编码也常用于文件存储中,以减小文件的体积,提高存储效率。

  • 数据加密:在一些加密算法中,哈夫曼编码可用于将加密后的数据进行压缩,从而提高数据传输的效率。

  • 字典压缩:对于字典等需要频繁查询和存储的数据结构,哈夫曼编码可以实现高效的压缩和检索。

3.1.6 总结

哈夫曼编码是一种基于字符出现频率的编码方式,通过构建哈夫曼树并生成编码表来实现数据的压缩和解压缩。该编码方式在数据压缩、通信系统、文件存储等领域具有广泛的应用价值。

3.2 可变基哈夫曼编码

可变基哈夫曼编码(Variable Radix Huffman Encoding)是哈夫曼编码的一种扩展形式,它在传统的二叉树基础上,将二叉树扩展为R叉树(R > 2),从而提供了更多的灵活性和编码效率。以下是对可变基哈夫曼编码的详细解释:

3.2.1 定义与特点

  • 定义:可变基哈夫曼编码是一种基于R叉树的哈夫曼编码方法,其中R是大于2的整数,表示每个节点可以有R个子节点。

  • 特点

    • 灵活性高:通过调整R的值,可以根据具体的应用场景和数据特性来优化编码效率。
    • 编码效率高:在某些情况下,相比于传统的二叉哈夫曼树,R叉树能够生成更短的平均编码长度。

3.2.2 构建过程

可变基哈夫曼编码的构建过程与传统的哈夫曼编码类似,但需要考虑R叉树的特点。以下是一个简化的构建过程:

  1. 统计字符频率:首先,对需要编码的数据进行扫描,统计每个字符出现的频率。

  2. 初始化节点:将每个字符及其频率作为叶子节点,初始化一个R叉树的节点集合。

  3. 合并节点

    • 从节点集合中选出R-1个频率最小的节点(如果节点总数不足R-1,则全部选取)。
    • 创建一个新的内部节点,将这R-1个节点作为其子节点,新节点的频率为这些子节点频率之和。
    • 将新节点加入节点集合,并移除原来的R-1个节点。
  4. 重复合并:重复上述合并过程,直到节点集合中只剩下一个节点,即哈夫曼树的根节点。

  5. 生成编码表:从根节点开始,遍历哈夫曼树,为每个叶子节点(即字符)生成对应的编码。在遍历过程中,根据路径上的分支(0到R-1)来生成编码。

3.2.3 编码与解码

  • 编码:使用生成的编码表对原始数据进行编码,得到压缩后的数据。

  • 解码:解码是编码的逆过程,通过遍历哈夫曼树和读取编码来恢复原始数据。

3.2.4 应用场景

可变基哈夫曼编码适用于需要高效数据压缩的场景,特别是在字符集较大或字符频率分布不均匀的情况下。通过调整R的值,可以针对不同的应用场景进行优化,以达到更好的压缩效果。

3.2.5 注意事项

  • 在实际应用中,需要根据具体的数据特性和压缩需求来选择合适的R值。

  • 由于R叉树的构建过程相对复杂,因此在实现时需要注意算法的优化和效率。

  • 在进行编码和解码时,需要确保编码表的一致性,以避免数据错误。

总之,可变基哈夫曼编码是一种灵活的编码方法,通过调整R叉树的结构来优化编码效率。它在数据压缩领域具有广泛的应用前景。

3.3 POJ3253、POJ1521、UVA12676、UVA240

3.3.1 POJ 3253: Fence Repair (Planks)

问题总结: 你有 N块不同长度的木板。你需要通过将这些木板全部合并成一块来修理围栏。每次合并两块木板的费用等于它们长度之和。目标是找到合并所有木板的最小费用。

方案:

  1. 使用最小堆始终优先合并最短的两块木板.
  2. 将合并后的木板重新放入堆中.
  3. 重复此过程直到只剩下一块木板.

代码示例 (Python):

import heapqdef fence_repair(planks):heapq.heapify(planks)total_cost = 0while len(planks) > 1:first = heapq.heappop(planks)second = heapq.heappop(planks)cost = first + secondtotal_cost += costheapq.heappush(planks, cost)return total_cost# Example Usage
planks = [8, 5, 8]
print(fence_repair(planks))  # Output: 34

3.3.2 POJ 1521: Pie Progress

问题总结: 你有 n 个饼和 m 天。每一天你都必须买一个饼,但饼每天会变得更贵。找到在 m天内购买 n个饼的最低总费用.

方案:

  1. 使用优先队列来跟踪下一个饼的最低成本.
  2. 每天,取出最低成本的饼,购买它,并将当天下一个饼的成本(如果有的话)放入队列中.

代码示例 (Python):

import heapqdef pie_progress(costs, n, m):min_heap = []for day in range(m):heapq.heappush(min_heap, (costs[day][0], day, 0))total_cost = 0for _ in range(n):cost, day, pie_index = heapq.heappop(min_heap)total_cost += costif pie_index + 1 < len(costs[day]):next_cost = costs[day][pie_index + 1]heapq.heappush(min_heap, (next_cost, day, pie_index + 1))return total_cost# Example Usage
costs = [[3, 5, 7],[2, 4, 6],[1, 8, 9]
]
print(pie_progress(costs, 3, 3))  # Example usage

3.3.3 UVA 12676: "Grocery Store"

问题总结: 给定一个物品价格列表和一个预算。你需要在不超出预算的情况下找到你可以购买的最多物品数量。

Approach:

  1. 将物品价格列表排序.
  2. 遍历排序后的列表并累加价格,直到超出预算为止

代码示例 (Python):

def max_items(prices, budget):prices.sort()total_items = 0total_cost = 0for price in prices:if total_cost + price <= budget:total_cost += pricetotal_items += 1else:breakreturn total_items# Example Usage
prices = [5, 10, 3, 7, 2]
budget = 15
print(max_items(prices, budget))  # Output: 3

3.3.4 UVA 240: "Returning Home"

问题总结:给定一个网格,你需要找到从起点到终点的最短路径,并避开障碍物。

方案:

  1. 使用广度优先搜索(BFS)在无权网格中找到最短路径.

代码示例 (Python):

from collections import dequedef bfs_shortest_path(grid, start, end):rows, cols = len(grid), len(grid[0])directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]queue = deque([start])visited = set()visited.add(start)distance = {start: 0}while queue:x, y = queue.popleft()if (x, y) == end:return distance[(x, y)]for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] != '#' and (nx, ny) not in visited:queue.append((nx, ny))visited.add((nx, ny))distance[(nx, ny)] = distance[(x, y)] + 1return -1  # If no path is found# Example Usage
grid = [['S', '.', '.', '#', '.', '.', '.'],['.', '#', '.', '.', '.', '#', '.'],['.', '#', '.', '.', '.', '.', '.'],['.', '.', '#', '#', '.', '.', '.'],['#', '.', '#', 'E', '.', '#', '.']
]
start = (0, 0)  # Starting position 'S'
end = (4, 3)    # Ending position 'E'
print(bfs_shortest_path(grid, start, end))  # Example usage

每个问题都涉及不同的算法方法,从贪心算法和优先队列到排序和广度优先搜索。请务必根据具体需求调整输入和测试用例。

 

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

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

相关文章

Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步

介绍 提供跨组件和页面的共享状态能力&#xff0c;作为Vuex的替代品&#xff0c;专为Vue3设计的状态管理库。 Vuex&#xff1a;在Vuex中&#xff0c;更改状态必须通过Mutation或Action完成&#xff0c;手动触发更新。Pinia&#xff1a;Pinia的状态是响应式的&#xff0c;当状…

Linux内核 mmap内存映射的实现原理

在Linux内核以及Linux系统编程的时候&#xff0c;经常会碰到mmap内存映射&#xff0c;mmap函数是实现高性能编程的一个关键点。本文详细介绍一下mmap实现原理。 虚拟地址映射物理地址 虚拟地址映射物理地址采用的是页表机制&#xff0c;64位CPU采用的是4级页表。 64位CPU虚拟…

鸿蒙 HarmonyOS NEXT端云一体化开发-认证服务篇

一、开通认证服务 地址&#xff1a;AppGallery Connect (huawei.com) 步骤&#xff1a; 1 进入到项目设置页面中&#xff0c;并点击左侧菜单中的认证服务 2 选择需要开通的服务并开通二、端侧项目环境配置 添加依赖 entry目录下的oh-package.json5 // 添加&#xff1a;主要前…

《python程序语言设计》第6章14题 估算派值 类似莱布尼茨函数。但是我看不明白

这个题提供的公式我没看明白&#xff0c;后来在网上找到了莱布尼茨函数 c 0 for i in range(1, 902, 100):a (-1) ** (i 1)b 2 * i - 1c a / bprint(i, round(4 / c, 3))结果 #按题里的信息&#xff0c;但是结果不对&#xff0c;莱布尼茨函数到底怎么算呀。

PyTorch深度学习快速入门(上)

PyTorch深度学习快速入门&#xff08;上&#xff09; 一、前言&#xff08;一&#xff09;PyTorch环境配置&#xff08;二&#xff09;Python编译器的选择&#xff08;三&#xff09;Python学习中的两大法宝函数 二、如何加载数据&#xff08;一&#xff09;Dataset与Dataloade…

轻松学EntityFramework Core--模型创建

一、使用代码优先&#xff08;Code-First&#xff09;创建模型 Code-First 方法是 EF Core 提供的一种用于定义模型的方式&#xff0c;它允许开发人员通过编写 C# 类来定义数据库模式&#xff0c;再通过迁移命令生成数据库表。下面我们来一起看一下代码优先如何使用。 1.1、创…

lua 游戏架构 之 游戏 AI (六)ai_auto_skill

定义一个为ai_auto_skill的类&#xff0c;继承自ai_base类。ai_auto_skill类的目的是在AI自动战斗模式下&#xff0c;根据配置和条件自动选择并使用技能。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读379次。定义了一套接口和属性&#…

【原创】使用keepalived虚拟IP(VIP)实现MySQL的高可用故障转移

1. 背景 A、B服务器均部署有MySQL数据库&#xff0c;且互为主主。此处为A、B服务器部署MySQL数据库实现高可用的部署&#xff0c;当其中一台MySQL宕机后&#xff0c;VIP可自动切换至另一台MySQL提供服务&#xff0c;实现故障的自动迁移&#xff0c;实现高可用的目的。具体流程…

快速安装torch-gpu和Tensorflow-gpu(自用,Ubuntu)

要更详细的教程可以参考Tensorflow PyTorch 安装&#xff08;CPU GPU 版本&#xff09;&#xff0c;这里是有基础之后的快速安装。 一、Pytorch 安装 conda create -n torch_env python3.10.13 conda activate torch_env conda install cudatoolkit11.8 -c nvidia pip ins…

mstc远程连接不锁屏

连接不锁屏 方法一 方法二 win10 解决多用户同时远程连接教程&#xff08;超详细图文&#xff09;_win10多用户登录-CSDN博客 win7软件 logout.bat for /f "skip1 tokens3" %%s in (query user %USERNAME%) do (%windir%\System32\tscon.exe %%s /dest:console) …

Datawhale AI 夏令营——AI+逻辑推理——Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零入门 AI 逻辑推理 比赛&#xff1a;第二届世界科学智能大赛逻辑推理赛道&#xff1a;复杂推理能力评估 代码运行平台&#xff1a;魔搭社区 比赛任务 本次比赛提供基于自然语言的逻辑推理问题&#xff0c;涉及多样的场景&…

React Native 与 Flutter:你的应用该如何选择?

Flutter 和 React Native 都被认为是混合应用程序开发中的热门技术。然而&#xff0c;当谈到为你的项目使用框架时&#xff0c;你必须考虑哪一个是最好的&#xff1a;Flutter 还是 React Native&#xff1f; 本篇文章包含 Flutter 和 React Native 在各个方面的差异。因此&…

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…

Lesson 52 What nationality are they? Where do they come from?

Lesson 52 What nationality are they? Where do they come from? 词汇部分 the U.S. 美国 全称&#xff1a;The United States of America    美利坚合众国 其他称呼&#xff1a;the States      the U.S.A.      Uncle Sam Brazil n. 巴西 Brazilian a. 巴…

LeetCode算法——滑动窗口矩阵篇

1、长度最小的子数组 题目描述&#xff1a; 解法&#xff1a; 设一个 for 循环来改变指向窗口末尾的指针&#xff0c;再不断抛弃当前窗口内的首元素 最终确定满足条件的最小长度 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int …

duilib中设置窗口透明度的接口CPaintManagerUI::SetTransparent有问题导致使用duilib窗口实现异形窗口无效的排查

目录 1、duilib框架中设置窗口透明度的代码说明 2、UpdateLayeredWindow调用失败,发现添加的WS_EX_LAYERED风格被删除了 3、窗口有WS_EX_LAYERED风格了,但UpdateLayeredWindow调用依旧失败 4、如何知道SetLayeredWindowAttributes函数调用之后再调用UpdateLayeredWindow…

苹果电脑暂存盘已满怎么清理 Mac系统如何清理磁盘空间 清理MacBook

Mac电脑用户在长时间使用电脑之后&#xff0c;时常会看到“暂存盘已满”的提示&#xff0c;这无疑会给后续的电脑使用带来烦恼&#xff0c;那么苹果电脑暂存盘已满怎么清理呢&#xff0c;下面将给大家带来一些干货帮你更好地解决这个问题。 首先我们要搞明白为什么暂存盘会满&…

c++ 智能指针shared_ptr与make_shared

shared_ptr是C11引入的一种智能指针&#xff0c;‌它允许多个shared_ptr实例共享同一个对象&#xff0c;‌通过引用计数来管理对象的生命周期。‌当最后一个持有对象的shared_ptr被销毁时&#xff0c;‌它会自动删除所指向的对象。‌这种智能指针主要用于解决资源管理问题&…

【运维自动化-配置平台】模型及模型关联最小化实践

蓝鲸智云配置平台&#xff0c;以下简称配置平台 我们知道主机是配置平台最常见的管控资源对象&#xff0c;在业务拓扑里可以通过划分模块来清晰的可视化管理&#xff1b;那其他资源如何通过配置平台来纳管呢&#xff0c;比如网络设备交换机。场景需求&#xff1a;如何把交换机…