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

第十天——贪心算法——深度总结

文章目录

贪心算法深度解析:原理与应用

1. 贪心算法的基本原理

1.1 贪心选择性质

1.2 最优子结构

1.3 贪心算法与动态规划的对比

2. 贪心算法的应用场景

3. 具体应用案例

3.1 分配饼干 (Assign Cookies)

3.2 分糖果 (Candy Distribution)

3.3 种花问题 (Can Place Flowers)

3.4 区间问题 (Non-overlapping Intervals)

3.5 射气球 (Minimum Number of Arrows to Burst Balloons)

3.6 广播台覆盖问题 (Set Covering Problem)

3.7 硬币找零问题 (Coin Change - Greedy Approach)

3.8 股票买卖问题 (Best Time to Buy and Sell Stock II)

3.9 分数背包问题 (Fractional Knapsack)

3.10 字符串分割 (Partition Labels)

3.11 队列重构问题 (Queue Reconstruction by Height)

3.12 非递减数组 (Non-decreasing Array)

3.13 迪克斯特拉算法 (Dijkstra’s Algorithm)

3.14 霍夫曼编码 (Huffman Coding)

4. 总结


贪心算法深度解析:原理与应用

贪心算法(Greedy Algorithm)是一种简单而高效的算法设计策略,其核心思想是在每一步决策中选择当前最优解,期望通过一系列局部最优选择最终获得全局最优解。相比动态规划等方法,贪心算法通常更高效,但适用范围有限,需要问题具备特定的性质。本报告将系统介绍贪心算法的原理、应用场景,并通过14个由易到难的案例深入剖析其应用,帮助读者掌握其精髓并在实践中灵活运用。


1. 贪心算法的基本原理

1.1 贪心选择性质

贪心选择性质是贪心算法的核心,指每一步的局部最优选择能够逐步构建全局最优解。这种性质要求问题具有“无后效性”,即当前选择不会影响后续决策的正确性。例如,在活动选择问题中,选择结束时间最早的活动不会限制后续选择。

1.2 最优子结构

最优子结构是指问题的最优解由子问题的最优解组成。在贪心算法中,通过不断缩小问题规模,最终能够得到全局最优解。例如,最小生成树问题中,每一步选择的边都会成为最终解的一部分。

1.3 贪心算法与动态规划的对比

  • 动态规划:通过记录所有子问题的解来构建全局最优解,时间复杂度较高(如 O(n²) 或更高)。
  • 贪心算法:直接选择当前最优解,不回溯,时间复杂度通常较低(如 O(n log n) 或 O(n))。
  • 局限性:贪心算法要求问题满足贪心选择性质,否则可能无法得到最优解。

2. 贪心算法的应用场景

贪心算法适用于以下常见领域:

  • 调度问题:如活动选择、任务调度。
  • 背包问题:如分数背包问题。
  • 图论问题:如最小生成树(Kruskal、Prim)、单源最短路径(Dijkstra)。
  • 编码与压缩:如霍夫曼编码。
  • 资源分配:如分配饼干、种花问题。

这些问题通常具备贪心选择性质和最优子结构,使得局部最优选择能够逐步逼近全局最优解。


3. 具体应用案例

以下是14个由易到难的贪心算法应用案例,每个案例包含问题描述、贪心策略、代码实现和分析,代码以 Python 实现并附有注释。

3.1 分配饼干 (Assign Cookies)

问题描述
有一群孩子和一堆饼干,每个孩子有饥饿度,每个饼干有饱腹度。每个孩子只能吃一个饼干,且饼干饱腹度需不小于孩子饥饿度。求最多有多少孩子能吃饱。

贪心策略
优先为饥饿度最小的孩子分配刚好能满足的最小饼干,最大化利用饼干资源。

代码实现

def findContentChildren(children: list[int], cookies: list[int]):children.sort()  # 按饥饿度升序cookies.sort()   # 按饱腹度升序child_i, cookie_i = 0, 0while child_i < len(children) and cookie_i < len(cookies):if children[child_i] <= cookies[cookie_i]:  # 饼干能满足孩子child_i += 1  # 下一个孩子cookie_i += 1  # 下一块饼干return child_i# 示例
print(findContentChildren([1, 2], [1, 2, 3]))  # 输出: 2

分析
通过对孩子和饼干排序,使用双指针技术从小到大分配,确保饼干资源高效利用。时间复杂度 O(n log n),空间复杂度 O(1)。


3.2 分糖果 (Candy Distribution)

问题描述
一群孩子站成一排,每个孩子有评分,评分高的孩子需比相邻孩子多糖果,每人至少一个,求最少糖果数。

贪心策略
两次遍历,从左到右和从右到左调整糖果数,满足相邻约束。

代码实现

def candy(ratings: list[int]):n = len(ratings)candies = [1] * n  # 初始每人一个for i in range(1, n):  # 从左到右if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1for i in range(n - 1, 0, -1):  # 从右到左if ratings[i] < ratings[i - 1]:candies[i - 1] = max(candies[i - 1], candies[i] + 1)return sum(candies)# 示例
print(candy([1, 0, 2]))  # 输出: 5

分析
两次遍历确保评分高的孩子糖果多,最小化总糖果数。时间复杂度 O(n),空间复杂度 O(n)。


3.3 种花问题 (Can Place Flowers)

问题描述
给定花坛数组 flowerbed(0 表示空,1 表示有花)和整数 n,判断能否种下 n 朵花,新种的花不能相邻。

贪心策略
尽可能早地在满足条件的位置种花,确保左右两侧为空(或在边界)。

代码实现

def canPlaceFlowers(flowerbed, n):count = 0length = len(flowerbed)for i in range(length):if flowerbed[i] == 0:left_empty = (i == 0) or (flowerbed[i - 1] == 0)right_empty = (i == length - 1) or (flowerbed[i + 1] == 0)if left_empty and right_empty:flowerbed[i] = 1  # 种花count += 1if count >= n:return Truereturn count >= n# 示例
print(canPlaceFlowers([1, 0, 0, 0, 1], 1))  # 输出: True

分析
通过线性扫描并在满足条件时种花,贪心策略最大化种植数量。时间复杂度 O(n),空间复杂度 O(1)。


3.4 区间问题 (Non-overlapping Intervals)

问题描述
给定多个区间,计算让它们互不重叠(起止相连不算重叠)所需移除的最少区间数。

贪心策略
按结束时间排序,优先保留结束最早的区间,为后续区间留出更多空间。

代码实现

def eraseOverlapIntervals(intervals: list[list[int]]):intervals.sort(key=lambda x: x[1])  # 按结束时间排序removed, prev_end = 0, intervals[0][1]for i in range(1, len(intervals)):if prev_end > intervals[i][0]:  # 重叠,移除当前区间removed += 1else:prev_end = intervals[i][1]  # 更新结束时间return removed# 示例
print(eraseOverlapIntervals([[1, 2], [2, 4], [1, 3]]))  # 输出: 1

分析
按结束时间排序后,选择不重叠的区间,贪心策略最小化移除数量。时间复杂度 O(n log n),空间复杂度 O(1)。


3.5 射气球 (Minimum Number of Arrows to Burst Balloons)

问题描述
给定气球的水平直径区间 points,求最少需要多少支箭射爆所有气球。

贪心策略
按结束位置排序,在最早结束的气球右端点射箭,覆盖尽可能多的气球。

代码实现

def findMinArrowShots(points):if not points:return 0points.sort(key=lambda x: x[1])  # 按结束位置排序count = 1last_shot = points[0][1]for start, end in points:if start > last_shot:  # 不重叠,需新箭count += 1last_shot = endreturn count# 示例
print(findMinArrowShots([[10, 16], [2, 8], [1, 6], [7, 12]]))  # 输出: 2

分析
通过在重叠区间的公共点射箭,贪心策略最小化箭数。时间复杂度 O(n log n),空间复杂度 O(1)。


3.6 广播台覆盖问题 (Set Covering Problem)

问题描述
给定需要覆盖的州和广播台覆盖范围,求覆盖所有州的最小广播台集合。

贪心策略
每次选择覆盖最多未覆盖州的广播台。

代码实现

states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
stations = {"kone": set(["id", "nv", "ut"]),"ktwo": set(["wa", "id", "mt"]),"kthree": set(["or", "nv", "ca"]),"kfour": set(["nv", "ut"]),"kfive": set(["ca", "az"])
}final_stations = set()
while states_needed:best_station = Nonestates_covered = set()for station, states in stations.items():covered = states_needed & statesif len(covered) > len(states_covered):best_station = stationstates_covered = coveredstates_needed -= states_coveredfinal_stations.add(best_station)# 示例
print(final_stations)  # 输出: {'kone', 'ktwo', 'kthree', 'kfive'}

分析
通过贪心选择覆盖最多新州的广播台,近似求解最小覆盖问题。时间复杂度 O(nm),n 为广播台数,m 为州数。


3.7 硬币找零问题 (Coin Change - Greedy Approach)

问题描述
给定硬币面值 coins 和金额 amt,求凑出 amt 的最少硬币数,无法凑出返回 -1。

贪心策略
优先使用面值最大的硬币。

代码实现

def coin_change_greedy(coins: list[int], amt: int) -> int:coins.sort(reverse=True)  # 按面值降序count = 0for coin in coins:while amt >= coin:amt -= coincount += 1return count if amt == 0 else -1# 示例
print(coin_change_greedy([1, 3, 4], 6))  # 输出: 2 (但注意:并非总是最优)

分析
贪心策略在特定面值组合下有效,但如 [1, 3, 4] 和金额 6,贪心得 3(4+1+1),而最优为 2(3+3)。时间复杂度 O(n + k),k 为金额除以最小面值的次数。


3.8 股票买卖问题 (Best Time to Buy and Sell Stock II)

问题描述
给定每日股票价格,可多次买卖但不能同时持有多支股票,求最大利润。

贪心策略
在每个价格上涨期间买入并卖出,累加所有正收益。

代码实现

def maxProfit(prices):max_profit = 0for i in range(1, len(prices)):if prices[i] > prices[i - 1]:  # 价格上涨max_profit += prices[i] - prices[i - 1]  # 累加利润return max_profit# 示例
print(maxProfit([7, 1, 5, 3, 6, 4]))  # 输出: 7

分析
通过捕获所有正价格差,贪心策略确保最大利润。时间复杂度 O(n),空间复杂度 O(1)。


3.9 分数背包问题 (Fractional Knapsack)

问题描述
给定物品重量 wgt、价值 val 和背包容量 cap,可选择物品的一部分,求最大价值。

贪心策略
按单位重量价值排序,优先选择单位价值最高的物品。

代码实现

class Item:def __init__(self, w: int, v: int):self.w = wself.v = vdef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:items = [Item(w, v) for w, v in zip(wgt, val)]items.sort(key=lambda x: x.v / x.w, reverse=True)  # 按单位价值降序res = 0for item in items:if item.w <= cap:  # 整件放入res += item.vcap -= item.welse:  # 部分放入res += (item.v / item.w) * capbreakreturn res# 示例
print(fractional_knapsack([10, 20, 30], [60, 100, 120], 50))  # 输出: 240

分析
通过优先选择高单位价值的物品,贪心策略最大化背包价值。时间复杂度 O(n log n),空间复杂度 O(n)。


3.10 字符串分割 (Partition Labels)

问题描述
将字符串 s 分割成尽可能多的部分,每个字母只出现在一个部分中。

贪心策略
记录每个字母的最后位置,扩展当前部分至其中字母的最远位置。

代码实现

def partition_labels(s):last_occurrence = {char: idx for idx, char in enumerate(s)}  # 字母最后位置start = end = 0result = []for i, char in enumerate(s):end = max(end, last_occurrence[char])  # 更新当前部分结束位置if i == end:  # 当前部分结束result.append(end - start + 1)start = end + 1return result# 示例
print(partition_labels("ababcbacadefegdehijhklij"))  # 输出: [9, 7, 8]

分析
通过跟踪字母的最远位置,贪心策略最大化分割数量。时间复杂度 O(n),空间复杂度 O(k)(k 为字符集大小)。


3.11 队列重构问题 (Queue Reconstruction by Height)

问题描述
给定人群数组 people,每个元素为 [h, k](身高 h,前面有 k 个身高≥h 的人),重构队列。

贪心策略
按身高降序、k 升序排序,再按 k 值插入。

代码实现

def reconstructQueue(people):people.sort(key=lambda x: (-x[0], x[1]))  # 身高降序,k 升序queue = []for p in people:queue.insert(p[1], p)  # 插入到 k 位置return queue# 示例
print(reconstructQueue([[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]))  
# 输出: [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

分析
先安排高个子再插入矮个子,确保 k 值正确。时间复杂度 O(n²),空间复杂度 O(n)。


3.12 非递减数组 (Non-decreasing Array)

问题描述
判断数组是否可通过最多修改一个元素变为非递减数组。

贪心策略
遇到逆序时,优先调整当前元素以保持单调性。

代码实现

def checkPossibility(nums):corrections = 0for i in range(len(nums) - 1):if nums[i] > nums[i + 1]:if i == 0 or nums[i - 1] <= nums[i + 1]:nums[i] = nums[i + 1]  # 降低当前值else:nums[i + 1] = nums[i]  # 提高后值corrections += 1if corrections > 1:return Falsereturn True# 示例
print(checkPossibility([3, 4, 2, 3]))  # 输出: False

分析
通过局部调整,贪心策略以最小代价维持非递减性。时间复杂度 O(n),空间复杂度 O(1)。


3.13 迪克斯特拉算法 (Dijkstra’s Algorithm)

问题描述
在带权有向图中,求从源点到所有顶点的最短路径。

贪心策略
每次选择当前距离最小的顶点,更新邻接顶点距离。

代码实现

graph = {"start": {"a": 6, "b": 2},"a": {"fin": 1},"b": {"a": 3, "fin": 5},"fin": {}
}
infinity = float("inf")
costs = {"a": 6, "b": 2, "fin": infinity}
parents = {"a": "start", "b": "start", "fin": None}
processed = []def find_lowest_cost_node(costs):lowest_cost = infinitylowest_cost_node = Nonefor node in costs:cost = costs[node]if cost < lowest_cost and node not in processed:lowest_cost = costlowest_cost_node = nodereturn lowest_cost_nodenode = find_lowest_cost_node(costs)
while node is not None:cost = costs[node]neighbors = graph[node]for n in neighbors.keys():new_cost = cost + neighbors[n]if costs[n] > new_cost:costs[n] = new_costparents[n] = nodeprocessed.append(node)node = find_lowest_cost_node(costs)# 示例
print(costs)  # 输出: {'a': 5, 'b': 2, 'fin': 6}

分析
通过贪心选择最小距离顶点,适用于无负权图。时间复杂度 O(V²),使用堆可优化至 O(E + V log V)。


3.14 霍夫曼编码 (Huffman Coding)

问题描述
构建最优前缀编码,实现数据压缩。

贪心策略
每次合并频率最低的两个节点,构建霍夫曼树。

代码实现

import heapq
from collections import defaultdictclass HuffmanNode:def __init__(self, char=None, freq=0, left=None, right=None):self.char = charself.freq = freqself.left = leftself.right = rightdef __lt__(self, other):return self.freq < other.freqdef build_frequency_table(text):frequency = defaultdict(int)for char in text:frequency[char] += 1return frequencydef build_huffman_tree(frequency):heap = []for char, freq in frequency.items():heapq.heappush(heap, HuffmanNode(char, freq))while len(heap) > 1:left = heapq.heappop(heap)right = heapq.heappop(heap)merged = HuffmanNode(freq=left.freq + right.freq, left=left, right=right)heapq.heappush(heap, merged)return heapq.heappop(heap)def build_code_dict(root, current_code, code_dict):if root is None:returnif root.char is not None:code_dict[root.char] = current_codereturnbuild_code_dict(root.left, current_code + '0', code_dict)build_code_dict(root.right, current_code + '1', code_dict)def huffman_encoding(text):if not text:return {}, Nonefrequency = build_frequency_table(text)huffman_tree = build_huffman_tree(frequency)code_dict = {}build_code_dict(huffman_tree, '', code_dict)encoded_text = ''.join(code_dict[char] for char in text)return encoded_text, code_dict# 示例
text = "huffman"
encoded_text, code_dict = huffman_encoding(text)
print(f"编码字典: {code_dict}")
print(f"编码结果: {encoded_text}")

分析
通过贪心合并低频节点,确保高频字符编码短,优化压缩率。时间复杂度 O(n log n),空间复杂度 O(n)。


4. 总结

贪心算法通过局部最优选择逼近全局最优解,适用于具备贪心选择性质和最优子结构的问题。其高效性和简洁性使其在调度、图论、资源分配等领域大放异彩。然而,其局限性在于并非所有问题都适用,使用前需验证问题性质。上述14个案例从简单到复杂,涵盖了贪心算法的多种应用场景,通过学习和实践,读者可深入理解其思想并灵活运用于实际问题。

相关文章:

第十天——贪心算法——深度总结

文章目录 贪心算法深度解析&#xff1a;原理与应用 1. 贪心算法的基本原理 1.1 贪心选择性质 1.2 最优子结构 1.3 贪心算法与动态规划的对比 2. 贪心算法的应用场景 3. 具体应用案例 3.1 分配饼干 (Assign Cookies) 3.2 分糖果 (Candy Distribution) 3.3 种花问题 (C…...

python自学笔记2 数据类型

字符串操作 f字符串&#xff1a; for index, char in enumerate(greeting_str):print(f"字符&#xff1a;{char}, 索引&#xff1a;{index}")f字符串可以方便的在字符串中插入变量 字符串切片 指定步长&#xff1a; print(greeting_str[::2])指定步长为2的取字符…...

nacos配置文件快速部署另一种方法

提交nacos配置的另一种一种方法,批命令/shell: 以下脚本直接把当前目录下的所有yaml文件一键提交到nacos上 前提是要先安装curl 以及 jq 然后 把下面的shell保存为 import-all.sh 然后 chmod x import-all.sh && ./import-all.sh 就好了. 记得修改一下的NAMESPACE_…...

RTK哪个品牌好?2025年RTK主流品牌深度解析

在测绘领域&#xff0c;RTK 技术的发展日新月异&#xff0c;选择一款性能卓越、稳定可靠的 RTK 设备至关重要。2025 年&#xff0c;市场上涌现出众多优秀品牌&#xff0c;本文将深入解析几大主流品牌的核心竞争力。 华测导航&#xff08;CHCNAV&#xff09;&#xff1a;技术创…...

游戏引擎学习第285天:“Traversables 的事务性占用”

回顾并为当天的工作做准备 我们有一个关于玩家移动的概念&#xff0c;玩家可以在点之间移动&#xff0c;而且当这些点移动时&#xff0c;玩家会随之移动。现在这个部分基本上已经在工作了。我们本来想实现的一个功能是&#xff1a;当玩家移动到某个点时&#xff0c;这个点能“…...

HNUST湖南科技大学-安卓Android期中复习

使用说明&#xff1a;除了选择判断就看习题外&#xff0c;推荐重点复习三四章多复习案例&#xff0c;这里应该是编程空题&#xff0c;把界面控件、活动单元熟悉一下。第五章&#xff08;数据存储方式&#xff0c;尤其是文件存储&#xff09;、第六章&#xff08;重点内容提供者…...

一种应用非常广泛的开源RTOS(实时操作系统):nuttx

什么是NuttX&#xff1f; NuttX&#xff08;读音接近“纳特-艾克斯”&#xff09;是一种应用非常广泛的开源RTOS&#xff08;实时操作系统&#xff09;&#xff0c;由Gregory Nutt博士主要推动开发。RTOS&#xff0c;即 Real-Time Operating System&#xff0c;直译为“实时操…...

WebSocket 客户端 DLL 模块设计说明(基于 WebSocket++ + Boost.Asio)

WebSocket 客户端 DLL 模块设计说明&#xff08;基于 WebSocket Boost.Asio&#xff09; &#x1f4cc; 目录 一、模块总览二、导出接口说明&#xff08;EXPORTS&#xff09;三、状态变量功能解读四、连接启动流程详解五、事件回调说明六、消息发送流程七、心跳与断连 JSON …...

微信小程序:封装request请求、解决请求路径问题

一、创建文件 1、创建请求文件 创建工具类文件request.js,目的是用于发送请求 二、js接口封装 1、写入接口路径 创建一个变量BASE_URL专门存储api请求地址 2、获取全局的token变量 从缓存中取出token的数据 3、执行请求 (1)方法中接收传递的参数 function request(url,…...

Ubuntu24.04 安装 5080显卡驱动以及cuda

前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来&#xff1a; sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…...

Jenkins的流水线执行shell脚本执行jar命令后项目未启动未输出日志问题处理

现象 在流水线里配置了启动脚本例如&#xff0c;nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服务器发现服务并未启动,且nohup日志里没输出日志,这样的原因是jenkins在执行完脚本后&#xff0c;就退出了这个进程。 解决 在启动脚本执行jar命令的上一步…...

Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优

Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优 一、浏览器渲染引擎级优化 1.1 合成器线程优化策略 • 分层加速:通过will-change属性创建独立的合成层 .accelerated {will-change: transform;backface-visibility: hidden; }• 光栅化策略调整:使用image-r…...

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定&#xff1f;一个进程是否可以绑定多个端口号&#xff1f; 4、部分常见指令…...

求职困境:开发、AI、运维、自动化

文章目录 问&#xff1a;我的技术栈是web全栈&#xff08;js&#xff0c;css&#xff0c;html&#xff0c;react&#xff0c;typscript&#xff09;&#xff0c;C开发&#xff0c;python开发&#xff0c;音视频图像开发&#xff0c;神经网络深度学习开发&#xff0c;运维&#…...

如何将数据从一部手机传输到另一部手机 | 5 种便捷传输方式

更换新手机可能是一种令人兴奋的体验&#xff0c;但您仍然需要解决问题 - 如何将数据从一部手机传输到另一部手机。幸运的是&#xff0c;有多种方法可以简化此过程&#xff0c;从一键式解决方案到基于云的传输。本文探讨了五种流行的技术来帮助您无缝迁移数据。 第 1 部分&…...

GEE计算 RSEI(遥感生态指数)

&#x1f6f0;️ 什么是 RSEI&#xff1f;为什么要用它评估生态环境&#xff1f; RSEI&#xff08;遥感生态指数&#xff0c;Remote Sensing Ecological Index&#xff09; 是一种通过遥感数据计算得到的、综合反映区域生态环境质量的指标体系。 它的设计初衷是用最少的变量&…...

k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标

k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标 文章目录 k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标一、Metrics Server简介二、kube-state-metrics实战部署1. 创…...

JavaScript:PC端特效--元素可视区client系列

一、client系列 client翻译过来就是客户端&#xff0c;我们使用client系列的相关属性来获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等。 client系列属性作用element.clientTop返回元素上边框的大小element.clientLeft返回元…...

Centos7 中 Docker运行配置Apache

1、拉去httpd镜像&#xff08;不加版本号&#xff0c;默认拉最新版本&#xff09; docker pull httpd 2、运行httpd docker run -di --name httpd-test -p 8080:80 httpd 3、创建文件夹后边做映射 mkdir -p /Docker/apache/www /Docker/apache/logs /Docker/apache/conf 4、…...

PostgreSQL中的全页写

一、概述 在PGSQL数据库中&#xff0c;默认的页面大小为8KB&#xff0c;但是磁盘buffer的大小为4KB&#xff0c;扇区大小为512B。这就导致在操作系统的角度看数据库的写操作&#xff0c;其实并不是一种原子操作。如果操作系统发生了系统级别的故障&#xff0c;此时正好操作系统…...

对称二叉树的判定:双端队列的精妙应用

一、题目解析 题目描述 给定一个二叉树&#xff0c;检查它是否是镜像对称的。例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的&#xff1a; 1/ \2 2/ \ / \ 3 4 4 3而 [1,2,2,null,3,null,3] 则不是镜像对称的&#xff1a; 1/ \2 2\ \3 3问题本质 判断一棵二叉…...

Redis + ABP vNext 构建分布式高可用缓存架构

&#x1f680; Redis ABP vNext 构建分布式高可用缓存架构 &#x1f527; 环境准备 开发环境 .NET 8.0 SDKVisual Studio 2022 / VS CodeDocker & Docker Compose NuGet 包 Volo.Abp.Caching.StackExchangeRedis v8.1.5Volo.Abp.DistributedLocking.StackExchangeRedis v…...

jvm第一篇《内存与垃圾回收》学习笔记第一章jvm初始

jvm是虚拟机的通称。 java实际默认的应用是hotspot&#xff08;基于栈的指令集架构&#xff09; 注&#xff1a;注意区分寄存器的指令集和栈指令集的架构。&#xff08;大概理解java移植性好就是因为是栈指令集&#xff09; jvm虚拟机&#xff0c;具有跨语言功能&#xff0…...

MySQL——3、数据类型

数据类型 1、数据类型分类2、数值类型2.1、tinyint类型2.2、bit类型2.3、小数类型2.3.1、float2.3.2、decimal 3、字符串类型3.1、char3.2、varchar3.3、char和varchar比较3.4、日期和时间类型3.5、enum和set 1、数据类型分类 2、数值类型 2.1、tinyint类型 首先创建t1表&…...

Flutter - 集成三方库:日志(logger)

日志 使用print方法时,会提示 添加依赖 $ flutter pub add logger下载依赖 $ flutter pub get使用 打印 import package:logger/logger.dart;var logger Logger(); logger.d("debug"); logger.e("error"); logger.i("info"); logger.f(&qu…...

第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理

随着你的 Express 应用变得越来越大&#xff0c;所有的路由和中间件都写在一个文件里会变得难以管理。这时候就需要将代码进行拆分和组织。此外&#xff0c;一个健壮的后端应用必须能够优雅地处理错误和一些常见的 Web 开发问题&#xff0c;比如跨域。 路由模块化 (express.Ro…...

国标GB/T 12536-90滑行试验全解析:纯电动轻卡行驶阻力模型参数精准标定

摘要 本文以国标GB/T 12536-90为核心框架&#xff0c;深度解析纯电动轻卡滑行试验的完整流程与数据建模方法&#xff0c;提供&#xff1a; 法规级试验规范&#xff1a;从环境要求到数据采集全流程详解行驶阻力模型精准标定&#xff1a;最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…...

组件导航 (Navigation)+flutter项目搭建-混合开发+分栏

组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 上一章面熟了搭建flutter并用编辑器运行了ohos项目&#xff0c;这章主要是对项目的工程化改造 先创建flutter项目&#xff0c;再配置Navigation 1.在开发视图的resources/base/profi…...

物联网中的WiFi模式解析:AP、STA与混合模式

物联网现在还是比较火的&#xff0c;各种设备都要联网&#xff0c;那么WiFi已成为设备联网的“标配”。但你是否想过&#xff0c;为什么有的设备能自己创建WiFi热点&#xff0c;有的只能连接路由器&#xff1f;为什么有些网关既能收数据又能传数据&#xff1f; 主要还是因为Wi…...

spring cloud gateway 源码解析

参考:Spring Cloud Gateway SpringCloud gateway源码走读(顺带聊聊响应式) - 掘金 1,原理图 还是从starter 开始看 要实现网关的核心概念, 肯定是需要接受请求的server ,从上面的截图看 starter-gateway 只负责了包的依赖,并没有定义自动配置 , 他依赖了starter-webf…...

游戏引擎学习第286天:开始解耦实体行为

回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段&#xff0c;之前我们已经让实体的移动系统变得更加灵活&#xff0c;现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点&#xff0c;是重新审视我们处理实体类型&#xff08;entity type&#x…...

【论文阅读】KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS

KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS Scaling的解释&#xff1a; 通过系统性的方法扩展强化学习算法的能力&#xff0c;使其能够处理更复杂的问题、更大的状态/动作空间、更长的训练周期或更高效的资源利用 原文摘要&#xff1a; 研究背景与问题定位 传统预训…...

大语言模型与多模态模型比较

一、核心差异&#xff1a;输入数据类型与模态融合 输入数据类型 LLM&#xff1a;仅处理文本数据&#xff0c;例如文本分类、机器翻译、问答等任务&#xff0c;通过大规模语料库学习语言规律。 LMM&#xff1a;支持文本、图像、音频、视频等多种模态输入&#xff0c;例如根据图…...

vscode debug node + 前端

方法 2&#xff1a;调试全栈&#xff08;Node 前端&#xff09; 如果需同时调试后端和前端&#xff1a; 分别启动两个调试会话 一个配置调试 Node.js 后端&#xff08;server.js&#xff09;。 另一个配置调试浏览器前端&#xff08;如上&#xff09;。 {// Use IntelliS…...

RK3568-鸿蒙5.1与原生固件-扇区对比分析

编译生成的固件目录地址 ../openharmony/out/rk3568/packages/phone/images鸿蒙OS RK3568固件分析 通过查看提供的信息&#xff0c;分析RK3568开发板固件的各个组件及其用途&#xff1a; 主要固件组件 根据终端输出的文件列表&#xff0c;RK3568固件包含以下关键组件&#x…...

Java线程池(Thread Pool)性能优化解析

在高性能、高并发的Java应用开发中,线程池(Thread Pool)是不可或缺的组件。它通过复用线程,避免了线程频繁创建和销毁带来的资源开销,提高了系统的响应速度和稳定性。然而,不合理的线程池配置和使用方式也可能成为系统性能瓶颈的根源。 本文旨在深入解析Java线程池的性能…...

AI重塑未来学者:研究生教育的“进化论”与“数字化生存指南

目录: 一、引言:AI浪潮下的“象牙塔”新挑战与新机遇 二、AI的“双刃剑”:深度剖析对研究生教育的颠覆性影响 1. 研究范式的革新:从“人工”到“智能” 2. 知识获取与传授方式的重塑 3. 创新能力与批判性思维的再定义 4. 伦理困境与学术诚信的新考验 三、他山之石:发达国家…...

IHttpHandler和Tcp Listener的web服务器接收上传文件有什么区别

IHttpHandler和Tcp Listener的web服务器接收上传文件有什么区别 IHttpHandler 与 TCP Listener 处理文件上传的核心区别 IHttpHandler 和 TcpListener 是ASP.NET中处理 HTTP 请求的两种不同抽象层级&#xff0c;它们在文件上传处理上存在以下关键区别&#xff1a; 1. 抽象层…...

C++ --- new与delete

new与delete 一、回顾1.malloc2.calloc3.realloc4.free 二、new与delete的特殊之处&#xff08;1&#xff09;&#xff08;2&#xff09; 三、new与delete的底层原理四、总结 一、回顾 在C语言阶段我们学习了动态内存管理&#xff1a;malloc,calloc,realloc,free。 1.malloc …...

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候&#xff0c;刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…...

Rust 学习笔记:关于 String 的练习题

Rust 学习笔记&#xff1a;关于 String 的练习题 Rust 学习笔记&#xff1a;关于 String 的练习题选出描述正确的那一个。该程序最多可能发生多少次堆的内存分配&#xff1f;哪种说法最能解释为什么 Rust 不允许字符串索引&#xff1f;哪种说法最能描述字符串切片 &str 和字…...

AG-UI 协议:重构多模态交互,开启智能应用新纪元

一、协议诞生的时代背景&#xff1a;填补 AI 生态最后一块拼图 在人工智能技术飞速发展的今天&#xff0c;AI 代理&#xff08;Agent&#xff09;作为能够主动执行复杂任务的智能实体&#xff0c;正从实验室走向生产环境&#xff0c;重塑各个行业的工作流程。然而&#xff0c;…...

网络世界的“百变身份“:动态IP让连接更自由

深夜的程序调试​​ 凌晨两点&#xff0c;我盯着电脑屏幕上的报错信息&#xff1a;"Connection timed out"。这是本周第三次测试服务器响应时被拒绝访问了——只因为之前同一个IP地址尝试登录太过频繁。正在改代码的朋友小王凑过来看了眼&#xff1a;"老兄&…...

【学习笔记】因果推理导论第1课

因果推理导论第1课 为何要做因果推理 一、辛普森悖论一个例子 二、相关不代表因果性三、什么揭示因果四、观测研究五、结论 本节课通过 一、辛普森悖论 一个例子 书中举了一个疫情两种治疗方法A,B,分析哪一个治疗方法更好的例子. 首先已知B治疗方法更稀缺,因此观测数据样本上…...

Android 中 权限分类及申请方式

在 Android 中,权限被分为几个不同的类别,每个类别有不同的申请和管理方式。 一、 普通权限(Normal Permissions) 普通权限通常不会对用户隐私或设备安全造成太大风险。这些权限在应用安装时自动授予,无需用户在运行时手动授权。 android.permission.INTERNETandroid.pe…...

深度学习算法介绍

深度学习算法是一种基于人工神经网络结构的机器学习方法&#xff0c;其核心理念是通过多层次的神经元组成的神经网络来模拟人类大脑的工作原理。以下是几种常见的深度学习算法及其简要介绍&#xff1a; 多层感知器&#xff08;Multilayer Perceptron, MLP&#xff09;&#xff…...

Java【13_1】final、初始化块、继承(测试题)

测试题 1、简述final修饰符的功能 ① 修饰类 该类不能被继承 ② 修饰变量 该变量就是常量(一旦被初始化&#xff0c;就不可以修改) ③ 修饰方法 该方法不能被重写 2、写出程序结果 (仔细认真) public class MyClass { static int x,y; static{ …...

小结:JavaScript 模块化工具链

JavaScript 模块化工具链 是现代前端开发中用于组织、管理和优化模块化代码的核心工具集合。以下是关于 JS 模块化工具链的概述&#xff0c;包括关键工具、作用和常见工作流程&#xff1a;** **1. **模块化的背景 JavaScript 模块化是为了解决代码组织、依赖管理和作用域隔离…...

RabbitMQ ④-持久化 || 死信队列 || 延迟队列 || 事务

消息确认机制 简单介绍 RabbitMQ Broker 发送消息给消费者后&#xff0c;消费者处理该消息时可能会发生异常&#xff0c;导致消费失败。 如果 Broker 在发送消息后就直接删了&#xff0c;就会导致消息的丢失。 为了保证消息可靠到达消费者并且成功处理了该消息&#xff0c;…...

十一、Hive JOIN 连接查询

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月16日 专栏&#xff1a;Hive教程 在数据分析的江湖中&#xff0c;数据往往分散在不同的“门派”&#xff08;表&#xff09;之中。要洞察数据间的深层联系&#xff0c;就需要JOIN这把利器&#xff0c;将相关联的数据串联起来…...