Algorithm 求一个大整数集的最大子集
我在一个.txt文件中有大量长无符号整数。如何找到具有以下属性的S的最大子集(Pmax):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
P{X1,X2,X3,...,Xn) | X1>=(Xn/4)
更多详情:
我不找人做我的工作。我只需要一个相应的问题,这样我就可以寻找有效的解决方案。提前感谢 假设您的条件意味着“子集中的所有元素都大于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,递增低,使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意味着这是最佳解决方案,因为不清楚元素是否必须有序(因此排除选项中的预排序,在一般约束条件下也不可能)对不起,我没有把问题说清楚。我真的很感谢你的帮助。谢谢