Algorithm 求一个大整数集的最大子集

Algorithm 求一个大整数集的最大子集,algorithm,set,subset,max-size,Algorithm,Set,Subset,Max Size,我在一个.txt文件中有大量长无符号整数。如何找到具有以下属性的S的最大子集(Pmax): P{X1,X2,X3,...,Xn) | X1>=(Xn/4) 更多详情: 当我说最大子集时,我指的是元素数最多的子集(n->max) 由于内存有限,我无法将.txt加载到数组中 我的系统内存是200MB txt文件有10^6个整数。每个整数可以是长的无符号32位 我需要找到具有以下条件的S的最大子集: X1

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

P{X1,X2,X3,...,Xn) | X1>=(Xn/4)
更多详情:

  • 当我说最大子集时,我指的是元素数最多的子集(n->max)
  • 由于内存有限,我无法将.txt加载到数组中
  • 我的系统内存是200MB
  • txt文件有10^6个整数。每个整数可以是长的无符号32位
  • 我需要找到具有以下条件的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,3,4),因为它有更多的元素

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

    算法应该非常快


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

    假设您的条件意味着“子集中的所有元素都大于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操作


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

    最简单的解决方案是:

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

    有关步骤2的更多详细信息:

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

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


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

    您的内存是200MB?还是您的文件?还有,什么是
    p
    ?您所说的
    是指“这样”吗?顺便说一句,在这个网站上,我们试图帮助你,而不是做你的工作。你至少需要表现出一些努力。你已经尝试了什么?你在谷歌上搜索发现了什么,为什么你发现的不够好?我可能会误解你写条件的方式,但你不是想写这些吗子集中的数字大于X1?按照您现在编写的方式,最大子集几乎是整个文件的定义。因此在数组
    [1,3,12,16,20,99]
    中,答案将是
    [12,1,2]
    ?因为12>(16/4)和12>(20/4),但12首先,我从来没有要求任何人做我的工作。我只是需要一个相应的问题,以便找到我的解决方案。非常感谢你的回答!但是,既然我无法将数据加载到列表或数组中,我如何对txt文件中的数据进行排序?在txt文件中排序不是很慢吗?@chrisk。有许多恒定内存排序算法(例如MergeSort)。您可以使用该算法,也可以在linux中使用命令行排序功能。在任何情况下,这都可以在O(nlogn)中完成时间。这是一个真正的问题还是一个面试/测试问题?谢谢。这不是一个真正的问题。这是一个测试问题,因此我无法对txt文件进行预排序…您可以使用任何常量内存合并排序来实现排序。请参阅:复杂性为O(n^2)。您可以做得更好。请参见下文。在对条件进行几次澄清之前,我发布了我的解决方案。对于条件,我假设TS意味着这是最佳解决方案,因为不清楚元素是否必须有序(因此排除选项中的预排序,在一般约束条件下也不可能)对不起,我没有把问题说清楚。我真的很感谢你的帮助。谢谢