在O(n)中对从0到n ^ m的n个数字进行排序的算法?其中m是常数

时间:2018-04-06 10:13:33

标签: algorithm sorting

所以我在这个问题上遇到了:

我们必须对0到n ^ 3之间的n个数字进行排序,时间复杂度的答案是O(n),并且作者通过这种方式解决了这个问题:

首先我们将这些数字的基数转换为O(n)中的n,因此现在我们有最多3位数的数字(因为n ^ 3)

现在我们使用基数排序,因此时间是O(n)

所以我有三个问题:

1。这是正确的吗?和最好的时间?

2. 如何在O(n)中转换n个数字的基数?像每个数字的O(1)?因为这个网站上的一些先前的主题说它的O(M(n)log(n))?!

3。如果这是真的,那么这意味着我们可以在O(n)中对从0到n ^ m的任何n个数字进行排序?!

(我搜索了转换n个数字的基数,有些人说它的 每个数字都有O(logn),有些人说n号的O(n)所以我也对此感到困惑)

3 个答案:

答案 0 :(得分:1)

1)是的,这是对的。这是最好的复杂性可能,因为任何类型都必须至少查看数字,这是 O(n)

2)是的,每个号码都在 O(1)中转换为base-n。简单的方法是在数字位数 O(m ^ 2),通常假设您可以对数字进行算术运算,直到 O(n) O(1)时间。 m 是恒定的所以 O(m ^ 2) O(1) ......但实际上这一步只是说基数您在基数排序中使用的是 O(n)。如果您实现了这一点,那么您将使用2> = n 的最小功率,因此您不需要这些转换。

3)是的,如果 m 常量。最简单的方法是使用 n 的基数LSB优先基数排序 m 。每次传递需要 O(n)时间,并且算法需要 O(n)额外内存(以可以保持 n 的单词测量)。

所以作者是对的。但实际上,这通常是从另一个方向接近的。如果您要编写一个对机器整数进行排序的函数,那么在某个较大的输入大小时,如果切换到基数排序,它会更快。如果 W 是最大整数大小,那么这个权衡点将是 n> = 2 ^(W / m)的某个常数 m 这与约束相同,但明确表示我们只考虑大尺寸输入

答案 1 :(得分:0)

错误的假设是基数排序为O(n),而不是。{/ p>

如wiki所述:

  

如果所有n个密钥都是不同的,则w必须至少为log n   随机访问机器能够将它们存储在内存中,这给出了   最多是时间复杂度O(n log n)。

答案是否定的,#34;作者实施"是(充其量)n log n。同样转换这些数字可能需要超过O(n)

答案 2 :(得分:0)

  
      
  1. 这是对的吗?
  2.   

是的,这是对的。如果n用作基数,那么它将需要3个基数排序,其中3是常数,并且由于时间复杂度忽略常数因子,因此它是O(n)。

  

和最佳时间?

并非总是如此。根据n的最大值,可以使用更大的基数,以便在2个基数排序过程或1个计数排序过程中完成排序。

  
      
  1. 如何在O(n)中转换n个数字的基数?像每个数字的O(1)?
  2.   

O(1)仅表示恒定的时间复杂度==每个数字的固定操作数。如果仅考虑时间复杂度,选择的方法不是最快的并不重要。例如,使用a,b,c表示大多数到最低有效数字,x表示数字,然后使用整数数学:a = x /(n ^ 2),b =(x-(a * n ^ 2)) / n,c = x%n(假设x> = 0)。 (旁注 - 如果n是常数,那么优化编译器可以将除法转换为乘法和移位序列。)

  
      
  1. 如果这是真的,那么这意味着我们可以在O(n)中对从0到n ^ m的任何n个数字进行排序?!
  2.   

仅当m被视为常数时。否则就是O(m n)。