列出所有 n 对整数的最快解决方案?
Fastest solution to list all pairs of n integers?
我想列出所有可能的整数对 [1, n]
和一个大的 n
。我发现自己在寻找最快的选择。到目前为止,这是我想出的。
Matlab 的 nchoosek
and combnk
方法推荐 n<15
用于列出所有可能的组合,因为组合数量爆炸。所以这有多快取决于 n.
pair = nchoosek(1:n, 2);
另一种选择是使用嵌套 for 循环
kk =1;
pair = zeros(nchoosek(n, 2), 2);
for ii = 1:n
for jj = ii+1:n
pair(kk, :) = [ii, jj];
kk = kk + 1;
end
end
这样会比较慢。
我也想过直接用ind2sub
函数
pair_adjacency = tril(ones(n), -1);
[x, y] = ind2sub(size(pair_adjacency), find(pair_adjacency==1));
pair = [x, y];
在一个循环中计时这些方法,每个方法 10 次 n=1000
,我从最快到最慢
- ind2sub(0.15 秒)
- for 循环(16.3 秒)
- nchoosek(16.8 秒)
看来 ind2sub
是远射最快的方法。出于好奇,还有哪些其他选项可能会或可能不会更快?
替换nchoosek(1:N,2)
与bsxfun
-
[Y,X] = find(bsxfun(@gt,[1:N]',[1:N]))
pair = [X, Y];
只有 tril
和 find
(没有 ind2sub
)-
[y,x] = find(tril(true(N),-1))
pair = [X, Y];
我想列出所有可能的整数对 [1, n]
和一个大的 n
。我发现自己在寻找最快的选择。到目前为止,这是我想出的。
Matlab 的 nchoosek
and combnk
方法推荐 n<15
用于列出所有可能的组合,因为组合数量爆炸。所以这有多快取决于 n.
pair = nchoosek(1:n, 2);
另一种选择是使用嵌套 for 循环
kk =1;
pair = zeros(nchoosek(n, 2), 2);
for ii = 1:n
for jj = ii+1:n
pair(kk, :) = [ii, jj];
kk = kk + 1;
end
end
这样会比较慢。
我也想过直接用ind2sub
函数
pair_adjacency = tril(ones(n), -1);
[x, y] = ind2sub(size(pair_adjacency), find(pair_adjacency==1));
pair = [x, y];
在一个循环中计时这些方法,每个方法 10 次 n=1000
,我从最快到最慢
- ind2sub(0.15 秒)
- for 循环(16.3 秒)
- nchoosek(16.8 秒)
看来 ind2sub
是远射最快的方法。出于好奇,还有哪些其他选项可能会或可能不会更快?
替换nchoosek(1:N,2)
与bsxfun
-
[Y,X] = find(bsxfun(@gt,[1:N]',[1:N]))
pair = [X, Y];
只有 tril
和 find
(没有 ind2sub
)-
[y,x] = find(tril(true(N),-1))
pair = [X, Y];