对于足够密集的输入,在线性时间内解决子集和问题

当输入值彼此足够接近时,著名的 NP 完全问题的最佳解决方案。在足够密集输入的线性时间内解决的子集和问题一文首先出现在《走向数据科学》上。

来源:走向数据科学

,我将提出子集和问题的解决方案,如果所有“n”个输入值彼此“足够接近”,则该解决方案具有线性时间复杂度 O(n)。我们很快就会看到这个条件的实际含义,以及为什么它在实践中经常被保留(或几乎保留)。对于彼此“几乎接近”的输入,算法仍然有一定的概率运行得足够快。

本文的组织方式如下:

  • 在第一章中,我们将回顾子集和问题,并基于暴力技术展示可能最简单的解决方案。
  • 第 2 章回顾了 NP 完全问题的类别以及子集和问题与它的关系。
  • 第 3 章回顾了基于动态规划技术的常用解决方案,并强调了为什么它是伪多项式算法。
  • 在第 4 章中,我将介绍新算法,称为“基于间隔的解决方案”。
  • 第 5 章将表明,与动态规划技术类似,基于间隔的算法也可以恢复形成给定目标总和的项目的精确子集,而不仅仅是回答目标总和是否可实现。
  • 最后,在第 6 章中,我们将看到为什么基于间隔的算法实际上达到线性时间复杂度,如果所有“n”个输入值彼此足够接近(并且我们将理解“足够接近”条件的实际含义)。
  • 1. 回顾子集和问题

    子集和问题 (SSP) 的定义非常简单:

    我们得到“n”个输入整数 X={x,x, …,x} 和一个目标和“q”。有必要弄清楚是否存在这“n”个整数的子集“Y”,其中的数字之和恰好为“q”。如果是这样,问题可能还要求报告子集“Y”的所有数字。

    以下是 SSP 输入的示例:

    这是它的解决方案:

    请注意,对于给定的目标和“q”,可能存在具有多个解决方案的情况:

  • 任一 x 参与结果子集“Y”,
  • 或没有。
  • q= 28.