当前位置: 首页 > news >正文

算法导论 总结索引 | 第四部分 第十六章:贪心算法

1、求解最优化问题的算法 通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的算法
贪心算法(greedy algorithm)就是这样的算法,它在每一步都做出当时看起来最优的选择。也就是说,它总是做出局部最优的选择,寄希望通过这些选择导致全局最优解

2、贪心算法 并不保证得到最优解,但对很多问题 确实可以求得最优解

1、活动选择问题

一个调度竞争共享资源的 多个活动的问题,目标是 选出一个最大的互相兼容的活动集合。假定有一个 n 个活动的集合 S = {a1, a2, …, an},这些活动使用同一资源(例如一个阶梯教室),每个活动 a_i 都有一个开始时间 s_i 和 一个结束时间 f_i,其中 0 ≤ s_i < f_i < ∞。如果被选中, a_i 发生在 [si, fi) 期间。如果 a_i 和 a_j 满足 [s_i, f_i) 和 [s_j, f_j) 不重叠,则称它们是兼容的
当 s_i ≥ f_j 或 s_j ≥ f_i 时,a_i 和 a_j 是兼容的。希望选出一个最大兼容活动的子集

假定活动 已按结束时间的单调递增顺序排列:
在这里插入图片描述
可以通过动态规划方法 将这个问题分为两个子问题,然后 将两个子问题的最优解 结合成原问题的一个最优解。在确定该将 哪些子问题用于最优解时,要考虑几种选择
贪心算法只需考虑一种选择(即贪心的选择),在做贪心选择时,子问题之一必定是空的,因此,只留下一个非空子问题。找到一种递归贪心算法 来解决活动调动问题,并将递归算法转化为迭代算法,以完成贪心方法的过程

1.1 最优子结构

A_ij = A_ij U { a_k } U A_kj,而且 S_ij 中最大兼容任务子集 A_ij 包含 I A_ij I = | A_ik | + | A_kj l + 1 个活动
用剪切一粘贴办法证明最优解
A_ij 必然包含两个子问题 S_ik 和 S_kj 的最优解

用 c[i, j] 表示集合 S_ij 的最优解的大小
在这里插入图片描述

1.2 贪心选择

假如 发现所有子问题都可以选择出一个活动加入到最优解,对于活动选择问题, 只需要考虑一个选择,贪心选择

应该选择这样一个活动,选出它后 剩下的资源应能被尽量多的其他任务所用。现在考虑可选的活动, 其中必然有一个最先结束。应该选择S中最早结束的活动,因为 它剩下的资源可供它之后尽量多的活动使用

选择最早结束的活动并不是本问题唯一的贪心选择方法:也可以选择 最晚开始活动(开始要把 活动开始时间 从晚到早排序(贪心 之前的排序很重要),然后把满足条件的顺次加入进去 就行)

定理16.1 考虑任意非空子问题s,且 a_j 是 A_k 中结束时间最早的活动,则 a_m 在 S_k 的某个最大兼容子集中
在这里插入图片描述
虽然 可以用动态规划方法 求解活动选择问题,但并不需要这样做(此外,并未检查活动选择问题 是否具有重叠子问题性质)。相反,可以反复选择 最早结束的活动,保留与此活动兼容的活动,重复这一过程,直至无剩余活动可选
而且,因为 总是选择最早结束的活动,所以选择的活动 在结束时间上总是严格递增的,只需要 按结束时间的单调递增顺序 去处理所有活动,每个活动只考虑一次

贪心算法 通常都是这种自顶向下的设计:做出一个选择,然后求解剩下的那个子问题

1.3 递归贪心算法

输入为两个数组 s 和 f,表示活动的开始 和 结束时间,下标 k 指出要求解的子问题 S_k, 以及 问题规模 n

为了方便 算法初始化,添加一个虚拟活动 a_0,其结束时间 f_0 = 0(因为上来的活动就是 k + 1),求解原问题 即可调用RECURSIVE-ACTIVITY-SELECTOR(s, f, 0, n)

RECURSIVE-ACTIVITY-SELECTOR(s, f, k, n)
1  m = k + 1
2  while m <= n and s[m] < f[k]
3     m = m + 1
4  if m <= n
5     return {a_m} ∪ RECURSIVE-ACTIVITY-SELECTOR(s, f, m, n) // 下一代从 k = m 开始
6  else return

可能因为 m>n 而终止,这意味着我们已经检查了 S_k 中所有活动,未找到与 a_k 兼容者

假定活动 已经按结束时间排好序,则递归调用 RECURSIVE-ACTIVITY-SELECTOR(s, f, 0, n) 的运行时间为 Θ(n),在整个递归调用过程中,每个活动只被 while 循环检查一次

1.4 迭代贪心算法

1、将算法转换为 迭代形式。过程 RECURSIVE-ACTIVITY-SELECTOR 几乎就是“尾递归”。它以一个对自身的递归调用 再接一次并集操作结尾。将一个尾递归过程 改为 迭代形式 通常是很直接的,实际上,某些特定语言的编译器可以自动完成这一工作

GREEDY-ACTIVITY-SELECTOR(s, f)
1.  n = s.length
2.  A = {a_1}
3.  k = 1
4.  for m = 2 to n
5.      if s[m] >= f[k]
6.          A = A ∪ {a_m}
7.          k = m
8.  return A

与递归版本类似,在输入活动已按结束时间排序的前提下,GREEDY-ACTIVITY-SELECTOR 的运行时间为 Θ(n)

2、并不是所有贪心方法都能得到最大兼容活动子集。在剩余兼容活动中 选择 持续时间最短者 不能得到最大集。在剩余兼容活动选择与其他剩余活动重叠最少者 也是同理

3、假定有一组活动,需要将它们安排到一些教室,任意活动都可以在任意教室进行。希望使用最少的教室完成所有活动。设计一个高效的贪心算法来安排哪些活动在哪个教室进行

(这个问题称为 区间图着色问题(interval-graph coloring problem))。可以构建一个区间图,其中表示活动的节点,边连接不兼容的活动。要求用最少的颜色对图的顶点进行着色,使用所有邻项顶点之间的不同颜色

在这里插入图片描述
这个算法的关键在于贪心策略:
总是优先使用已经空闲的讲堂来安排新的活动
只有当没有空闲讲堂时,才添加新的讲堂

在这里插入图片描述
不能用贪心了,O(n3) 是 i 从0到 n,j 从 i + 1 到 n,k 从 i 到 j
因为 c[i, k] + c[k, j] + V_k
希望最大化兼容活动的总价值,可以使用动态规划(Dynamic Programming, DP)来实现
在这里插入图片描述
在这里插入图片描述

def find_latest_non_conflicting(activities, n):for j in range(n-1, -1, -1):if activities[j][1] <= activities[n][0]:return jreturn -1def activity_selection_with_values(activities):# 按结束时间排序activities.sort(key=lambda x: x[1])# 动态规划数组n = len(activities)dp = [0] * (n + 1)for i in range(1, n + 1):# 当前活动的值value = activities[i-1][2]# 查找最新的与当前活动兼容的活动j = find_latest_non_conflicting(activities, i-1)# 递推公式if j != -1:dp[i] = max(dp[i-1], value + dp[j+1])else:dp[i] = max(dp[i-1], value)return dp[n]# 示例活动 (开始时间, 结束时间, 价值)
activities = [(1, 3, 5), (2, 5, 6), (4, 6, 5), (6, 7, 4), (5, 8, 11), (7, 9, 2)]
print("最大价值:", activity_selection_with_values(activities))

2、贪心算法原理

1、通过 做出一系列选择来求出问题的最优解。在每个决策点,它做出在当时看来最佳的选择。这种 启发式策略 并不保证总能找到全局最优解

2、设计贪心算法步骤

  1. 将最优化问题 转换为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解
  2. 证明做出贪心选择后,原问题总是 存在最优解,即贪心选择是安全的
  3. 证明做出贪心选择后,剩余的子问题 满足性质:其最优解与贪心选择组合 即可得到原问题的最优解,这样就得到了最优子结构

2.1 贪心选择性质

1、可以通过做出局部最优(贪心)选择 来构建全局最优解

2、与动态规划 先求解子问题才能 进行第一次选择不同,贪心算法 在进行第一次选择之前 不求解任何子问题,一个动态规划算法是 自底向上 进行计算的,而一个贪心算法 通常是自顶向下的,进行一次又一次选择,将给定问题实例 变得更小

3、必须证明每个步骤 做出贪心选择 能生成全局最优解。这种证明 通常首先考查 某个子问题的最优解,然后用贪心选择 替换某个其他选择 来修改此解,从而得到一个相似但更小的子问题

进行贪心选择时 不得不考虑 众多选择,通常意味着 可以改进贪心选择,使其更为高效
例如,在活动选择问题中,假定 已经将活动按结束时间单调递增顺序 排好序,则对每个活动能够只处理一次。通过对输入进行预处理 或者 使用适合的数据结构(通常是优先队列),通常可以使得贪心选择更快速,从而得到更有效的算法

2.2 最优子结构

1、如果一个问题的最优解 包含其子问题的最优解,则称此问题具有 最优子结构性质。此性质是 能否应用动态规划 和 贪心算法的关键要素

活动选择问题为例,如果一个子问题 S_ij 的最优解包含活动a_k,那么必然也包含子问题 S_ik 和 S_kj 的最优解
如果知道 S_ij 的最优解应该包含 哪个活动 a_k,就可以组合 a_k 以及 S_ik 和 S_kj 的最优解中所有活动来构造 S_ij 的最优解

2、论证最优子结构:将子问题的最优解 与 贪心选择 组合在一起就能生成原问题的最优解。这种方法隐含对于子问题 使用了数学归纳法,证明了 每个步骤进行贪心选择都会生成原问题的最优解

2.3 贪心对动态规划

1、0-1背包问题:一个正在抢劫商店的小偷 发现了 n 个商品,第 i 个商品价值 v_i 美元,重 w_i 磅,v_i 和 w_i 都是整数。小偷希望 拿走价值尽货高的商品,但他的背包 最多能容纳 W 磅重的商品, W是一个整数。应该拿哪些商品
(称这个问题是 0-1 背包问题, 因为对每个商品,小偷要么把它完整拿走, 要么把它留下,不能只拿走一部分)

2、在分数背包问题 中,设定与 0-1 背包问题是一样的,不同的是:小偷可以拿走其一部分,而不是 只能做出二元 (0-1) 选择

3、两个背包问题都具有 最优子结构性质。对0-1背包问题,考虑重量不超过 W 而 价值最高的装包方案。如果 将商品 j 从此方案中删除,则剩余商品 必须是重量不超过 W - w_j 的价值最高的方案

贪心策略 可以求解分数背包问题,而不能求解 0-1 背包问题
为了求解分数背包问题,首先计算每个商品的每磅价值 v_i / w_i 。遵循贪心策略,首先尽量多地拿 每磅价值最高的商品。通过将背包按每磅价值排序,贪心算法的运行时间可为 O(nlgn)

证明分数背包问题具有贪心选择性质
在这里插入图片描述

拿走商品 1 的策略对 0-1 背包问题无效 是因为小偷无法装满背包,空闲空间降低了方案的有效每磅价值。在 0-1 背包问题中,当考虑是否 将一个商品装入背包时,必须比较包含 此商品的子问题的解 与 不包含它的子问题的解,然后才能做出选择。这会导致大量的重叠子问题——动态规划的标识

设计动态规划算法求解 0-1 背包问题,要求运行时间为 O(nW),n 为商品数量,W 是小偷能放进背包中的最大商品总重量
动规不用事先排序
K含义:K[考虑过的物品, 剩余空间重量]

0-1-KNAPSACK(n, W)Initialize an (n + 1) by (W + 1) table Kfor i = 1 to nK[i, 0] = 0for j = 1 to WK[0, j] = 0for i = 1 to nfor j = 1 to Wif j < i.weightK[i, j] = K[i - 1, j]elseK[i, j] = max(K[i - 1, j], K[i - 1, j - i.weight] + i.value)

在这里插入图片描述

3、赫夫曼编码

1、根据每个字符的出现频率,赫夫曼算法 构造出字符的最优二进制表示
在这里插入图片描述
每个字符用一个唯一的一二进制串表示,称为码字。如果使用定长编码,需要用3位表示6个字符:a=000, b=001, …, f=101。这种方法需要300,000个二进制位来编码文件

2、变长编码 可以达到 比定长编码好得多的压缩率,其思想是赋予高频字符 短码字,赋予低频字符 长码字。上图显示了六个字符的一种变长编码:1位的a表示,4位的f表示。因此,这种编码表示此文件
(45⋅1+13⋅3+12⋅3+16⋅3+9⋅4+5⋅4)⋅1000=224,000位
与定长编码相比 节约了25%的空间,这是 此文件的最优字符编码

3.1 前缀码

1、只考虑所谓前缀码,即没有任何字符是其他字符的前缀。与任何字符编码相比,前缀码 都可以保证达到最优数据压缩率。因此 只关注前缀码,不会丧失一般性

前缀码的作用是 简化解码过程。由于没有码字是其他码字的前缀,编码文件的开始码字是无歧义的。可以简单地识别出 开始码字,将其转换回 原字符,然后对编码文件剩余部分 重复这种解码过程

在上节的例子中,二进制串 001011101 可以唯一地解析为 0·0·101·1101,解码为 aabec

2、解码过程 需要前缀码的一种方便的表示形式,以便 可以容易地截取开始字符。一种二叉树表示 可以满足这种需求,其叶结点为 给定的字符。字符的二进制码字 用从根结点到该字符叶结点的简单路径表示,其中 0 意味着 “转向左孩子”,1 意味着 “转向右孩子”
注意,编码树并不是二叉搜索树,因为叶节点并未有序排列,而内部结构并不包含 字符关键字
在这里插入图片描述
文件的最优编码方案总是对应一棵 满(full) 二叉树,即每个非叶节点都有两个孩子结点。前文给出的定长编码实例 不是最优的,因为它的二叉树表示 并非 满二叉树
若 C 为字母表 且 所有字符的出现频率 均为正数,则最优编码树对应的树结构恰有 |C| 个叶结点,每个叶结点对应字母表中一个字符,且恰有 |C|−1 个内部结点

对字母表C中的每个字符c,令属性 c.freq 表示 c 在文件中出现的频率,令 d_T(c) 表示c的叶结点在树中的深度。注意,d_T(c) 也是字母c的码字的长度。则编码该文件需要
在这里插入图片描述

3.2 构造赫夫曼编码

1、贪心算法来构造最优前缀码,它的正确性证明 依赖于 贪心选择性质 和 最优子结构

2、算法自底向上地构建出 对应最优编码的二叉树 T
它从 |C| 个叶结点开始,执行 |C|−1 次“合并”操作 创建出最终的二叉树。算法使用一个以 属性 freq 为关键字的最小优先队列 Q,以识别 两个最低频率的对象 将其合并。当合并两个对象时,得到的新对象的频率 等于原来两个对象频率之和
(根 搜索树不一样,没有其他对节点的顺序限制之后,只需要 让频率大的靠近根,频率小的远离根)

HUFFMAN(C)
1  n = |C|
2  Q = C
3  for i = 1 to n-1
4     allocate a new node z
5     z.left = x = EXTRACT-MIN(Q) // 把代价最小的删除并返回
6     z.right = y = EXTRACT-MIN(Q)
7     z.freq = x.freq + y.freq
8     INSERT(Q, z)
9  return EXTRACT-MIN(Q) // return the root of the tree

由于字母表 包含6个字符,初始队列大小为 n=6
在这里插入图片描述
for循环 反复从队列中提取两个频率最低的结点 x 和 y,将它们合并为 一个新结点z,替代它们。z的频率为 x 和 y 的频率之和
结点z将 x 作为其左孩子,将 y 作为其右孩子(顺序是不重要的,交换左右孩子会生成一种不同的编码,但代价完全一样)。经过 n−1 次合并后,第9行返回队列中剩下的唯一结点——编码树的根结点

3、为了分析赫夫曼算法的运行时间,假定 Q 是使用最小二叉堆实现的(参见第6章)。在第2行用 BUILD-MIN-HEAP过程(参见6.3节)将 Q 初始化,花费时间为 O(n)。第3~8行的 for 循环执行 n−1 次,且每个堆操作需要 O(lgn) 的时间,所以循环对总时间的贡献为 O(nlgn)。因此,处理一个n个字符的集合,HUFFMAN 的总运行时间为 O(nlgn)

3.3 赫夫曼算法的正确性

1、确定最优前缀码的问题 具有贪心选择 和 最优子结构性质

2、(1)令 C 为一个字符表,其中每个字符 c∈C 都有一个频率 c.freq。令 x 和 y 是 C 中频率最低的两个字符。那么存在 C 的一个最优前缀码,x 和 y 的码字长度相同,且 只有最后一个二进制位不同(即是 兄弟结点,在最优的基础上 每次合并仍是最优,即可合并)

证明 证明的思想是令 T 表示任意一棵最优前缀码所对应的编码树,对其进行修改,得到表示另外一个最优前缀码的编码树,使得在新树中,x 和 y 是深度最大的叶结点,且它们为兄弟结点
如果 可以构造这样一棵树,那么 x 和 y 的码字将有相同长度,且只有最后一位不同

令 a 和 b 是 T 中深度最大的兄弟叶结点, 不失一般性, 假定a.freq <= b.freq 且 x.freq<= y.freq。由于 x.freq 和 y.freq 是叶结点中最低的两个频率,而 a.freq 和 b.freq 是两个任意频率。因此, 我们有 x.freq <= a.freq 且 y.freq <= b.freq
交换 x 和 a 生成一棵新树 T’, 井在 T 中交换 b 和 y 生成一棵新树 T"
T和T’的代价差为
在这里插入图片描述
类似地,交换 x 和 b 也不能增加代价,所以 B(T′) − B(T’‘) 也是非负的。因此 B(T′′) < B(T),由于 T 是最优的,我们有 B(T′’) = B(T),这意味着 B(T′′) = B(T)。因此,T’’ 也是最优树,且 x 和 y 是其中深度最深的兄弟结点,引理成立
在这里插入图片描述
3、通过合并来构造最优树的过程,可以 从合并出现频率最低的两个字符 这样一个贪心选择开始。为什么这是一个贪心选择?可以将每一次合并操作的代价 看做 被合并的两项的频率之和

在每个步骤 可选择的所有合并操作中,HUFFMAN 选择是 代价最小的那个,下面的引理证明了构造最优前缀码的问题具有最优子结构性质

(2)令 C 为一个含有 n 个字符表,其中每个字符 c∈C 都有一个频率 c.freq。令 C’ 为 C 去棹字符 x 和 y, 加入一个新字符 z 后得到的宇母表,即 C’ = C - {x, y} ∪{z},z.freq = x.freq + y.freq。令 T’ 为字母表 C’ 的任意一个最优前缀码对应的编码树。于是 可以将 T’ 中叶结点 z 替换为一个以 x 和 y 为孩子的内部结点,得到树 T, 而 T 表示字母表C的 一个最优前缀码

证明:用树 T’ 的代价 B(T’) 来表示树 T 的代价 B(T)
在这里插入图片描述
用反证法来证明引理。假定 T 对应的前缀码并不是 C 的最优前缀码,存在最优编码树 T’’ 满足 B(T′‘) < B(T)。不失一般性(由引理 16.2),T’’ 包含兄弟结点 x 和 y,令 T’’ 将 T 中 x,y 及它们的父结点替换为叶结点 z 得到的树,其中 z.freq = x.freq + y.freq(T’‘’ 对应 T’,T’’ 对应 T)
在这里插入图片描述
与 T’ 对应 C’ 的一个最优前缀码的假设矛盾。因此 T 必然表示字符表 C 的一个最优前缀码,即最优 T 一定包含 最优 T’'(最优子结构)

4、由(1)(2),过程 HUFFMAN 会生成一个最优前缀码
在这里插入图片描述
5、
在这里插入图片描述

相关文章:

算法导论 总结索引 | 第四部分 第十六章:贪心算法

1、求解最优化问题的算法 通常需要经过一系列的步骤&#xff0c;在每个步骤都面临多种选择。对于许多最优化问题&#xff0c;使用动态规划算法求最优解有些杀鸡用牛刀了&#xff0c;可以使用更简单、更高效的算法 贪心算法&#xff08;greedy algorithm&#xff09;就是这样的算…...

用“文心一言”写的文章,看看AI写得怎么样?

​零售连锁店的“支付结算”业务设计 在数字化浪潮的推动下&#xff0c;连锁店零售支付结算的设计愈发重要。一个优秀的支付结算设计不仅能够提升用户体验&#xff0c;还能增强品牌竞争力&#xff0c;进而促进销售增长。 本文将围绕一个具体的连锁店零售支付结算案例&#xf…...

企业消费采购成本和员工体验如何实现“鱼和熊掌“的兼得?

有企业说企业消费采购成本和员工体验的关系好比是“鱼和熊掌”&#xff0c;无法兼得&#xff1f; 要想控制好成本就一定要加强管控&#xff0c;但是加强管控以后&#xff0c;就会很难让员工获得满意的体验度。如果不加以管控&#xff0c;员工自由度增加了&#xff0c;往往就很难…...

发表EI论文相当于SCI几区?

EI&#xff08;工程索引&#xff09;本身并不进行分区&#xff0c;它是一个收录工程领域高质量文献的数据库&#xff0c;与SCI&#xff08;科学引文索引&#xff09;的分区制度不同。然而&#xff0c;在非正式的学术评价中&#xff0c;有时人们会将EI与SCI的分区进行比较。 虽…...

STFT短时傅里叶变换MTLAB简析

代码&#xff1a; 解释&#xff1a; 如果信号x有Nx个时间样本&#xff0c;短时傅里叶变换的结果矩阵s有k列&#xff1b; k的计算方式如图所示&#xff0c;M是窗函数的长度&#xff0c;L是重叠长度。 此符号是向下取整符号。 短时傅里叶变换的结果矩阵s的行数与参数‘FFTLength’…...

海致科技实施实习生面试

一、面试内容 注&#xff1a;此次是电话面试 1.是XX先生吗 2.你是有考虑转实施的吗&#xff1f; 3.请讲一下你对项目部署实施的理解和掌握 4.用过数据库&#xff0c;会编写SQL语句吗&#xff1f; 5.讲一下SQL的常用关键字 6.了解SQL中的函数吗&#xff1f;谈谈函数 7.多…...

论文阅读之旋转目标检测ARC:《Adaptive Rotated Convolution for Rotated Object Detection》

论文link&#xff1a;link code&#xff1a;code ARC是一个改进的backbone&#xff0c;相比于ResNet&#xff0c;最后的几层有一些改变。 Introduction ARC自适应地旋转以调整每个输入的条件参数&#xff0c;其中旋转角度由路由函数以数据相关的方式预测。此外&#xff0c;还采…...

面向对象(Java)

构造方法只能在对象实例化的时候调用 this可以作为方法参数&#xff0c;表示调用方法的当前对象 this可以作为方法返回值&#xff0c;表示返回当前对象 封装 通过方法访问数据&#xff0c;隐藏类的实现细节 static&#xff1a;类对象共享&#xff0c;类加载时产生&#xff0c;…...

I/O多路复用

参考面试官&#xff1a;简单说一下阻塞IO、非阻塞IO、IO复用的区别 &#xff1f;_unix环境编程 阻塞io和非阻塞io-CSDN博客 同步阻塞(BIO) BIO 以流的方式处理数据 应用程序发起一个系统调用&#xff08;recvform&#xff09;&#xff0c;这个时候应用程序会一直阻塞下去&am…...

线性代数基础概念:向量空间

目录 线性代数基础概念&#xff1a;向量空间 1. 向量空间的定义 2. 向量空间的性质 3. 基底和维数 4. 子空间 5. 向量空间的例子 总结 线性代数基础概念&#xff1a;向量空间 向量空间是线性代数中最基本的概念之一&#xff0c;它为我们提供了一个抽象的框架&#xff0c…...

php 抓取淘宝商品评论数据 json

要抓取淘宝商品评论数据&#xff0c;你可以使用PHP的cURL库来发送HTTP请求并获取JSON格式的数据。 API接入流程&#xff1a;需要开放平台或者是封装接口注册账号&#xff0c;并申请相应的API使用权限&#xff0c;以获取必要的密钥和接口文档。获取接口使用权限&#xff1a;接入…...

Java 7新特性深度解析:提升效率与功能

文章目录 Java 7新特性深度解析&#xff1a;提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理&#xff08;捕获多个异常&#xff09;四、增强泛型推断五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292与InvokeDynamic七、Path接口…...

RHEL9找不到/var/log/dmesg日志文件问题

问题描述 在Rocky Linux 9 服务器上查看启动日志&#xff0c;发现没有/var/log/dmesg文件。 dmesg是什么&#xff1f; dmesg(diagnostic messages)用于打印kernel ring buffer的所有消息。 kernel会将开机信息存储在ring buffer中&#xff0c;如果开机时来不及查看启动信息&…...

是什么让以太坊从众多公链中脱颖而出

以太坊从众多公链中脱颖而出&#xff0c;成为区块链和加密货币领域的一个重要玩家&#xff0c;主要是由于以下几个关键因素&#xff1a; 智能合约&#xff1a; 以太坊是第一个广泛实施智能合约的区块链平台&#xff0c;智能合约允许在区块链上自动执行合同条款&#xff0c;无需…...

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…...

【Linux 命令】文件比较 diff

diff 命令是 Unix 和类 Unix 系统&#xff08;如 Linux 和 macOS&#xff09;中用于比较文件内容差异的一个非常有用的命令行工具。它可以逐行比较两个文件的内容&#xff0c;并输出它们之间的差异。这些差异通常以行为单位显示&#xff0c;并且会标记出哪些行是唯一的、添加的…...

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…...

你的硬盘知道的太多:你以为你的秘密真的被删除了吗?

某一天你收到了朋友发给你的一个秘密文件&#xff0c;在看完之后&#xff0c;为了不被别人发现&#xff0c;你决定将文件毁尸灭迹&#xff01; 你选中文件名称 / 右键 / 删除&#xff0c;好了&#xff0c;文件已经消失了。但你是懂电脑的&#xff0c;知道文件此时还在回收站里面…...

虚拟机的网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近&#xff0c;坚持就是胜利的序曲 一 …...

ONLYOFFICE8.1版本桌面编辑器简单测评

ONLYOFFICE官网链接&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE介绍&#xff1a;https://www.onlyoffice.com/zh/office-suite.aspx OnlyOffice 是一款免费且开源的 Office 协作办公套件&#xff0c;支持桌面端和移动端等多平台&#xff0c;由一家领先的 IT 公…...

PDF内存如何变小,PDF内存压缩,PDF内存变小怎么调整

在数字化时代&#xff0c;pdf已成为工作、学习和生活中不可或缺的文件格式。它以其跨平台兼容性和安全性受到广大用户的喜爱。然而&#xff0c;随着pdf文件中嵌入的图片、图形和文本内容的增多&#xff0c;文件大小往往会变得相当可观&#xff0c;给文件的传输和存储带来一定的…...

深⼊理解MySQL Innodb存储引擎的缓冲池、事务、索引底层工作原理,掌握 MySQL 主从同步,读写分离技术以及集群的搭建,具备分库分表,SQL调优经验

深入理解MySQL的InnoDB存储引擎是数据库管理员和开发人员的重要技能。以下是对InnoDB存储引擎的缓冲池、事务、索引以及主从同步、读写分离技术和集群搭建的详细原理介绍&#xff1a; ### InnoDB存储引擎 1. **缓冲池(Buffer Pool)**&#xff1a; - 缓冲池是InnoDB存储引擎…...

《HelloGitHub》第 99 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…...

mysql 将一个列按逗号分割为多列

在MySQL中&#xff0c;将一个列按逗号分割为多列通常需要使用字符串函数&#xff0c;如SUBSTRING_INDEX()&#xff0c;配合UNION ALL或CROSS JOIN等操作来实现。 假设有一个表my_table&#xff0c;它有一个列tags&#xff0c;其中存储了逗号分隔的标签值&#xff0c;如下所示&…...

Vue 3中 <script setup> 与生命周期钩子函数的详细解析

Vue 3中 <script setup> 与生命周期钩子函数的详细解析 Vue 3 引入了 <script setup> 语法糖&#xff0c;这是一种简化和集成组件逻辑的新方式。尽管 <script setup> 简化了组件的编写&#xff0c;但仍然可以利用 Vue 提供的生命周期钩子函数来管理组件的生…...

一篇文章入门主成分分析PCA

文章目录 基本概念事件随机变量独立同分布离散型随机变量伯努利分布&#xff08;两点分布&#xff09;二项分布几何分布泊松分布 连续型随机变量正态分布 期望方差标准化协方差相关系数线性组合特征值和特征向量特征值分解对称矩阵的特征值分解 齐次线性方程组单位向量基向量矩…...

Android系统为什么lmkd杀到adj 100就代表有低内存?

在Android系统中&#xff0c;lmkd&#xff08;Low Memory Killer Daemon&#xff0c;低内存终止守护进程&#xff09;负责监控系统的内存状态&#xff0c;并在内存压力较高时通过终止不必要的进程来释放内存&#xff0c;以维持系统的稳定运行。关于lmkd为何在杀到adj&#xff0…...

d嘤嘤不想求异或喵(牛客周赛49)

题意&#xff1a; 嘤嘤有两个整数 l,r&#xff0c;她想知道区间 [l,r] 所有整数的异或和是多少. 分析&#xff1a; 样例1只有一个数输出1 样例2 1^201^10113 样例3 1^2^301^10^1111^11000 #include<bits/stdc.h> using namespace std; typedef long long ll; ll f(l…...

java反射-动态调用方法

通过字符串动态创建对象&#xff0c;通过字符串动态使用对象方法 package com.hmdp.service.动态调用方法;import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws Exception {String name "javax.swing.JFrame";Clas…...

ThreadLocal作用

ThreadLocal作用(线程本地存储) ThreadLocal&#xff0c;很多地方叫做线程本地变量&#xff0c;也有些地方叫做线程本地存储&#xff0c;ThreadLocal的作用是提供线程内的局部变量&#xff0c;这种变量在线程的生命周期内起作用&#xff0c;减少同一个线程内多个函数或者组件之…...

Python基础入门知识

目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…...

uniapp——据用户角色显示或隐藏部分功能权限。

v-if"user.state.agent_level!business || (user.state.agent_levelbusiness && item.value ! 3 && item.value ! 4)"...

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transformer-LSTM多变量回归预测&#xff0c;贝叶斯优化Transformer结合LSTM长…...

软件开发环境-系统架构师(二十一)

1、对计算机评价的主要性能指标有时钟频率、&#xff08;&#xff09;、运算精度和内存容量等。 对数据库管理系统评价的主要性能指标有&#xff08;&#xff09;、数据库所允许索引数量和最大并发事务处理能力。 问题1 A丢包率 B端口吞吐量 C可移植性 D数据处理速率 问题…...

AI与大模型工程师证书研修班报名啦!

人工智能大模型是指拥有超大规模参数&#xff08;通常在十亿个以上&#xff09;、超强计算资源的机器学习模型&#xff0c;能够处理海量数据&#xff0c;完成各种复杂任务&#xff0c;如自然语言处理、图像识别等。计算机硬件性能不断提升&#xff0c;深度学习算法快速优化&…...

ctfshow-web入门-命令执行(web56、web57、web58)

目录 1、web56 2、web57 3、web58 1、web56 命令执行&#xff0c;需要严格的过滤 新增过滤数字&#xff0c;只能采用上一题临时文件上传的方法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…...

controller不同的后端路径对应vue前端传递数据发送请求的方式,vue请求参数 param 与data 如何对应后端参数

目录 案例一&#xff1a; 为什么使用post发送请求&#xff0c;参数依旧会被拼接带url上呢&#xff1f;这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后&#xff0c;data会以请求体传递 补充&#xff1a;后端controller 参数上如果没写任何注解&#xff0c…...

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer&#xff08;encode_send_frame_internal&#xff09;1.1.1 frame的引用函数&#xff08;av_frame_ref &#xff09;1.1.1.1 帧属性的拷贝&#xff08;frame_copy_props&#xff09;1.1.1.2 buffer的引用函数&#xf…...

python获取字符编码

在Python中&#xff0c;您可以使用内置的ord()函数获取单个字符的Unicode编码&#xff0c;使用encode()方法获取字符串的字节编码。 获取单个字符的Unicode编码: char a unicode_code ord(char) print(unicode_code) # 输出字符的Unicode编码 获取字符串的字节编码: tex…...

通过MATLAB控制TI毫米波雷达的工作状态之实时数据采集

前言 前一章博主介绍了如何基于MATLAB的各种前面板组件结合MATLAB代码来发送CFG指令控制毫米波雷达的工作状态,这一章节博主将介绍如何基于这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。目前大部分TI毫米波雷达的数据采集均是仅可以采集一段数据又或者利用DAC10…...

华为HCIP Datacom H12-821 卷21

1.单选题 以下关于PIM-SM中SPT切换的描述,错误的是哪一项? A、若所有组播流量都经过RP路由器,则RP路由器可能成为数据转发的瓶颈 B、SPT路径最短,转发性能更优 C、SPT 切换完成后,组播流量依然经过 ReT 树 D、RPT 树可能不是组播流量转发的最优路径 正确答案: C 解析…...

MySQL之应用层优化(二)

应用层优化 Web服务器问题 寻找最优并发度 每个Web服务器都有一个最佳并发度——就是说&#xff0c;让进程处理请求尽可能快&#xff0c;并且不超过系统负载的最优的并发连接数。这就是前面说的最大系统容量。进行一个简单的测量和建模&#xff0c;或者只是反复试验&#xf…...

Java源码解读之常量52429

文章目录 为什么有52429的常量呢&#xff1f;对于为什么选择52429?那么为什么不再选几位呢&#xff1f; 在JDK8源码中 java.lang.Integer有52429作为常量出现&#xff0c; 为什么有52429的常量呢&#xff1f; static void getChars(int i, int index, char[] buf) {int q, r;…...

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。在2024年&#xff0c;PSAI插件StartAI因其强大的功能和易用性&#xff0c;成为了Photoshop用户的得力帮手。下面来给大家详细介…...

入门Axure:快速掌握原型设计技能

2002 年&#xff0c;维克托和马丁在旧金山湾区的一家初创公司工作&#xff0c;发现自己一再被软件开发生命周期的限制所困扰&#xff0c;而且产品团队在编写规范之前很难评估他们的解决方案&#xff0c;开发人员经常不理解&#xff08;或不阅读&#xff09;给出的规范&#xff…...

Java中的序列化与反序列化详解

Java中的序列化与反序列化详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 什么是序列化与反序列化&#xff1f; 序列化&#xff08;Serialization&#…...

在鸿蒙开发中如何实现皮肤切换?

在鸿蒙开发中&#xff0c;实现主题皮肤切换可以通过以下步骤&#xff1a; 1. 创建不同的主题样式文件&#xff0c;例如theme_light.json和theme_dark.json。 2. 在应用程序的config.json文件中&#xff0c;引入这些主题样式文件。 3. 在应用程序的入口文件&#xff08;例如main…...

FlowUs新一代内容创作营销平台|FlowUs息流国产 好用 不限速

FlowUs 作为一个知识管理和协作平台&#xff0c;知识库功能可以被视为一个强大的学习工具&#xff01; 为什么FlowUs知识库可以成为学习利器呢&#xff1f;原因有以下几点 集中化知识存储&#xff1a;FlowUs允许我们将所有相关信息和资料集中在一个地方&#xff0c;便于访问和复…...

WebSocket解决方案(springboot 基于Redis发布订阅)

WebSocket 因为一般的请求都是HTTP请求&#xff08;单向通信&#xff09;&#xff0c;HTTP是一个短连接&#xff08;非持久化&#xff09;&#xff0c;且通信只能由客户端发起&#xff0c;HTTP协议做不到服务器主动向客户端推送消息。WebSocket确能很好的解决这个问题&…...

如何优化网站SEO排名?

选择那些容易排名的关键词。使用工具找到那些竞争少但有流量的词语。其次&#xff0c;内部链接非常重要。通过合理的内部链接&#xff0c;可以提升各个页面的权重。 增加FAQ部分能帮助你捕捉更多的长尾关键词流量。争取出现在精选摘要的位置&#xff0c;可以直接提升你的曝光率…...

制作Ai 数字人和数字人带货全面拆解复盘

看了后不用再花高价钱去买怎么制作数字人 .数字人带货的相关教程了 市面上基本都是通过这几个方法制作的数字人 超级详细 值得注意的是 拆解的太详细 仅供正规个人用途哦 请勿用于任何非法操作 否则 就不用接着往下看了 点击获取完整版资料...

TortoiseSVN 使用教程

TortoiseSVN 使用教程 1. 引言 TortoiseSVN 是一个开源的版本控制系统,它基于 Subversion(SVN)系统,为 Windows 操作系统提供了一套方便的图形用户界面。通过 TortoiseSVN,用户可以轻松地管理文件的版本,进行团队协作,以及跟踪文件的变更历史。本教程将详细介绍 Torto…...

Linux下的Vim编辑器

一、绪论 1.1 Linux Vim的概述 1.2 Vim在Linux操作系统中的重要性 二、Linux Vim基础知识 2.1 Vim的起源和发展历史 2.2 Vim编辑器的安装与配置 2.3 Vim的基本操作命令 一、绪论 1.1 Linux Vim的概述 vi ( visual editor )编辑器通常被简称为vi,它是Linux和Unix系统上最…...

代码随想录训练营第二十九天 134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列

第一题&#xff1a; 原题链接&#xff1a;134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 需要三个变量&#xff0c;一个变量start记录结果也就是出发的第一个加油站&#xff0c;一个变量curSum来记录此时加油耗油后剩余的油量&#xff0c;如果发现c…...

如何在 SwiftUI 中熟练使用 sensoryFeedback 修饰符

文章目录 前言背景介绍平台支持仅支持watchOS支持watchOS和iOS 基本用法预定义样式根据触发器值选择样式使用场景当值更改时触发使用条件闭包触发使用反馈闭包触发 可以运行 Demo总结 前言 SwiftUI 引入了新的 sensoryFeedback 视图修饰符&#xff0c;使我们能够在所有 Apple …...

探索区块链:颠覆性技术的崛起

目录 一、引言 二、区块链技术概述 三、区块链应用场景 四、区块链面临的挑战 五、区块链的未来展望 六、结语 一、引言 在数字化浪潮的推动下&#xff0c;区块链技术以其独特的去中心化、透明性和不可篡改性等特性&#xff0c;正在逐步改变我们的生活。从金融领域到供应…...

申城下周晴雨参半,高考期间多阴雨天气

东方网记者包永婷6月2日报道:这个双休日的天气很配合儿童节和出行,上海今天较昨天更加晴朗,蓝天白云的景象也赏心悦目。气温加快上升的步伐,徐家汇站最高气温止步28.2℃,午间有些热有些晒,早晚依旧延续着舒适的体感。明天会是近期最晴最热的一天,多云到晴为主,气温起步2…...

Facebook:社交世界的接口

在当今数字时代&#xff0c;社交媒体已经成为了人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头之一&#xff0c;扮演着至关重要的角色。本文将带您深入探索Facebook这张社交世界的画卷&#xff0c;全面了解这个令人着迷的平台。 起源与历程 Facebook的故事始…...

原神抽卡点名程序教程(直接下载用)

今天我要给大家分享一个在抖音上特别火的视频——原神抽卡点名程序教程。 &#xff08;要源码的私信扣31&#xff09; 废话不多说&#xff0c;直接上效果图 &#xff1a; 步骤1&#xff1a; 步骤2&#xff1a;&#xff08;写名单&#xff0c;前面加数字代表星级&#xff0c;用…...

利用C++与Python调用千帆免费大模型,构建个性化AI对话系统

千帆大模型已于2024年4月25日正式免费&#xff0c;调用这个免费的模型以实现自己的AI对话功能&#xff0c;遵循以下步骤&#xff1a; 了解千帆大模型&#xff1a; 千帆大模型是百度智能云推出的一个平台&#xff0c;提供了一系列AI能力和工具&#xff0c;用于快速开发和应用A…...

如何使用Postman更好的进行API渗透测试

在这个时代&#xff0c;Web 和移动应用程序通常是由 RESTful 网络服务提供支持的。 公共和私有 API 在互联网上非常普遍&#xff0c;测试这些 API 绝非易事&#xff0c;但有一些工具可以帮助你。 虽然(通常用与渗透测试)工具不能代替技能&#xff0c;但即使是最熟练的木匠也能用…...

新品发布(仓库小助手)一机在手,轻松无忧

你是否曾为繁琐的货物管理而烦恼&#xff1f; 你是否为了记录货物信息忙前忙后&#xff1f; 近几年&#xff0c;陆续有收到客户在运营跨境代购中的一些反馈&#xff0c;特别是仓库管理这块&#xff0c;比如包裹的出入库、移库、修改包裹信息等&#xff0c;都需要在电脑上完成&…...