Bir kümedeki en küçük standart sapmaya ait altkümeyi bulma
Elimizde N boyutlu bir küme olsun. Bu kümenin K boyutlu altkümelerinden en küçük standart sapmaya ait olanını nasıl buluruz?
İnsanın ilk olarak aklına K eleman sayılı tüm altkümeleri sırasıyla denemek geliyor. Bunu nchoosek ile yapabiliriz.
N = 20;
K = 10;
x = rand(N,1);
C = nchoosek(x, K);
tic
min_s = realmax;
for i = 1:size(C,1)
s = std(C(i,:));
if s < min_s
min_s = s;
en_iyi_C = C(i,:);
end
end
toc
Benim bilgisayarımda 8.33 s tuttu:
Elapsed time is 8.329337 seconds.
Altküme sayısı $\frac{20!}{10!\times 10!} = 184756$. Küçük bir sayı. Peki N 100 olsaydı, K da 50 olsaydı ne yapacaktık? Altküme sayısı $\frac{100!}{50! \times 50!} = 100891344545564150000000000000$ olacaktı. Bir hayli (!) büyük bir sayı. Buna hafıza yetmez dediğinizi duyuyorum. Evet, buna bilgisayardaki beyin yetmez. Ama bizde beyin bedava, onu kullanalım.
Önce elemanları sıralayalım:
N = 100; K = 50; x = rand(N,1); tic [x_s, ind] = sort(x);
Şimdi de her K boyutlu ardışık dizilimde standart sapmayı hesaplayalım.
min_s = realmax;
for i = 1:(N-K+1)
s = std(x_s(i:(i+K-1)));
if s < min_s
min_s = s;
en_iyi_ind = ind((i:(i+K-1)));
end
end
toc
Algoritmamız bu kadar. Sıralamanın karmaşıklığı $O(N \log N)$, sonraki döngü $O(NK)$. Sonuçta karmaşıklık bunların küçüğü.
Artık 1000 elemanlı bir kümenin 500 elemanlı en düşük standart sapmaya ait altkümesini hesaplamak 0.070 s sürüyor!

