每日一题——Python实现PAT乙级1090 危险品装箱(举一反三+思想解读+逐步优化)4千字好文


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=1038429484026175488&page=0

我的写法

inputs=input().split()
n=int(inputs[0])
m=int(inputs[1])inhabited_cps={}
for i in range(n):  #  最终生成一个列表,每个元素为一对不相容物品编号字符串构成的列表a,b=input().split()inhabited_cps[''.join(sorted([a,b]))]=0for i in range(m):cargo_list=set(input().split()[1:])for inhabited_cp in inhabited_cps:if inhabited_cp[:5] in cargo_list and inhabited_cp[5:] in cargo_list:print("No")break  #  一旦发现清单内有不相容物品,立即开始下一清单else:print("Yes")

这段代码的主要功能是检查一组货物清单是否包含不相容的物品对。下面是对这段代码的专业点评,包括时间复杂度和空间复杂度的分析。

代码结构和功能

  1. 输入处理:
    • 首先读取两个整数 n 和 m,分别表示不相容物品对的数量和货物清单的数量。
    • 使用字典 inhabited_cps 存储不相容物品对,键为排序后的物品对字符串,值为0(实际未使用)。
  2. 不相容物品对的存储:
    • 通过循环读取 n 对不相容物品,并将每对物品排序后存储在字典中。
  3. 货物清单检查:
  • 对于每个货物清单,读取清单中的物品,并检查是否存在不相容物品对。
  • 如果发现不相容物品对,输出 "No" 并跳出当前清单的检查;否则输出 "Yes"。

时间复杂度分析

  • 不相容物品对的存储:
    • 读取和存储 n 对不相容物品的时间复杂度为 O(n),因为每次读取和存储操作都是常数时间。
  • 货物清单检查:
  • 对于每个货物清单,需要检查 m 次。每次检查的时间复杂度取决于清单中物品的数量和不相容物品对的数量。
  • 假设每个清单平均有 k 个物品,检查每个清单的时间复杂度为 O(k×len(inhabited_cps))。
  • 由于 inhabited_cps 中有 n 对不相容物品,因此每次检查的时间复杂度为 O(k×n)。
  • 总体时间复杂度为 O(m×k×n)。

空间复杂度分析

  • 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储 n 对不相容物品,空间复杂度为 O(n)。
  • 货物清单的存储:
  • 每次读取一个货物清单,使用集合 cargo_list 存储清单中的物品,空间复杂度为 O(k)。
  • 总体空间复杂度为 O(n+m×k)。

优化建议

  • 字典值的优化:
    • 字典 inhabited_cps 中的值为0,实际未使用,可以考虑移除这个值,只存储键。
  • 集合操作的优化:
    • 使用集合操作可以提高不相容物品对的检查效率,但当前代码已经使用了集合,因此这部分已经优化。
  • 提前终止:
  • 在检查每个清单时,一旦发现不相容物品对,立即终止当前清单的检查,这部分代码已经实现。

总结

这段代码的结构清晰,功能明确,但在处理大量数据时可能会有较高的时间复杂度。通过合理的数据结构选择和优化,可以进一步提高代码的效率。


我要更强

优化时间复杂度和空间复杂度的方法通常涉及改进算法和数据结构的选择。以下是一些优化建议,并附上相应的代码和注释。

优化建议

  1. 使用集合交集:
    • 使用集合的交集操作来快速检查不相容物品对。
  2. 预处理不相容物品对:
    • 预处理不相容物品对,将其分为两个集合,一个集合包含第一个物品,另一个集合包含第二个物品。
  3. 减少不必要的字符串操作:
  • 避免在每次检查时进行字符串排序和拼接操作。

优化后的代码

# 读取输入
n, m = map(int, input().split())# 存储不相容物品对
inhabited_cps = {}
for _ in range(n):a, b = input().split()if a > b:a, b = b, a  # 确保 a <= bif a not in inhabited_cps:inhabited_cps[a] = set()inhabited_cps[a].add(b)# 检查每个货物清单
for _ in range(m):cargo_list = set(input().split()[1:])found_conflict = Falsefor a in inhabited_cps:if a in cargo_list:for b in inhabited_cps[a]:if b in cargo_list:print("No")found_conflict = Truebreakif found_conflict:breakif not found_conflict:print("Yes")

代码解释

  1. 输入处理:
    • 使用 map 函数直接将输入转换为整数。
  2. 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储不相容物品对,键为较小的物品编号,值为包含较大物品编号的集合。
  3. 货物清单检查:
  • 对于每个货物清单,使用集合 cargo_list 存储清单中的物品。
  • 通过遍历 inhabited_cps 中的键,检查是否存在不相容物品对。
  • 使用 found_conflict 标志来提前终止检查。

时间复杂度分析

  • 不相容物品对的存储:
    • 读取和存储 n 对不相容物品的时间复杂度为 O(n)。
  • 货物清单检查:
  • 对于每个货物清单,检查的时间复杂度为 O(k+n),其中 k 是清单中物品的数量,n 是不相容物品对的数量。
  • 总体时间复杂度为 O(m×(k+n))。

空间复杂度分析

  • 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储 n 对不相容物品,空间复杂度为 O(n)。
  • 货物清单的存储:
  • 每次读取一个货物清单,使用集合 cargo_list 存储清单中的物品,空间复杂度为 O(k)。
  • 总体空间复杂度为 O(n+m×k)。

通过这些优化,代码在处理大量数据时会更加高效。


哲学和编程思想

这个问题的解决方法涉及多个哲学和编程思想,具体如下:

哲学思想

  1. 实用主义(Pragmatism):
    • 实用主义强调行动、实践和实际效果。在这个问题中,我们关注的是如何有效地解决实际问题,即如何安全地装箱货物,避免不相容物品的组合。
  2. 逻辑主义(Logicism):
    • 逻辑主义认为数学和逻辑是基础,所有知识都可以通过逻辑推理得到。在这个问题中,我们通过逻辑推理来构建不相容物品对的字典,并检查货物清单是否符合逻辑规则。
  3. 系统论(Systems Theory):
  • 系统论强调整体性、相互作用和动态平衡。在这个问题中,我们将不相容物品对和货物清单视为一个整体系统,通过分析系统中的相互作用来解决问题。

编程思想

  1. 抽象(Abstraction):
    • 抽象是指忽略细节,关注本质。在这个问题中,我们将不相容物品对和货物清单抽象为数据结构(字典和集合),以便更好地处理和操作。
  2. 模块化(Modularity):
    • 模块化是指将系统分解为独立的模块,每个模块负责特定的功能。在这个问题中,我们将代码分解为函数 check_cargo_list,使其更易于理解和维护。
  3. 算法优化(Algorithm Optimization):
    • 算法优化是指通过改进算法来提高效率。在这个问题中,我们使用集合来快速检查不相容物品,从而提高算法的效率。
  4. 数据驱动(Data-Driven):
    • 数据驱动是指以数据为中心,通过数据来驱动决策和操作。在这个问题中,我们通过构建和操作数据结构(字典和集合)来解决问题。
  5. 防御性编程(Defensive Programming):
  • 防御性编程是指预见可能的错误和异常情况,并提前进行处理。在这个问题中,我们通过检查不相容物品对来预见潜在的问题,并输出相应的结果。

通过结合这些哲学和编程思想,我们能够设计出一个高效、可靠且易于理解的解决方案。


举一反三

结合这些哲学和编程思想,以及本题目的具体情况,以下是一些技巧,可以帮助你举一反三,更好地解决类似问题:

哲学思想应用技巧

  1. 实用主义:
    • 关注实际效果:在解决问题时,始终关注解决方案的实际效果和可行性,而不是仅仅停留在理论层面。
    • 迭代改进:通过不断测试和调整,逐步改进解决方案,直到达到满意的实际效果。
  2. 逻辑主义:
    • 逻辑推理:在设计解决方案时,使用逻辑推理来确保每一步都是合理和正确的。
    • 清晰定义:明确问题的定义和边界,确保解决方案与问题定义一致。
  3. 系统论:
  • 整体视角:从整体系统的角度考虑问题,分析各个部分之间的相互作用和影响。
  • 动态平衡:在设计解决方案时,考虑系统的动态变化和平衡,确保解决方案能够适应不同的变化。

编程思想应用技巧

  1. 抽象:
    • 数据结构选择:选择合适的数据结构来表示问题中的实体和关系,如使用字典表示不相容物品对。
    • 接口设计:设计简洁明了的接口,隐藏内部实现细节,使代码更易于理解和使用。
  2. 模块化:
    • 功能划分:将复杂问题分解为多个小模块,每个模块负责一个独立的功能。
    • 代码复用:设计可复用的模块,减少重复代码,提高开发效率。
  3. 算法优化:
    • 时间复杂度分析:分析算法的时间复杂度,选择效率更高的算法。
    • 空间复杂度优化:在必要时优化算法的空间复杂度,减少内存占用。
  4. 数据驱动:
    • 数据验证:在处理数据前,进行数据验证,确保数据的正确性和完整性。
    • 数据分析:利用数据分析来发现问题的模式和规律,指导解决方案的设计。
  5. 防御性编程:
  • 异常处理:预见可能的异常情况,并设计相应的异常处理机制。
  • 边界条件:考虑边界条件和极端情况,确保解决方案在这些情况下也能正常工作。

通过应用这些技巧,可以在解决类似问题时更加灵活和高效,同时也能够提高代码的质量和可维护性。

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

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

相关文章

基于SSM的校园闲置物品交易平台

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的校园闲置物品交易平台,java项目…

Advanced RAG 09:『提示词压缩』技术综述

编者按&#xff1a; 如何最大限度地发挥 LLMs 的强大能力&#xff0c;同时还能控制其推理成本&#xff1f;这是当前业界研究的一个热点课题。 针对这一问题&#xff0c;本期精心选取了一篇关于"提示词压缩"(Prompt Compression)技术的综述文章。正如作者所说&#xf…

Zookeeper 四、Zookeeper应用场景

Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使用它来进行分布式数据的发布与订阅。另一方面&#xff0c;通过对Zookeeper中丰富的数据节点类型进行交叉使用&#xff0c;配合Watcher事件通知机制&#xff0c;可以非常方便地构建一系列分…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日&#xff0c;给用户发送邮件&#xff0c;提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦&#xff1a;第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

LeetCode 算法:二叉树的右视图 c++

原题链接&#x1f517;&#xff1a;二叉树的右视图 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代&#xff0c;算力成为支撑经济社会发展新的关键生产力&#xff0c;全球主要经济体都在加快推进算力战略布局。随着大模型持续选代&#xff0c;模型能力不断增强&#xff0c;带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用&#xff0c;根据IDC、…

java基础知识点全集

JAVA的所有知识点 一、基础的数组、数据类型、输入输出二、类与对象1. 三大特征&#xff08;1&#xff09; 封装&#xff08;2&#xff09;继承&#xff08;3&#xff09;多态 2. 类的实例化&#xff08;1&#xff09; 类通过NEW来创建&#xff08;2&#xff09; 类的继承&…

AH1117-3.3芯片使用记录

今天在新做好的电路板上测试电源时发现一个问题&#xff0c;那就是散热端不能接地&#xff0c;接地了就好像短路一样&#xff0c;芯片会热的厉害&#xff0c;当我把该引脚与地的所有连接都切断后&#xff0c;短路现象消失&#xff0c;特此记录一下&#xff0c;防止自己下次再犯…

本地Navicat/客户端连接阿里云RDSMySQL时遇到过的问题及解决

1.之前开发的RDS MySQL版本和本地MySQL版本最好接近&#xff0c;比如8.0.28和8.0.20好像都是可以兼容的&#xff0c;他们里面都有那个utf8的字符编码&#xff0c;但是后面我选的RDS MySQL版本有点新&#xff0c;是8.0.30甚至更新的版本&#xff0c;之前用C#语言写的连接MySQL以…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1&#xff0c;参数2&#xff0c;参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1&#xff1a;输出窗口归类使用&#xff0c;你写什么它就显示什么 参数2&#x…

数据稀疏如何学好embedding?

在推荐系统中&#xff0c;冷启动或长尾是一个常见的问题&#xff0c;模型在数据量较少的user或item上的预测效果很差。造成冷启动样本预测效果不好的重要原因之一是&#xff0c;冷启动样本积累的数据比较少&#xff0c;不足以通过训练得到一个好的embedding&#xff08;通过use…

仓库管理系统13--物资设置

1、添加窗体 2、设计UI界面 注意这个下拉框的绑定&#xff0c;你看到的选项是由displaymember决定&#xff0c;当你选择了哪个选项时&#xff0c;后台绑定这个选项的ID <UserControl x:Class"West.StoreMgr.View.GoodsView"xmlns"http://schemas.microsoft…

React 打包时如何关闭源代码混淆

React 开发中&#xff0c;使用 npm build 命令进行生产代码打包&#xff0c;为了压缩代码并尽量保证代码的安全性&#xff0c;React 打包时会代码进行压缩和混淆&#xff0c;但是有时我们需要 debug 生产环境的源代码&#xff0c;例如当我们调试 SSR 的项目时&#xff0c;需要禁…

成为画图大师,用图表讲故事

这些问题你是否遇到过: 项目总结会上&#xff0c;如果用数据呈现你做的价值&#xff1f; 完善详尽的数据分析得出了让人信服的结论&#xff0c;如何呈现在BOSS面前? 我们要的不是数据&#xff0c;而是数据告诉我们的事实 数据很重要&#xff0c;但只是原料&#xff0c;所以…

(单机架设教程)凯旋|当年的QQ游戏

前言 今天给大家带来一款单机游戏的架设&#xff1a;凯旋 &#xff0c; 当年的QQ游戏 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 凯旋单机 搭建教程 此游戏架设需要安装虚拟机&#xff0c; 没有…

[AIGC] 深入了解标准与异常重定向输出

在操作系统和编程环境下&#xff0c;有时我们需要更加精细地控制程序的输入或输出过程&#xff0c;这就涉及到了标准输入输出流&#xff0c;以及重定向的概念。接下来&#xff0c;我们将详细介绍标准输出、标准错误输出&#xff0c;以及如何进行输出重定向。 文章目录 1. 标准输…

Vue+Proj4Leaflet实现地图瓦片(Nginx代理本地地图瓦片为网络url)加载并实现CRS投影转换(附资源下载)

场景 Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)&#xff1a; Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)_offline map maker-CSDN博客 Leaflet快速入门与加载OSM显示地图&#xff1a; Leaflet快速入门与…

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice&#xff1f;引用传递实现扩容机制 go为何设计slice&#xff1f; 切片对标其他语言的动态数组&#xff0c;底层通过数组实现&#xff0c;可以说是对数组的抽象&#xff0c;底层的内存是连续分配的所以效率高&#xff0c;可…

Proxmox VE(PVE)上手配置指南

Proxmox VE&#xff08;PVE&#xff09;是一款开源虚拟化管理平台&#xff0c;集成了KVM和LXC技术&#xff0c;支持虚拟机和容器管理。它提供了一个基于Web的用户界面&#xff0c;支持高可用性集群、备份和恢复、实时迁移等功能&#xff0c;适用于企业级虚拟化环境。. 以下为安…