列出所有 n 个整数对的最快解决方案?

Posted

技术标签:

【中文标题】列出所有 n 个整数对的最快解决方案?【英文标题】:Fastest solution to list all pairs of n integers? 【发布时间】:2015-04-14 21:16:31 【问题描述】:

我想列出所有可能的整数对 [1, n] 和一个大的 n。我发现自己正在寻找最快的选择。到目前为止,这是我想出的。

Matlab 的 nchoosekcombnk 方法建议使用 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];

将这些方法循环计时,每个使用n=1000 10 次,我从最快到最慢

    ind2sub(0.15 秒) for 循环(16.3 秒) nchoosek(16.8 秒)

似乎ind2sub 是远距离最快的方法。只是出于好奇,还有哪些可能更快也可能不会更快的选择?

【问题讨论】:

【参考方案1】:

替换nchoosek(1:N,2)

bsxfun -

[Y,X] = find(bsxfun(@gt,[1:N]',[1:N]))
pair = [X, Y];

仅使用trilfind(不使用ind2sub)-

[y,x] = find(tril(true(N),-1))
pair = [X, Y];

【讨论】:

又是万能的bsxfun 快!我使用与以前相同的设置以大约 0.08 秒的速度计时。 @2cents 太棒了!确实很酷。 @Benoit_11 我得到了一个未来的读心键盘! ;) 实际上我几天前偶然发现了这个问题!真的没有魔法:) 干得好 :) 我特别喜欢 tril 矩阵的技巧,它非常聪明。

以上是关于列出所有 n 个整数对的最快解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

列出 N 以下所有素数的最快方法

2021-06-01:K个逆序对数组。给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。逆序对的定义如下:对于数组的第i个和第 j个元素,如果满

所有对的异或值之和

如何最快在N个有序的整数数组中取得最大K个数?

使用 AVX512 或 AVX2 计算所有压缩 32 位整数之和的最快方法

列出所有下楼梯路径的时间复杂度?