繁体   English   中英

排序这些n ^ 2数字的最快方法是什么?

[英]What is the fastest way to sort these n^2 numbers?

给定数字'n',我想返回包含k1 * k2的所有值的n ^ 2个数的排序数组,其中k1和k2的范围可以从1到n。

例如,对于n = 2,它将返回:{1,2,2,4}。(该数字基本上是1 * 1,1 * 2,2 * 1,2 * 2)。

对于n = 3,它将返回:{1,2,2,3,3,4,6,6,9}。

(数字为:1 * 1,2 * 1,1 * 2,2 * 2,3 * 1,1 * 3,3 * 2,2 * 3,3 * 3)

我尝试使用c ++标准库中的sort函数,但我想知道它是否可以进一步优化。

好吧,首先,你得到n^2个条目,其中最大的条目是n^2 ,并且在可能的值范围内,只有很少的值用于大n 所以,我建议采用计数方法:

  1. 用零初始化一个大小为n^2的数组counts[]
  2. 遍历值数组values[] ,并counts[values[i]-1]++
  3. 通过遍历counts数组重新初始化values数组,将count i+1 counts[i]给出的i+1 values放入values数组中。

就这样。 它是O(n^2) ,所以你几乎找不到更高效的解决方案。

vector<int> count(n*n+1);
for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
        ++count[i*j];
for (int i = 1; i <= n*n; ++i)
    for (int j = 0; j < count[i]; ++j)
        cout << i << " ";

这实质上是cmaster答案中描述的O(n * n)解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM