【发布时间】:2013-12-07 06:33:27
【问题描述】:
让我们有一个大小为N 的向量。例如:
x = rand(N,1)
我想计算向量中长度为K 的子集的最小标准差。
当N 和K 很小时,很容易找到最佳子集,因为我可以使用nchoosek(N,K) 枚举所有可能的子集。但是当N 和K 的值大于假设N=50 和K=25 时,nchoosek 无法计算组合,因为可能的子集的大小很大。
我想知道是否有更好的算法来计算子集,从而有效地给出数组中的最小标准偏差。例如通过动态编程。有什么想法吗?
更新:
我在答案之后循环实现了它,并与组合解决方案进行了比较。结果总是一样的,但速度却是前所未有的。
n = 20;
k = 10;
x = rand(n,1);
C = nchoosek(x, k);
tic
mins = realmax;
for i = 1:size(C,1)
s = std(C(i,:));
if s < mins
mins = s;
bestC = C(i,:);
end
end
toc
tic
[x2, j] = sort(x);
mins2 = realmax;
for i = 1:(n-k+1)
s = std(x2(i:(i+k-1)));
if s < mins2
mins2 = s;
idx = j((i:(i+k-1)));
end
end
toc
if mins == mins2
'Equal'
end
给予
Elapsed time is 7.786579 seconds.
Elapsed time is 0.002068 seconds.
ans =
Equal
【问题讨论】:
标签: algorithm matlab combinations