【问题标题】:Find max subset of a huge set of integers查找大量整数的最大子集
【发布时间】:2013-04-12 21:42:02
【问题描述】:

我在 .txt 文件中有大量 (S) 长无符号整数。如何找到具有以下属性的 S 的最大子集 (Pmax):

P{X1,X2,X3,...,Xn) | X1>=(Xn/4)

更多细节:

  1. 当我说最大子集时,我指的是元素数量最多的子集 (n->max)。
  2. 由于内存有限,我无法将 .txt 加载到数组中。
  3. 我的系统内存是 200MB
  4. txt 文件有 10^6 个整数。每个整数都可以是长无符号 32 位。
  5. 我需要找到 S 的最大子集,条件是:

X1 = (XN/4)

例如,如果 txt 文件具有以下内容: 15,14,13,4,2,2,3,10,1,2,2 那么这些是可能的子集:

P1(4,10,13,14,15)

P2(3,4,10)

P3(1,2,2,2,2,3,4)

所以 Pmax(1,2,2,2,2,3,4) 因为它有更多的元素。

事实上,我不想确切地找到哪个是 Pmax。我只想找到子集 Pmax 的元素数。所以这里是 7。

算法应该很快。

我不找人来做我的工作。我只需要一个相应的问题,这样我就可以寻找有效的解决方案。提前谢谢!!!

【问题讨论】:

  • 你的内存是200MB?还是你的文件?另外,P 是什么? | 是指“这样”吗?
  • 附带说明,在这个网站上,我们试图帮助您,而不是做您的工作。你至少需要表现出一些努力。你已经尝试过什么?您通过 google 搜索发现了什么,为什么您发现的内容不足以满足您的目的?
  • 我可能会误解你写条件的方式,但你不是要写子集中的所有数字都大于 X1 吗?您现在编写它的方式最大子集几乎是定义的整个文件。
  • 所以在数组[1,3,12,16,20,99] 中,答案是[12,1,2]?因为 12>(16/4) 和 12>(20/4),但是 12
  • 首先,我从未要求任何人做我的工作。我只需要一个相应的问题,这样我就可以找到我的解决方案。

标签: algorithm set subset max-size


【解决方案1】:

假设您的条件意味着“子集中的所有元素都大于 X1 除以 4”,您需要 2 个简单的嵌套循环和一些辅助变量。

在伪代码中应该可以这样:

var idx = 0, largest = 0, currentIdx = 0;

while(var current = getIntegerFromFileById(currentIdx))
{
  var size = 1;
  while(getIntegerFromFileById(currentIdx + size++) > current / 4);
  if(size > largest) {
    idx = currentIdx;
    largest = size;
  }
  currentIdx++;
}
print "Longest subset is at index {idx}.";
print "It contains {largest} consecutive elements.";

这也是事实上的最佳实现。最明显的优化是在扫描期间将整数逐步加载到内存缓冲区中,以防止双重 I/O 操作。

如果我误解了条件,这应该仍然可以轻松适应大多数其他条件,周围的算法保持不变,您只需修改内部 while 的条件。

【讨论】:

  • 复杂度为 O(n^2)。你可以做得更好。见下文。
  • 我在对条件进行了几次澄清之前发布了我的解决方案。对于我假设 TS 意味着这是最佳解决方案的条件,因为不清楚元素是否必须按顺序排列(因此从选项中排除预排序,这在一般约束下也是不可能的)。
  • 对不起,我没有把问题说清楚。我真的很感谢你的帮助。谢谢
【解决方案2】:

最简单的解决方案是:

  1. 首先对列表进行排序(复杂度 O(nlogn)
  2. 使用移动窗口,找到最大的可接受窗口。 (复杂度 O(n))

复杂度:O(nlogn)。

关于第二步的更多细节:

让low跟踪最低元素,让high跟踪最高元素。

初始化:将第一个元素设置为低。对 4*x[low] 进行二分搜索,这就是你的高位。设置 maxWindow=high-low+1。

在每一步:high 加 1,low 加 1,使得 x[low]>=x[high]。计算元素个数=high-low+1,并相应更新maxWindow。

【讨论】:

  • 非常感谢您的回答!但是,由于无法将 txt 文件中的数据加载到列表或数组中,我该如何对其进行排序呢?在txt文件中排序会不会很慢?
  • @chrisk。有许多常量内存排序算法(例如 MergeSort)。您可以使用它或使用 linux 中的命令行排序功能。无论如何,这可以在 O(nlogn) 时间内完成。这是一个真正的问题还是面试/测试问题?
  • 谢谢。这不是一个真正的问题。这是一个测试问题,所以我无法对 txt 文件进行预排序...
  • 您可以使用任何常量内存合并排序来实现排序。见:en.wikipedia.org/wiki/Merge_sort#Optimizing_merge_sort
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2017-08-22
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多