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

【数据结构与算法】Greedy Algorithm

1) 贪心例子

称之为贪心算法或贪婪算法,核心思想是

  1. 将寻找最优解的问题分为若干个步骤
  2. 每一步骤都采用贪心原则,选取当前最优解
  3. 因为没有考虑所有可能,局部最优的堆叠不一定让最终解最优

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。这种算法通常用于求解优化问题,如最小生成树、背包问题等。

贪心算法的应用:

  1. 背包问题:给定一组物品和一个背包,每个物品有一定的重量和价值,要求在不超过背包容量的情况下,尽可能多地装入物品。
  2. 活动选择问题:在一个活动集合中,每次只能参加一个活动,问如何安排时间以最大化所有活动的收益。
  3. 编辑距离问题:给定两个字符串,求它们之间的最小编辑距离(即将一个字符串转换为另一个字符串所需的最少操作次数)。
  4. 网络流问题:给定一张有向图和一些起点和终点,求最大流量。
  5. 找零问题:给定一定数量的硬币和需要找零的金额,求使用最少的硬币数。

常见问题及解答:

  1. 贪心算法一定会找到最优解吗?
    答:不一定。贪心算法只保证在每一步选择中都是最优的,但并不能保证整个问题的最优解。例如,背包问题中的贪心算法可能会导致最后一个物品没有被装入背包。
  2. 如何判断一个问题是否适合用贪心算法解决?
    答:一个问题如果可以用递归的方式分解成若干个子问题,且每个子问题都有明确的最优解(即局部最优),那么这个问题就可以用贪心算法解决。
  3. 贪心算法的时间复杂度是多少?
    答:贪心算法的时间复杂度取决于问题的规模和具体实现。一般来说,对于规模较小的问题,贪心算法的时间复杂度可以达到O(nlogn)或O(n2);对于规模较大的问题,可能需要O(n3)或更高。

几个贪心的例子

Dijkstra
// ...
while (!list.isEmpty()) {// 选取当前【距离最小】的顶点Vertex curr = chooseMinDistVertex(list);// 更新当前顶点邻居距离updateNeighboursDist(curr);// 移除当前顶点list.remove(curr);// 标记当前顶点已经处理过curr.visited = true;
}
  • 没找到最短路径的例子:负边存在时,可能得不到正确解
  • 问题出在贪心的原则会认为本次已经找到了该顶点的最短路径,下次不会再处理它(curr.visited = true)
  • 与之对比,Bellman-Ford 并没有考虑局部距离最小的顶点,而是每次都处理所有边,所以不会出错,当然效率不如 Dijkstra
Prim
// ...
while (!list.isEmpty()) {// 选取当前【距离最小】的顶点Vertex curr = chooseMinDistVertex(list);// 更新当前顶点邻居距离updateNeighboursDist(curr);// 移除当前顶点list.remove(curr);// 标记当前顶点已经处理过curr.visited = true;
}
Kruskal
// ...
while (list.size() < size - 1) {// 选取当前【距离最短】的边Edge poll = queue.poll();// 判断两个集合是否相交int i = set.find(poll.start);int j = set.find(poll.end);if (i != j) { // 未相交list.add(poll);set.union(i, j); // 相交}
}

其它贪心的例子

  • 选择排序、堆排序

  • 拓扑排序

  • 并查集合中的 union by size 和 union by height

  • 哈夫曼编码

  • 钱币找零,英文搜索关键字

    • change-making problem
    • find Minimum number of Coins
  • 任务编排

  • 求复杂问题的近似解

2) 零钱兑换问题

有几个解(零钱兑换 II)Leetcode 518
public class Leetcode518 {public int change(int[] coins, int amount) {return rec(0, coins, amount, new LinkedList<>(), true);}/*** 求凑成剩余金额的解的个数** @param index     当前硬币索引* @param coins     硬币面值数组* @param remainder 剩余金额* @param stack     -* @param first     -* @return 解的个数*/public int rec(int index, int[] coins, int remainder, LinkedList<Integer> stack, boolean first) {if(!first) {stack.push(coins[index]);}// 情况1:剩余金额 < 0 - 无解int count = 0;if (remainder < 0) {print("无解:", stack);}// 情况2:剩余金额 == 0 - 有解else if (remainder == 0) {print("有解:", stack);count = 1;}// 情况3:剩余金额 > 0 - 继续递归else {for (int i = index; i < coins.length; i++) {count += rec(i, coins, remainder - coins[i], stack, false);}}if (!stack.isEmpty()) {stack.pop();}return count;}private static void print(String prompt, LinkedList<Integer> stack) {ArrayList<Integer> print = new ArrayList<>();ListIterator<Integer> iterator = stack.listIterator(stack.size());while (iterator.hasPrevious()) {print.add(iterator.previous());}System.out.println(prompt + print);}public static void main(String[] args) {Leetcode518 leetcode = new Leetcode518();
//        int count = leetcode.coinChange(new int[]{1, 5, 10, 25}, 41);
//        int count = leetcode.coinChange(new int[]{25, 10, 5, 1}, 41);
//        int count = leetcode.coinChange(new int[]{5, 2, 1}, 5);
//        int count = leetcode.coinChange(new int[]{1, 2, 5}, 5);int count = leetcode.change(new int[]{15, 10, 1}, 21);System.out.println(count);}}
最优解(零钱兑换)- 穷举法 Leetcode 322
public class Leetcode322 {static int min = -1; // 需要的最少硬币数  2 3public int coinChange(int[] coins, int amount) {rec(0, coins, amount, new AtomicInteger(-1), new LinkedList<>(), true);return min;}// count 代表某一组合 钱币的总数public void rec(int index, int[] coins, int remainder, AtomicInteger count, LinkedList<Integer> stack, boolean first) {if (!first) {stack.push(coins[index]);}count.incrementAndGet(); // count++if (remainder == 0) {System.out.println(stack);if (min == -1) {min = count.get();} else {min = Integer.min(min, count.get());}} else if (remainder > 0) {for (int i = index; i < coins.length; i++) {rec(i, coins, remainder - coins[i], count, stack, false);}}count.decrementAndGet(); // count--if (!stack.isEmpty()) {stack.pop();}}public static void main(String[] args) {Leetcode322 leetcode = new Leetcode322();
//        int count = leetcode.coinChange(new int[]{5, 2, 1}, 5);int count = leetcode.coinChange(new int[]{25, 10, 5, 1}, 41);
//        int count = leetcode.coinChange(new int[]{2}, 3);
//        int count = leetcode.coinChange(new int[]{15, 10, 1}, 21);System.out.println(count);}
}
最优解(零钱兑换)- 贪心法 Leetcode 322
public class Leetcode322 {public int coinChange(int[] coins, int amount) {int remainder = amount;int count = 0;for (int coin : coins) {while (remainder - coin > 0) {remainder -= coin;count++;}if (remainder - coin == 0) {remainder = 0;count++;break;}}if (remainder > 0) {return -1;} else {return count;}}public static void main(String[] args) {Leetcode322 leetcode = new Leetcode322();int count = leetcode.coinChange(new int[]{5, 2, 1}, 5);
//        int count = leetcode.coinChange(new int[]{25, 10, 5, 1}, 41);
//        int count = leetcode.coinChange(new int[]{2}, 3);// 问题1 没有回头,导致找到更差的解
//        int count = leetcode.coinChange(new int[]{15, 10, 1}, 21);  // 问题2 没有回头,导致无解
//        int count = leetcode.coinChange(new int[]{15, 10}, 20);  System.out.println(count);}
}

3) Huffman 编码问题

问题引入

什么是编码?

简单说就是建立【字符】到【数字】的对应关系,如下面大家熟知的 ASC II 编码表,例如,可以查表得知字符【a】对应的数字是十六进制数【0x61】

\000102030405060708090a0b0c0d0e0f
0000000102030405060708090a0b0c0d0e0f
0010101112131415161718191a1b1c1d1e1f
002020!"#$%&()*+,-./
00300123456789:;<=>?
0040@ABCDEFGHIJKLMNO
0050PQRSTUVWXYZ[\]^_
0060`abcdefghijklmno
0070pqrstuvwxyz{|}~7f

注:一些直接以十六进制数字标识的是那些不可打印字符

传输时的编码

  • java 中每个 char 对应的数字会占用固定长度 2 个字节
  • 如果在传输中仍采用上述规则,传递 abbccccccc 这 10 个字符
    • 实际的字节为 0061006200620063006300630063006300630063(16进制表示)
    • 总共 20 个字节,不经济

现在希望找到一种最节省字节的传输方式,怎么办?

假设传输的字符中只包含 a,b,c 这 3 个字符,有同学重新设计一张二进制编码表,见下图

  • 0 表示 a
  • 1 表示 b
  • 10 表示 c

现在还是传递 abbccccccc 这 10 个字符

  • 实际的字节为 01110101010101010 (二进制表示)
  • 总共需要 17 bits,也就是 2 个字节多一点,行不行?

不行,因为解码会出现问题,因为 10 会被错误的解码成 ba,而不是 c

  • 解码后结果为 abbbababababababa,是错误的

怎么解决?必须保证编码后的二进制数字,要能区分它们的前缀(prefix-free)

用满二叉树结构编码,可以确保前缀不重复

在这里插入图片描述

  • 向左走 0,向右走 1
  • 走到叶子字符,累计起来的 0 和 1 就是该字符的二进制编码

再来试一遍

  • a 的编码 0
  • b 的编码 10
  • c 的编码 11

现在还是传递 abbccccccc 这 10 个字符

  • 实际的字节为 0101011111111111111(二进制表示)
  • 总共需要 19 bits,也是 2 个字节多一点,并且解码没有问题了,行不行?

这回解码没问题了,但并非最少字节,因为 c 的出现频率高(7 次)a 的出现频率低(1 次),因此出现频率高的字符编码成短数字更经济

考察下面的树

在这里插入图片描述

  • 00 表示 a
  • 01 表示 b
  • 1 表示 c

现在还是传递 abbccccccc 这 10 个字符

  • 实际的字节为 000101 1111111 (二进制表示)
  • 总共需要 13 bits,这棵树就称之为 Huffman 树
  • 根据 Huffman 树对字符和数字进行编解码,就是 Huffman 编解码
Huffman 树
public class HuffmanTree {/*Huffman 树的构建过程1. 将统计了出现频率的字符,放入优先级队列2. 每次出队两个频次最低的元素,给它俩找个爹3. 把爹重新放入队列,重复 2~34. 当队列只剩一个元素时,Huffman 树构建完成*/static class Node {Character ch; // 字符int freq;     // 频次Node left;Node right;String code;  // 编码public Node(Character ch) {this.ch = ch;}public Node(int freq, Node left, Node right) {this.freq = freq;this.left = left;this.right = right;}int freq() {return freq;}boolean isLeaf() {return left == null;}@Overridepublic String toString() {return "Node{" +"ch=" + ch +", freq=" + freq +'}';}}String str;Map<Character, Node> map = new HashMap<>();public HuffmanTree(String str) {this.str = str;// 功能1:统计频率char[] chars = str.toCharArray();for (char c : chars) {/*if (!map.containsKey(c)) {map.put(c, new Node(c));}Node node = map.get(c);node.freq++;*/Node node = map.computeIfAbsent(c, Node::new);node.freq++;}// 功能2: 构造树PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(Node::freq));queue.addAll(map.values());while (queue.size() >= 2) {Node x = queue.poll();Node y = queue.poll();int freq = x.freq + y.freq;queue.offer(new Node(freq, x, y));}Node root = queue.poll();// 功能3:计算每个字符的编码, 功能4:字符串编码后占用 bitsint sum = dfs(root, new StringBuilder());for (Node node : map.values()) {System.out.println(node + " " + node.code);}System.out.println("总共会占用 bits:" + sum);}private int dfs(Node node, StringBuilder code) {int sum = 0;if (node.isLeaf()) {node.code = code.toString();sum = node.freq * code.length();} else {sum += dfs(node.left, code.append("0"));sum += dfs(node.right, code.append("1"));}if (code.length() > 0) {code.deleteCharAt(code.length() - 1);}return sum;}public static void main(String[] args) {new HuffmanTree("abbccccccc");}
}

注意

  • Node::new 是一个 Function,根据 key(即字符)生成 Node 对象
  • 对应的是 public Node(Character ch) 有参构造
Huffman 编解码

补充两个方法,注意为了简单期间用了编解码都用字符串演示,实际应该按 bits 编解码

public class HuffmanTree {// ...// 编码public String encode() {char[] chars = str.toCharArray();StringBuilder sb = new StringBuilder();for (char c : chars) {sb.append(map.get(c).code);}return sb.toString();}// 解码public String decode(String str) {/*从根节点,寻找数字对应的字符数字是 0 向左走数字是 1 向右走如果没走到头,每走一步数字的索引 i++走到头就可以找到解码字符,再将 node 重置为根节点*/char[] chars = str.toCharArray();int i = 0;StringBuilder sb = new StringBuilder();Node node = root;while (i < chars.length) {if (!node.isLeaf()) { // 非叶子if(chars[i] == '0') { // 向左走node = node.left;} else if(chars[i] == '1') { // 向右走node = node.right;}i++;}if (node.isLeaf()) {sb.append(node.ch);node = root;}}return sb.toString();}@SuppressWarnings("all")public static void main(String[] args) {HuffmanTree tree = new HuffmanTree("abbccccccc");String encoded = tree.encode();System.out.println(encoded);System.out.println(tree.decode(encoded));}
}

注意

  • 循环中非叶子节点 i 要自增,但叶子节点 i 暂不自增
  • 第一个非叶子的 if 判断结束后,仍需要第二个叶子的 if 判断,因为在第一个 if 内 node 发生了变化
相关题目
题目编号题目标题算法思路
1167(Plus 题目)连接棒材的最低费用Huffman 树、贪心

参考解答

/*** <h3>连接棒材的最低费用</h3>* <p>为了装修新房,你需要加工一些长度为正整数的棒材。如果要将长度分别为 X 和 Y 的两根棒材连接在一起,你需要支付 X + Y 的费用。 返回讲所有棒材连成一根所需要的最低费用。</p>*/
public class Leetcode1167 {/*举例 棒材为 [1,8,3,5]如果以如下顺序连接(非最优)- 1+8=9- 9+3=12- 12+5=17总费用为 9+12+17=38如果以如下顺序连接(最优)- 1+3=4- 4+5=9- 8+9=17总费用为 4+9+17=30*/int connectSticks(int[] sticks) {PriorityQueue<Integer> queue = new PriorityQueue<>();for (int stick : sticks) {queue.offer(stick);}int sum = 0;while (queue.size() >= 2) {Integer x = queue.poll();Integer y = queue.poll();int c = x + y;sum += c;queue.offer(c);}return sum;}public static void main(String[] args) {Leetcode1167 leetcode = new Leetcode1167();System.out.println(leetcode.connectSticks(new int[]{1, 8, 3, 5})); // 30System.out.println(leetcode.connectSticks(new int[]{2, 4, 3})); // 14}
}

4) 活动选择问题

public class ActivitySelectionProblem {/*要在一个会议室举办 n 个活动- 每个活动有它们各自的起始和结束时间- 找出在时间上互不冲突的活动组合,能够最充分利用会议室(举办的活动次数最多)例10   1   2   3   4   5   6   7   8   9|-------)|-------)|-------)例20   1   2   3   4   5   6   7   8   9|---)|---)|-----------------------)|-------)|---)|---------------)几种贪心策略1. 优先选择持续时间最短的活动0   1   2   3   4   5   6   7   8   9|---------------)|-------)|---------------)2. 优先选择冲突最少的活动0   1   2   3   4   5   6   7   8   9|-------)                                       3|-------)                                   4|-------)                                   4|-------)                                   4|-------)                               4|-------)                           2|-----------)                   4|-------)               4|-------)               4|-------)               4|-------)           33. 优先选择最先开始的活动0   1   2   3   4   5   6   7   8   9|-----------------------------------)|---)|---)|---)4. 优先选择最后结束的活动*/static class Activity {int index;int start;int finish;public Activity(int index, int start, int finish) {this.index = index;this.start = start;this.finish = finish;}@Overridepublic String toString() {return "Activity(" + index + ")";}}public static void main(String[] args) {Activity[] activities = new Activity[]{new Activity(0, 1, 3),new Activity(1, 2, 4),new Activity(2, 3, 5)};
//        Activity[] activities = new Activity[]{
//                new Activity(0, 1, 2),
//                new Activity(1, 3, 4),
//                new Activity(2, 0, 6),
//                new Activity(3, 5, 7),
//                new Activity(4, 8, 9),
//                new Activity(5, 5, 9)
//        };select(activities, activities.length);}public static void select(Activity[] activities, int n) {List<Activity> result = new ArrayList<>();int i, j;i = 0;result.add(activities[i]);for (j = 1; j < n; j++) {if (activities[j].start >= activities[i].finish) {result.add(activities[j]);i = j;}}System.out.println(result);}
}
无重叠区间-Leetcode 435
题目编号题目标题算法思路
435无重叠区间贪心

参考解答

// 下面代码为 Leetcode 435 题解
public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));int i, j;i = 0;int count = 1;for (j = 1; j < intervals.length; j++) {if (intervals[j][0] >= intervals[i][1]) {i = j;count++;}}return intervals.length - count;
}
  • 找到不重叠的最多的活动数(count),即活动选择问题原始需求
  • 在此基础上,活动总数 - count,就是题目要的排除数量

5) 分数背包问题

贪心法
public class FractionalKnapsackProblem {/*1. n个物品都是液体,有重量和价值2. 现在你要取走 10升 的液体3. 每次可以不拿,全拿,或拿一部分,问最高价值是多少编号 重量(升) 价值0   4       24      水1   8       160     牛奶       选中 7/82   2       4000    五粮液     选中3   6       108     可乐4   1       4000    茅台       选中8140简化起见,给出的数据都是【价值/重量】能够整除,避免计算结果中出现小数,增加心算难度*/static class Item {int index;int weight;int value;public Item(int index, int weight, int value) {this.index = index;this.weight = weight;this.value = value;}int unitPrice() {return value / weight;}@Overridepublic String toString() {return "Item(" + index + ")";}}public static void main(String[] args) {Item[] items = new Item[]{new Item(0, 4, 24),new Item(1, 8, 160),new Item(2, 2, 4000),new Item(3, 6, 108),new Item(4, 1, 4000),};select(items, 10);}static void select(Item[] items, int total) {Arrays.sort(items, Comparator.comparingInt(Item::unitPrice).reversed());int remainder = total;int max = 0;for (Item item : items) {if (remainder - item.weight > 0) {max += item.value;remainder -= item.weight;} else {max += remainder * item.unitPrice();break;}}System.out.println("最高价值为:" + max);}}

6) 0-1 背包问题

贪心法

可能得不到最优解

public class KnapsackProblem {/*1. n个物品都是固体,有重量和价值2. 现在你要取走不超过 10克 的物品3. 每次可以不拿或全拿,问最高价值是多少编号 重量(g)  价值(元)0   1       1_000_000      钻戒一枚1   4       1600           黄金一块2   8       2400           红宝石戒指一枚3   5       30             白银一块*/static class Item {int index;int weight;int value;public Item(int index, int weight, int value) {this.index = index;this.weight = weight;this.value = value;}public int unitValue() {return value / weight;}@Overridepublic String toString() {return "Item(" + index + ")";}}public static void main(String[] args) {Item[] items = new Item[]{new Item(0, 1, 1_000_000),new Item(1, 4, 1600),new Item(2, 8, 2400),new Item(3, 5, 30)};select(items, 10);}static void select(Item[] items, int total) {Arrays.sort(items, Comparator.comparingInt(Item::unitValue).reversed());int max = 0; // 最大价值for (Item item : items) {System.out.println(item);if (total >= item.weight) { // 可以拿完total -= item.weight;max += item.value;} else { // 拿不完
//                max += total * item.unitValue();
//                break;}}System.out.println("最大价值是:" + max);}
}

贪心算法的局限

问题名称是否能用贪心得到最优解替换解法
Dijkstra(不存在负边)✔️
Dijkstra(存在负边)Bellman-Ford
Prim✔️
Kruskal✔️
零钱兑换动态规划
Huffman 树✔️
活动选择问题✔️
分数背包问题✔️
0-1 背包问题动态规划

7) Set cover problem

集合覆盖问题

本文,已收录于,我的技术网站 pottercoding.cn,有大厂完整面经,工作技术,架构师成长之路,等经验分享!

相关文章:

【数据结构与算法】Greedy Algorithm

1) 贪心例子 称之为贪心算法或贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为没有考虑所有可能&#xff0c;局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前状态下最好…...

Ubuntu22.04之mpv播放器高频快捷键(二百七十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

新闻推荐系统:Spring Boot的可扩展性

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

目录工具类 - C#小函数类推荐

此文记录的是目录工具类。 /***目录工具类Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhdim163.comBlog: http://lzhdim.cnblogs.comDate: 2024-01-15 15:18:00***/namespace Lzhdim.LPF.Utility {using System.IO;/// <summary>/// The Objec…...

速盾:如何判断高防服务器的防御是否真实?

随着网络攻击日益增多和攻击手段的不断升级&#xff0c;保护网络安全变得越来越重要。高防服务器作为一种提供网络安全保护的解决方案&#xff0c;受到了越来越多的关注。然而&#xff0c;对于用户来说&#xff0c;如何判断高防服务器的防御是否真实&#xff0c;是否能够真正保…...

MySQL连接查询:联合查询

先看我的表结构 emp表 联合查询的关键字&#xff08;union all, union&#xff09; 联合查询 基本语法 select 字段列表 表A union all select 字段列表 表B 例子&#xff1a;将薪资低于5000的员工&#xff0c; 和 年龄大于50 岁的员工全部查询出来 第一种 select * fr…...

Gitea 数据迁移

一、从 Windows 迁移 Gitea 1. 备份 Gitea 数据 1.1 备份仓库文件 在 Windows 中&#xff0c;Gitea 仓库文件通常位于 C:\gitea\data\repositories。你可以使用压缩工具将该目录打包&#xff1a; 1.&#xff09;右键点击 C:\gitea\data\repositories 目录&#xff0c;选择 “…...

MySQL 绪论

数据库相关概念 数据库&#xff08;DB&#xff09;&#xff1a;存储数据的仓库数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;操纵和管理数据库的大型软件SQL&#xff1a;操纵关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库的统一标准主流的关系型数…...

什么是 HTTP Get + Preflight 请求

当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时&#xff0c;意味着该请求涉及跨域资源共享 (CORS)&#xff0c;并且该请求被预检了。理解这种请求的背景&#xff0c;主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …...

(JAVA)开始熟悉 “二叉树” 的数据结构

1. 二叉树入门 ​ 符号表的增删查改操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的。时间复杂度都是O(n)&#xff0c;为了提高运算效率&#xff0c;下面将学习 树 这种数据结构 1.1 树的基本定义 ​ 树是我们计算机中非常重要的一种数据结构&#xf…...

【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)

文章目录 一、前言1.1、Linux的文件结构是一颗从 根目录/ 开始的一个多叉树。1.2、绝对路径与相对路径1.3、命令的本质是可执行文件。1.4、家目录 二、文件管理2.1、文件操作1、pwd2、ls3、cd4、touch5、mkdir6、cp7、rm8、mv9、rmdir 2.2、查看文件1、cat2、more3、less4、hea…...

Hadoop大数据入门——Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法&#xff0c;在语法描述中出现&#xff1a; []&#xff0c;表示可选&#xff0c;如上[LOCATI…...

个人开发主页

网站 GitHubCSDN知乎豆包Google百度 多媒体 ffmpeg媒矿工厂videolanAPPLE开发者官网华为开发者官网livevideostack高清产业联盟github-xhunmon/VABloggithub-0voice/audio_video_streamingdoom9streamingmediaFourCC-wiki17哥Depth.Love BlogOTTFFmpeg原理介绍wowzavicuesof…...

思维+数论,CF 922C - Cave Painting

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 922C - Cave Painting 二、解题报告 1、思路分析 诈骗题 我们发现 n mo…...

如何下单PCB板和STM贴片服务- 嘉立创EDA

1 PCB 下单 1.1 PCB 设计好&#xff0c;需要进行DRC 检查。 1.2 生成gerber文件、坐标文件和BOM文件 1.3 打开嘉立创下单助手 上传gerber文件 1.4 选择下单数量 1.5 选择板材&#xff0c; 一般常用板材 PR4 板材。 1.6 如果需要阻抗匹配&#xff0c;需要选择设计的时候阻抗叠…...

MySQL连接查询:外连接

先看我的表结构 dept表 emp表 外连接分为 1.左外连接 2.右外连接 1.左外连接 基本语法 select 字段列表 FORM 表1 LEFT [OUTER] JOIN 表2 ON 条件;例子&#xff1a;查询emp表的所有数据&#xff0c;和对应部门的员工信息&#xff08;左外连接&#xff09; select e.*, d.n…...

108页PPT丨OGSM战略规划框架:实现企业目标的系统化方法论

OGSM战略规划框架是一种实现企业目标的系统化方法论&#xff0c;它通过将组织的目标&#xff08;Objectives&#xff09;、目标&#xff08;Goals&#xff09;、策略&#xff08;Strategies&#xff09;和衡量指标&#xff08;Measures&#xff09;进行系统化整合&#xff0c;确…...

文件查找与打包压缩,文件发送

grep&#xff1a;文件内容过滤 [roothostname ~]# grep root /etc/passwd从/etc/passwd文件中过滤root字段 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [roothostname ~]# grep nologin$ /etc/passwd //$以..结尾 ^以..开头 b…...

sv标准研读第十二章-过程性编程语句

书接上回&#xff1a; sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…...

MySQL-联合查询

1.简介 1.1为什么要使用联合查询 在数据设计时由于范式的要求&#xff0c;数据被拆分到多个表中&#xff0c;那么要查询⼀个条数据的完整信息&#xff0c;就 要从多个表中获取数据&#xff0c;如下图所⽰&#xff1a;要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获…...

突触可塑性与STDP:神经网络中的自我调整机制

突触可塑性与STDP&#xff1a;神经网络中的自我调整机制 在神经网络的学习过程中&#xff0c;突触可塑性&#xff08;Synaptic Plasticity&#xff09;是指神经元之间的连接强度&#xff08;突触权重&#xff09;随着时间的推移而动态变化的能力。这种调整机制使神经网络能够通…...

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)

文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询&#xff08;boundary边界&#xff09;3.2 快速查询&#xff08;railway铁路&#xff09;3.3 快速查询&#xff08;boundaryadmin_level行政边界&#xff09;3.4 快速查询&#xff0…...

推荐一款强大的书签管理工具,让你的网址不在落灰

在信息爆炸的互联网时代&#xff0c;我们每天都会浏览大量的网页&#xff0c;收藏各种各样的网址。然而&#xff0c;随着时间的推移&#xff0c;这些杂乱无章的书签往往让我们感到头疼。别担心&#xff0c;今天我要向你推荐一款强大的书签管理工具&#xff0c;它将帮助你轻松整…...

Python 工具库每日推荐 【Matplotlib】

文章目录 引言Python数据可视化库的重要性今日推荐:Matplotlib工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:数据分析可视化案例分析高级特性自定义样式动画效果3D绘图性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 T…...

在远程非桌面版Ubuntu中使用Qt5构建Hello World项目

在 Linux 下运行 Qt 应用程序&#xff0c;需要完成以下几个步骤&#xff0c;包括安装 Qt 工具、设置开发环境以及编译和运行项目。下面是详细的步骤&#xff1a; 1. 安装 Qt 1.1使用系统包管理器 sudo apt update 和 sudo apt install qt5-default qtcreator 命令用于更新 U…...

netty之基础aio,bio,nio

前言 在Java中&#xff0c;提供了一些关于使用IO的API&#xff0c;可以供开发者来读写外部数据和文件&#xff0c;我们称这些API为Java IO。IO是Java中比较重要知识点&#xff0c;且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能&#xff0c;目前有三种IO共…...

在找工作吗?给你一个AI虚拟面试官助力你提前准备面试

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 让AI点亮我们的生活&#xff0c;是Shelly对…...

@KafkaListener注解中containerFactory属性的作用

在使用Spring Kafka时&#xff0c;containerFactory 属性是 KafkaListener 注解中的一个选项&#xff0c;它允许你指定一个 ContainerFactory Bean 的名称。这个 ContainerFactory 负责创建和管理 Kafka 消息监听容器。 以下是 containerFactory 属性的一些关键作用&#xff1…...

1006C简单题(计数式子的组合意义 + dp式子联立)

http://cplusoj.com/d/senior/p/SS241006C 对于这个式子&#xff0c;我们可以从它的组合意义入手。 假设我们有 n 1 n1 n1 个白球要染色&#xff0c;中间有一个绿球&#xff0c;绿球左边有 a a a 个红球&#xff0c;右边有 b b b 球。染完后绿球左边每个白球有 x x x 的贡…...

千益畅行,旅游创业新模式的创新与发展

旅游创业的时代背景与旅游卡的崛起&#xff0c;在当今快节奏的时代&#xff0c;旅行成为人们生活中的重要部分&#xff0c;随着科技发展和市场需求的变化&#xff0c;旅游创业项目中的旅游卡应运而生。 其中&#xff0c;“千益畅行” 旅游卡作为新兴力量&#xff0c;在共享经济…...