查找大量整数的最大子集

时间:2013-04-12 21:42:03

标签: algorithm set subset max-size

我在.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的最大子集:
  6. X1< X2< X3< ......< Xn-1< Xn,例如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。

    算法应该非常快。

    我不会找人做我的工作。我只需要一个相应的问题,这样我就可以找到有效的解决方案。在此先感谢!!!

2 个答案:

答案 0 :(得分: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操作。

如果我误解了这个条件,它仍然可以很容易地适应大多数其他条件,周围的算法保持不变,你只需修改内部的条件。

答案 1 :(得分:0)

最简单的解决方案是:

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

    有关第2步的更多详情:

    让低跟踪最低元素和高元素。

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

    每一步:将高递增1,然后递增低,使得x [低]> = x [高]。计算元素数量= high-low + 1,并相应地更新maxWindow。