arrays - 以下哪种方法更有效
问题描述
问题陈述:-给定一个整数数组和一个整数 k,打印数组中总和为 k 的所有对
方法1:- 对数组进行排序并保持两个指针低和高,开始迭代......
时间复杂度 - O(nlogn)
空间复杂度 - O(1)
方法2:- 保留字典中的所有元素并执行该过程
时间复杂度 - O(n)
空间复杂度 - O(n)
现在,在上述两种方法中,哪一种是最有效的,在这种情况下我将在什么基础上比较效率、时间(或)空间,因为这两种方法都不同
解决方案
- 我在上面留下了我的评论以供参考。
- 这很仓促。您确实为方法 1 排序留出了 O(nlogn) 时间(我现在想我明白了吗?),这很公平(道歉;-)。
- 接下来发生什么?如果必须再次使用输入数组,那么您需要一个排序副本(排序不会就地),这会增加 O(n) 空间要求。
- 方法 1 的“迭代”部分也需要 ~O(n) 时间。
- 但是在方法 2 中加载字典也是 ~O(n) 时间(可能是一次性的数据结构?)并且字典访问 - 尽管 ~O(1) - 比数组索引要慢。
底线:如果 O-notation 可以识别“压倒性成本”(通过比较使其他成本可以忽略不计),但没有提示用例(典型和边界,数据量和可用系统资源等细节),问题像这样(寻求“广义的理想”答案)不能从中受益。
通常,一些简单的概念验证代码和对代表性数据的性能测试可以使“正确的选择显而易见”(比推测理论更容易且通常更正确)。
最后,在没有明确的性能赢家的情况下,总是有“代码可读性”来帮助决定;-)
推荐阅读
- pytorch - Pytorch - 批量标准化简单问题
- angular - 如何在图像 URL HTML 中传递用户名和密码。?
- node.js - Mongoose 查询列出用户加入的所有组
- c# - WPF - 具有从抽象类派生的不同对象的列的 DataGrid
- c - librdkafka 消费者没有收到来自代理的消息
- wordpress - 支付成功后订单状态仍为“Pending Payment”(自定义支付网关)
- database - oracle中的外部表和全局临时表有什么区别?
- google-app-engine - Appengine / 限制服务仅在单个域下可用
- php - Yii2 发送邮件:未显示来自电子邮件
- php - 会话数据文件在 session.gc_maxlifetime 和 session.cookie_lifetime 之前意外删除