2015-04-20 32 views

回答

2

我发现了一个similar question on SO并实现在MATLAB中提出的解决方案:

function [result] = kth_combination(k,l,r) 

if r == 0 
    result = []; 
elseif size(l,2) == r 
    result = l; 
else 
    i = nchoosek(size(l,2)-1,r-1); 
    if k < i+1 
     result = [l(1), kth_combination(k, l(2:end), r-1)]; 
    else 
     result = kth_combination(k-i, l(2:end), r); 
    end 
end 
end 

有MATLAB的文件交换,提供另一种解决方案,它不是基于递归:onecomb

为了比较3解决方案,我创建了这个基准测试功能:

function [time_1,time_2, time_3] = compare_solutions(m,n,i,num_runs) 
time_1 = 0; 
time_2 = 0; 
time_3 = 0; 

for run=1:num_runs 

    tic 
    A=nchoosek(1:m,n); 
    res_1 = A(i,:); 
    time_1 = time_1 + toc; 

    tic 
    res_2 = kth_combination(i,1:m,n); 
    time_2 = time_2 + toc; 

    tic 
    res_3 = onecomb(m,n,i); 
    time_3 = time_3 + toc; 

    if (run==1) && (sum(res_1 ~= res_2) || sum(res_1 ~= res_3)) 
     error('solutions are NOT identical'); 
    end 

end 

time_1 = time_1/num_runs; 
time_2 = time_2/num_runs; 
time_3 = time_3/num_runs; 

end 

样品运行:

>> [time_1,time_2, time_3] = compare_solutions(20,10,10,10) 

time_1 = 

    1.9676 

time_2 = 

    6.8508e-04 

time_3 = 

    7.1848e-05 

第二个和第三个解决方案比nchoosek方法快,非递归的解决方案比递归的解决方案更快10倍。

+0

很好。另外,我正在寻找需要更少内存的解决方案。虽然你提出的代码更快,但他们仍然渴望内存。对于大'm'来说是严重的。 – Meher81

+0

@ Meher81:你的'm'有多大? –

+0

可能是10^8。 'n'小于'10'。在这种情况下,由于内存限制,建立“A”的整体是不可能的。所以,我正在想另一种方法来查找'A'的行'i'。 – Meher81

相关问题