C++ 中未排序数组中与目标值最接近的对和2025年03月22日 | 阅读 15 分钟 另一个传统的计算机算法问题是识别无序数组中两个值,它们的和最接近一个目标值。这个问题在各种不同的学科中都有很高的适用性。在许多不同的情况下,识别求和到特定值且最接近该值的组件可能至关重要,同时也非常具有挑战性,例如在推荐系统、金融分析或值近似、计算机中若干负载的分配中。这个主题特别有趣且有助于普遍理解各种计算方法,因为它结合了算法效率、搜索优化和正确计算需求的独特元素。 问题的概念特征是定义一个给定未排序整数数组中的两个不同分量,它们彼此以及与给定目标数字的接近程度尽可能高。正如所见,这个过程看起来相当直接,但其中包含大量的计算工作,尤其是在涉及大型数据集或数组未排序的情况下。复杂性 arises from the fact that since the array is unsorted and there is no one guiding the search, there is no shortcut, and every combination of the two elements must be checked. As such, a straightforward approach could quickly turn into a non-efficient one and thus call for the employment of more complicated methods to solve the problem under consideration within a fairly reasonable time. 问题本身基于接收一个未排序的整数数组并搜索两个不相交分量,它们的和尽可能接近目标数字的想法。以下看似一个直接的过程,但需要大量的计算工作,尤其是在处理大型数据集或数组未排序时。复杂性 arises from the fact that there is no organization within an unsorted array through which the search can be guided, so every pair of elements must be considered. For this reason, what initially may seem very simple could be rendered useless very quickly, requiring the use of superior methods to deal with the problem within a fairly reasonable amount of time. 因此,有必要寻找更好的算法,因为检查所有可能组合的直接方法相当耗时。蛮力方法非常方便且易于学习;然而,它无法处理大型数据集,因为时间复杂度为 O(n^2)。上述操作以二次时间运行,因为该方法单独考虑每个对,并且没有关于数组结构的额外知识。因此,对于大小为 n 的数组,该方法必须进行 n*(n - 1)/two 次比较,随着 n 的增加,这可能非常浪费。 但并非都是绝望的……通过使用各种更高级的技术,例如对给定数组进行排序,然后使用双指针方法,可以将复杂度降低到 O(n log n),这比上述方法要好得多。排序元素的特性 enable faster lookup, notwithstanding the overhead caused by sorting the array to look for the nearest pair. When the array is sorted, the problem appears in a more approachable form, which is a two-pointer approach from the ends towards the middle to quickly find the good couple. 因此,本文将探讨旨在解决未排序数组中与目标最接近的对和问题的各种方法:优化方法和蛮力方法。我们将从评估和评估该技术目的的直接方法以及使用它的缺点开始。在下一部分,我们将探讨优化方法,该方法通过排序提供更好的结果,同时使用双指针策略。 本文旨在通过详细解释、代码序列和两种技术的基准测试,让读者了解处理此 C++ 问题的最佳方法。在指南结束时,读者将能够欣赏一种策略相对于另一种策略的具体优势,或者了解在什么情况下应该采用哪种策略。 理解方法理解这些方法不仅可以扩展解决类似问题的技能集,还可以增加对算法如何构建和优化的知识——这些技能对任何计算机科学家或工程师都至关重要。 问题概要事实上,我们的工作是完成一个经典的计算问题,该问题包括在一个随机排序的数组中找到两个整数,它们的和尽可能接近目标整数。这个问题看似简单,但提出了许多算法设计和优化问题,并且在许多情境下都很重要,例如金融和数据科学。 认识到问题接下来面临的是背包问题,即在一个数字数组中,找出两个数字(至少)它们的和最接近一个称为目标的整数。这变得更糟,因为数组是未排序的,因此不提供任何可以习惯的特定序列。我们希望两个数字尽可能接近的数字就是目标值,这是一个整数值。 例如,考虑以下场景 Array [10, 22, 28, 29, 30, 40] 目标和 54 目标是找到数组中两个不同的元素,它们的和最接近 54。在这种情况下,最佳对是 (22, 30),因为 22 + 30 = 52,这是数组中任何对能达到的最接近 54 的和。 这个问题为何重要?这不仅仅是一个课堂练习:在课堂上,学习者扮演员工的角色,并通过实际场景进行工作。它在许多领域都有应用和现实世界的后果:它在许多领域都有应用和现实世界的后果 金融分析: 如果投资者管理投资组合,他/她可以寻找两个证券,这两个证券的价值之和最接近投资者希望投资组合达到的价值。因此,这些对可以根据当时的市场情况帮助做出最佳投资决策。 数据科学和机器学习: 在构建预测模型时,通常需要找到能够共同实现所需结果的特征和数据点的组合。类似地,对于这个问题:对中的一个值是特征或预测,另一个值是目标总和,代表了一个目标。 推荐系统: 电子商务和流媒体服务通常使用推荐算法来告知消费者产品或内容。通过了解哪两个项目最接近用户想要的内容,可以提高推荐的相关性;这将大大提高用户满意度,从而带来高使用率。 负载均衡: 在分布式环境中,公平分配多个服务器或处理器的计算负载非常重要。通过确定一组对,使得对中的两个作业在效率上最接近,可以实现均衡的负载分配。这反过来将提高系统功能,从而提高系统效率。 问题中的障碍这个主题的第一个挑战是数组当前是无序的。如果我以某种索引方式组织给定的数组,那么用诸如二分查找或双指针方法之类的更简单的技术来解决问题就不会那么困难。然而,我们不能直接采用这些技术,尤其是在数组未排序的情况下。 如果可以使用蛮力技术来纠正这个问题,则可以考虑这一点。在这种情况下,将检查数组中的每个潜在对,计算它们的和,然后将和与给定的目标进行比较。 其中一些技术,尤其是蛮力方法,非常有用,特别是对于小型数据集;然而,鉴于大型数据集涉及大量的计算,它会变得很麻烦。这意味着随着数据量的增加,需要更有效的算法,这些算法可以在合理的时间内完成工作。 明确目标考虑到难度和找到可行解决方案的重要性,目标是明确的:这意味着我们应该提出一种算法,该算法可以识别一个接近目标的数字对,但其运行时间应小于 O(n^2)。理想情况下,我们将找到一种在调用效率和读取准确性之间取得平衡,同时还能处理更大的数组而性能不会下降的方法。 在给定的未排序数组中,一组不同的元素与给定目标值的最接近和,实际上是问题陈述。由于数组的无序性,大多数算法的选择必须在一定的得失下进行考虑,并且必须做出选择以获得最准确的结果,同时牢记各自的计算时间。这个挑战与算法设计和优化人员相关,因为与一些仅仅是谜题的问题不同,这个问题在许多领域都有重大的现实世界影响。 蛮力方法的算法蛮力算法的分步说明 初始化
遍历所有可能的对
计算每对的和
计算与目标的差值
如有必要,更新最接近的对
继续直到所有对都被检查 嵌套循环继续迭代,直到检查完所有可能的对。在此过程结束时,变量 min_diff 和 closest_pair 将保存找到的最小差值和相应的数字对。 返回结果 检查完所有对后,算法将返回 closest_pair,其中包含和最接近目标的两个数字。 示例 1输出 Pair closest to target 54 is (22, 30) 最优方法的算法最优算法的详细描述 排列数组
设置第一个双指针
设置用于监控最接近对的变量
使用这两个提示重复
移动指针
关闭循环 当左指针不再小于右 指针时,循环终止。此时,已确定最接近的对,算法停止。 返回最接近的对 最后,返回 closest_pair,其中包含和最接近目标的两个数字。 示例 2输出 Pair closest to target 54 is (22, 30) 方法效率比较
效率与简洁性
边界情况 两种方法都必须处理空数组、元素少于两个的数组或产生相同最接近和的多个对的数组等边界情况。应进一步检查这些情况。 空间复杂度 如果就地排序,则两种策略的额外空间复杂度为 O(1)。只有存储索引和最接近对的变量才会占用空间。 财务分析 通过识别最能近似期望投资组合价值的最有利投资对来最大化资产分配。 数据近似 选择组合效果最接近预期结果的两个数据点,以最小化数据拟合误差。 推荐系统 查找最能反映用户期望的两个项目对,可以在推荐系统中将其视为查找最接近目标的对和的任务。 负载均衡 将任务配对,使其总计算成本最接近目标数字,这是分布式计算中用于在服务器之间平衡负载的一种方法。 应用 深入了解各种应用可能有助于我们理解,尽管这个问题看起来很简单,但在现实生活中却可能产生重大影响。下面将讨论该算法在不同领域的一些最常见应用。 1. 投资组合增强和金融工作 在所有领域中,金融是该技术使用最多的领域,特别是在投资组合优化方面。
2. 机器学习和数据科学 评估相似性并搜索与目标值距离最近的项目对是数据科学和机器学习的许多应用中的关键任务。
3. 深入研究在线购物和推荐引擎。 SOP 2 推荐算法对于提高流媒体服务和电子商务用户的参与度至关重要。
4. 医学研究与医疗保健 在最接近目标的对和问题中,这些方法与医疗保健和医学科学几乎所有重要领域都高度相关。
|
我们请求您订阅我们的新闻通讯以获取最新更新。