我在.txt文件中有一个很大的无符号整数集(S)。如何找到具有以下属性的S的最大子集(Pmax):
P{X1,X2,X3,...,Xn) | X1>=(Xn/4)
更多详情:
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。
算法应该非常快。
我不会找人做我的工作。我只需要一个相应的问题,这样我就可以找到有效的解决方案。在此先感谢!!!
答案 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)
最简单的解决方案是:
复杂性:O(nlogn)。
有关第2步的更多详情:
让低跟踪最低元素和高元素。
初始化:将低值设置为第一个元素。做二进制搜索4 * x [low],这是你的高位置。设置maxWindow = high-low + 1.
每一步:将高递增1,然后递增低,使得x [低]> = x [高]。计算元素数量= high-low + 1,并相应地更新maxWindow。