标准网站建设多少钱/关键词热度查询工具

标准网站建设多少钱,关键词热度查询工具,开发软件用什么工具,华为云 搭建网站什么是贪心算法 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不从整体最优上加以考虑,只做出在某种意义上的局部最优解。下面我们将通过几个案例…

什么是贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不从整体最优上加以考虑,只做出在某种意义上的局部最优解。下面我们将通过几个案例来深入了解贪心算法,并分析每个案例的算法复杂度、原理及代码执行过程。

贪心算法案例分析与应用场景

本文将详细介绍两种经典的贪心算法:哈夫曼编码和Dijkstra算法。我们将探讨它们的算法原理、代码实现、执行流程以及算法复杂度,并分析它们在实际项目中的应用场景。

1. 哈夫曼编码

算法原理

哈夫曼编码是一种用于无损数据压缩的贪心算法。它通过为输入字符构建一个最优二叉树(哈夫曼树),使得树的加权路径长度最小,从而实现最优编码。

代码示例

import heapq class Node:def __init__(self, char, freq):self.char = char self.freq = freq self.left = None self.right = None def __lt__(self, other):return self.freq < other.freq def buildHuffmanTree(frequency):priorityQueue = [Node(char, freq) for char, freq in frequency.items()]heapq.heapify(priorityQueue) while len(priorityQueue) > 1:left = heapq.heappop(priorityQueue)right = heapq.heappop(priorityQueue) merged = Node(None, left.freq + right.freq)merged.left = left merged.right = right heapq.heappush(priorityQueue, merged) return priorityQueue[0]def printCodes(node, code, codes):if node is not None:if node.char is not None:codes[node.char] = code if node.left is not None:printCodes(node.left, code + "0", codes)if node.right is not None:printCodes(node.right, code + "1", codes)frequency = {'A': 5, 'B': 9, 'C': 12, 'D': 13, 'E': 16, 'F': 45}
root = buildHuffmanTree(frequency)
codes = {}
printCodes(root, "", codes)
print(codes)  # 输出: {'A': '111', 'B': '110', 'C': '10', 'D': '01', 'E': '00', 'F': ''}
执行流程
  1. 创建一个优先队列priorityQueue,将所有字符及其频率作为节点加入队列,并按频率从小到大排序。
  2. 当队列中有多于一个节点时:
    • 弹出两个频率最小的节点leftright
    • 创建一个新节点merged,其频率为leftright之和,并将leftright作为子节点。
    • 将新节点加入优先队列。
  3. 返回队列中唯一的节点,即哈夫曼树的根节点。
  4. 使用递归遍历哈夫曼树,为每个字符生成编码,并存储在字典codes中。
应用场景

哈夫曼编码常用于数据压缩领域,如文件压缩、图像压缩等。它可以有效地减少数据的存储空间和传输时间。

算法复杂度
复杂度类型时间复杂度空间复杂度
哈夫曼编码O(n log n)O(n)

2. Dijkstra算法(最短路径问题)

算法原理

Dijkstra算法是一种用于求解单源最短路径问题的贪心算法。它通过维护一个顶点集合S,逐步将距离源点最近的顶点加入S中,并更新其他顶点的距离。

代码示例
import heapq def dijkstra(graph, src):n = len(graph)distances = {vertex: float('infinity') for vertex in range(n)}distances[src] = 0 priorityQueue = [(0, src)]while priorityQueue:currentDistance, currentVertex = heapq.heappop(priorityQueue) if currentDistance > distances[currentVertex]:continue for neighbor, weight in graph[currentVertex].items():distance = currentDistance + weight if distance < distances[neighbor]:distances[neighbor] = distance heapq.heappush(priorityQueue, (distance, neighbor))return distances graph = {0: {1: 4},1: {0: 4, 2: 8, 3: 7},2: {1: 8, 3: 9},3: {1: 7, 2: 9}
}src = 0 
distances = dijkstra(graph, src)
print(distances)  # 输出: {0: 0, 1: 4, 2: 12, 3: 7}
执行流程
  1. 初始化所有顶点到源点的距离为无穷大,源点到自身的距离为0。
  2. 创建一个优先队列priorityQueue,将源点及其距离(0)加入队列。
  3. 当优先队列非空时:
    • 弹出距离最小的顶点currentVertex及其距离currentDistance
    • 如果弹出的距离大于当前已知的距离,则跳过该顶点。
    • 对于当前顶点的每个邻居:
      • 计算通过当前顶点到达邻居的距离。
      • 如果新距离小于已知距离,则更新邻居的距离,并将其加入优先队列。
  4. 返回所有顶点到源点的距离。
应用场景

Dijkstra算法常用于路径规划、网络路由等领域。它可以快速找到从起点到其他所有点的最短路径。

算法复杂度

复杂度类型时间复杂度空间复杂度
Dijkstra算法O((n + m) * log n)O(n)

3. Kruskal算法(最小生成树问题)

算法原理

Kruskal算法是一种贪心算法,用于在加权无向图中找到最小生成树。算法的基本思想是按照边的权重从小到大的顺序选择边,同时确保不形成环。

代码示例
class UnionFind:def __init__(self):self.parent = {}def find(self, x):if x not in self.parent:self.parent[x] = x elif x != self.parent[x]:self.parent[x] = self.find(self.parent[x])return self.parent[x] def union(self, x, y):rootX = self.find(x)rootY = self.find(y)if rootX != rootY:self.parent[rootY] = rootX def kruskal(n, edges):uf = UnionFind()edges.sort(key=lambda x: x[2])result = []for u, v, weight in edges:if uf.find(u) != uf.find(v):uf.union(u, v)result.append((u, v, weight))return result n = 4 
edges = [(0, 1, 10),(0, 2, 6),(0, 3, 5),(1, 3, 15),(2, 3, 4)
]mst = kruskal(n, edges)
print(mst)  # 输出: [(0, 3, 5), (0, 2, 6), (1, 3, 15)]
执行流程
  1. 初始化并查集UnionFind
  2. 对所有边按照权重从小到大排序。
  3. 对于每条边:
    • 如果边的两个顶点不在同一个集合中,则将它们合并,并添加到结果中。
  4. 返回结果,即最小生成树的所有边。
应用场景

Kruskal算法常用于网络设计、交通规划等领域,可以有效地找到连接所有顶点的最小成本的树形结构。

算法复杂度
复杂度类型时间复杂度空间复杂度
Kruskal算法O(E log E)O(V)

4. Prim算法(最小生成树问题)

算法原理

Prim算法是一种贪心算法,用于在加权无向图中找到最小生成树。算法的基本思想是从任意一个顶点开始,逐步添加距离最小的边,直到所有顶点都被包含在树中。

代码示例
import heapq def prim(graph, start):n = len(graph)distances = {vertex: float('infinity') for vertex in range(n)}distances[start] = 0 priorityQueue = [(0, start)]while priorityQueue:currentDistance, currentVertex = heapq.heappop(priorityQueue) if currentDistance > distances[currentVertex]:continue for neighbor, weight in graph[currentVertex].items():distance = currentDistance + weight if distance < distances[neighbor]:distances[neighbor] = distance heapq.heappush(priorityQueue, (distance, neighbor))return distances graph = {0: {1: 4},1: {0: 4, 2: 8, 3: 7},2: {1: 8, 3: 9},3: {1: 7, 2: 9}
}start = 0 
mst = prim(graph, start)
print(mst)  # 输出: {0: 0, 1: 4, 2: 12, 3: 7}
执行流程
  1. 初始化所有顶点到起始顶点的距离为无穷大,起始顶点到自身的距离为0。
  2. 创建一个优先队列priorityQueue,将起始顶点及其距离(0)加入队列。
  3. 当优先队列非空时:
    • 弹出距离最小的顶点currentVertex及其距离currentDistance
    • 如果弹出的距离大于当前已知的距离,则跳过该顶点。
    • 对于当前顶点的每个邻居:
      • 计算通过当前顶点到达邻居的距离。
      • 如果新距离小于已知距离,则更新邻居的距离,并将其加入优先队列。
  4. 返回所有顶点到起始顶点的距离。
应用场景

Prim算法常用于网络设计、交通规划等领域,可以有效地找到连接所有顶点的最小成本的树形结构。

算法复杂度
复杂度类型时间复杂度空间复杂度
Prim算法O(V^2)(稠密图)或O(V log V + E)(稀疏图)O(V)

5. 最大子数组和问题

算法原理

最大子数组和问题是指在给定一个整数数组中,找到一个具有最大和的连续子数组。Kadane算法是一种高效的贪心算法,可以在线性时间内解决这个问题。

代码示例
def maxSubArray(nums):max_current = max_global = nums[0]for i in range(1, len(nums)):max_current = max(nums[i], max_current + nums[i])if max_current > max_global:max_global = max_current return max_global nums = [-2,1,-3,4,-1,2,1,-5,4]
max_sum = maxSubArray(nums)
print(max_sum)  # 输出: 6 
执行流程
  1. 初始化max_currentmax_global为数组的第一个元素。
  2. 对于数组中的每个元素:
    • 更新max_current为当前元素与当前元素加上前一个max_current的最大值。
    • 如果max_current大于max_global,则更新max_global
  3. 返回max_global,即最大子数组和。
应用场景

最大子数组和问题常用于金融数据分析、信号处理等领域,可以有效地找到给定数据中的最有利的连续区间。

算法复杂度

复杂度类型时间复杂度空间复杂度
Kadane算法O(n)O(1)

6. 分数背包问题

算法原理

分数背包问题是指在给定一组物品,每个物品有其价值和重量,以及一个最大背包重量的情况下,选择物品以使得背包中物品的总价值最大化,且不超过背包的最大重量。与0/1背包问题不同,分数背包允许将物品分割成小份。

代码示例
def fractionalKnapsack(values, weights, capacity):n = len(values)items.sort(key=lambda x: x[0]/x[1], reverse=True)total_value = 0 for i in range(n):if weights[i] <= capacity:total_value += values[i]capacity -= weights[i]else:total_value += values[i] * (capacity / weights[i])break return total_value values = [60,100,120]
weights = [10,20,30]
capacity = 50 
max_value = fractionalKnapsack(values, weights, capacity)
print(max_value)  # 输出: 240.0 
执行流程
  1. 创建一个物品列表items,包含物品的价值和重量。
  2. 对物品列表按照价值/重量比降序排序。
  3. 初始化总价值total_value为0。
  4. 对于每个物品:
    • 如果物品的重量小于等于剩余容量,则将物品的价值加到总价值,并减少剩余容量。
    • 如果物品的重量大于剩余容量,则将物品的部分价值加到总价值,并结束循环。
  5. 返回总价值,即分数背包问题的最优解。
应用场景

分数背包问题常用于资源分配、投资组合优化等领域,可以有效地在有限资源下最大化总价值。

算法复杂度
复杂度类型时间复杂度空间复杂度
分数背包O(n log n)O(n)

7. 零钱找零问题(贪心算法)

算法原理

零钱找零问题是指给定一定金额的支付和几种不同面额的硬币,要求找出能够凑成该支付金额的硬币组合,使得硬币的数量最少。贪心算法是一种简单有效的解决方案,它总是优先选择面值最大的硬币。

代码示例
def coinChange(coins, amount):coins.sort(reverse=True)count = 0 remainder = amount for coin in coins:count += remainder // coin remainder %= coin if remainder == 0:break return count if remainder == 0 else -1 coins = [1, 2, 5]
amount = 11 
result = coinChange(coins, amount)
print(result)  # 输出: 3 (5+5+1)
执行流程
  1. 将硬币面值列表coins按照面值从大到小排序。
  2. 初始化硬币计数count为0,余数remainder为待找零的金额。
  3. 对于每种硬币面值:
    • 计算当前硬币可以用于找零的次数,并累加到count
    • 更新余数remainder为剩余待找零的金额。
    • 如果余数为0,则说明已经找到最优解,结束循环。
  4. 如果循环结束后余数仍不为0,则说明无法用给定的硬币面值凑成指定金额,返回-1;否则返回硬币计数count
应用场景

零钱找零问题常用于银行、超市等需要进行货币找零的场景,可以有效地减少找零所需的硬币数量。

算法复杂度
复杂度类型时间复杂度空间复杂度
贪心算法O(n)O(1)

end~希望这些案例能帮助你更深入地理解贪心算法的应用。

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

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

相关文章

[Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)

[Windows] 极限投屏_正式版 链接&#xff1a;https://pan.xunlei.com/s/VOKJf8Z1u5z-cHcTsRpSd89tA1?pwdu5ub# 新增功能(Future)&#xff1a; 支持安卓14(Supports Android 14)提高投屏成功率(Improve the success rate of mirror)加快投屏速度(Accelerate screen mirrorin…

vite+react+ts如何集成redux状态管理工具,实现持久化缓存

1.安装插件 这里的redux-persist--进行数据的持久化缓存&#xff0c;确保页面刷新数据不会丢失 yarn add react-redux^9.2.0 redux-persist^6.0.0 reduxjs/toolkit^2.5.1 2.创建仓库文件夹 在项目的src文件夹下创建名为store的文件夹&#xff0c;里面的具体文件如下 featur…

TrustRAG:通过配置化模块化的检索增强生成(RAG)框架提高生成结果的可靠性和可追溯性

TrustRAG旨在风险感知的信息检索场景中提高生成内容的一致性和可信度。用户可以利用私有语料库构建自己的RAG应用程序&#xff0c;研究库中的RAG组件&#xff0c;并使用定制模块进行实验。论文展示了TrustRAG系统在摘要问答任务中的应用&#xff0c;并通过案例研究验证了其有效…

力扣27.移除元素(双指针)

题目看起来很乱&#xff0c;实际上意思是&#xff1a;把数组中值不等于val的元素放在下标为0,1,2,3......&#xff0c;并且返回数组中值不等于val的元素的个数 方法一&#xff1a;直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…

特辣的海藻!7

特邀嘉宾&#xff1a;滑动窗口~ 题 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 做过的题&#xff0c;再一次做&#xff0c;还是有问题。。。。我把它给解决掉&#xff01; 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 超时 …

not support ClassForName

com.alibaba.fastjson2.JSONException: not support ClassForName : java.lang.String, you can config JSONReader.Feature.SupportClassForName 官方说明中提到默认关闭&#xff0c; 可通过配置开启 JSON.config(JSONReader.Feature.SupportClassForName);

在VSCode 中使用通义灵码最新版详细教程

在 VSCode 中使用通义灵码&#xff1a;最新版详细教程与使用场景 Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的轻量级、功能强大的开源代码编辑器&#xff0c;支持多种编程语言&#xff0c;深受开发者喜爱。而通义灵码&#xff08;TONGYI Lingma…

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied

近期如果有开发者的 iOS 真机升级到 18.4 beta&#xff0c;大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示&#xff0c;其实从 log 可以很直观看出来&#xff0c;就是 Dart VM 在初始化时&#xff0c;对内核文件「解释运行&#xff08;JIT&#xff09;」时…

数据结构:反射 和 枚举

目录 一、反射 1、定义 2、反射相关的类 3、Class类 &#xff08;2&#xff09;常用获得类中属性相关的方法&#xff1a; &#xff08;3&#xff09;获得类中注解相关的方法&#xff1a; &#xff08;4&#xff09;获得类中构造器相关的方法&#xff1a; &#xff08;…

基于Electron的应用程序安全测试基础 — 提取和分析.asar文件的案例研究

目录&#xff1a; 4.4. 案例研究 4.4.2. 情况描述 4.4.3. 信息收集 4.4.3.2. 检查隐藏目录&#xff08;点目录&#xff09;的可能性 4.4.3.3. 使用 DB Browser for SQLite 打开 .db 文件 4.4.3.4. 寻找加密算法 4.4.3.5. 找到加密算法 4.4.3.6. 理解加密流程 4.4.3.7. 找到“Ke…

有关Java中的集合(2):Map<T>(底层源码分析)

学习目标 核心掌握Map集合 1.Map<K,V> ● 实现了Map接口的集合对象的集合元素&#xff1a; 成对的值 key-value 键值对 ● key对象是不能重复的. value可以重复。 ● 核心: 根据key获得value。 1.1 层级 public interface Map<K, V> {}1.2 常用方法 1.3 使用方法…

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程&#xff0c;安装 - LLaMA Factory&#xff0c;上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装&#xff0c;但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…

商米科技前端工程师(base上海)内推

1.根据原型或高保真设计&#xff0c;开发web、H5、小程序等类型的前端应用&#xff1b; 2.在指导下&#xff0c;高质量完成功能模块的开发&#xff0c;并负责各功能模块接口设计工作&#xff1b; 3.负责产品及相关支撑系统的开发及维护工作&#xff0c;不断的优化升级&#x…

HTTP四次挥手是什么?

四次挥手&#xff0c;这是TCP协议用来关闭连接的过程。四次挥手是确保两个主机之间能够安全、可靠地关闭连接的重要机制。我会用简单易懂的方式来讲解&#xff0c;帮助你理解它的原理和过程。 1. 什么是四次挥手&#xff1f; 定义 四次挥手是TCP协议用来关闭连接的过程。它通…

【iOS】小蓝书学习(七)

小蓝书学习&#xff08;七&#xff09; 前言第47条&#xff1a;熟悉系统框架第48条&#xff1a;多用枚举块&#xff0c;少用for循环第50条&#xff1a;构建缓存使选用NSCache而非NSDictionary第51条&#xff1a;精简initialize与load的实现代码第52条&#xff1a;别忘了NSTimer…

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题&#xff0c;报错说参数位置不正确 修改代码后&#xff0c;运行如下图&#xff1a; 结果&#xff1a; 希望各位也能顺利解决问题&#xff0c;祝你好运&#xff01;

drawDB:一款免费数据库设计工具

drawDB 是一款基于 Web 的免费数据库设计工具&#xff0c;通过拖拽、复制、粘贴等方式进行数据库建模设计&#xff0c;同时可以生成相应的 SQL 脚本。 功能特性 drawDB 目前可以支持 MySQL、MariaDB、PostgreSQL、SQL Server 以及 SQLite 数据库&#xff0c;核心功能包括&…

FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce

一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1. 基本查询 注意 SQL 语言大小写不敏感SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行…

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…