【问题标题】:How to sort binary array in linear time? [duplicate]如何在线性时间内对二进制数组进行排序? [复制]
【发布时间】:2017-06-30 12:14:56
【问题描述】:

http://www.techiedelight.com/sort-binary-array-linear-time/

线性时间意味着我们只需要遍历数组一次,但是根据这里的解决方案,我们将首先遍历数组以找到零的数量,然后再次遍历它以填充数组的第一部分用零,其余部分用一。

那么,线性时间解决方案如何? 我错过了什么?

【问题讨论】:

  • O(2n) => O(n),这是线性的。
  • 请解释一下-我对线性事物的理解可能不清楚。 @Stargateur

标签: arrays algorithm sorting binary time-complexity


【解决方案1】:

时间复杂度线性时间表示为O(n)。这意味着运行时间相对于输入的大小线性增加。将数组的所有元素相加的示例,与数组的长度成正比。

具体到你的例子,看看Sort()中的这个循环:

int zeros = 0;
for (int i = 0; i < n; i++)
    if (A[i] == 0)
        zeros++;

此循环线性遍历A[],并对零的数量求和。这些循环中也应用了线性时间:

int k = 0;
while (zeros--)
    A[k++] = 0;

// fill all remaining elements by 1
while (k < n)
    A[k++] = 1;

因为您只是遍历A[] 一次。

这些操作组合在一起是O(2n),因为数组被遍历了两次。因此函数Sort()是一个O(2 * n)操作,它等价于O(n)

这是另一个例子。如果您必须对 100 个二进制数与 10 个二进制数进行排序,哪个会花费更多时间?在这种情况下,排序 100 个二进制数将比排序 10 个二进制数长 10 倍。这是因为线性时间相对于输入n 的大小线性增加。

【讨论】:

    【解决方案2】:

    如果算法的时间复杂度为 O(n),则称该算法需要线性时间或 O(n) 时间。通俗地说,这意味着对于足够大的输入大小,运行时间会随着输入大小线性增加。

    因为这个算法横穿了数组两次。它仍然是线性的。考虑一个线性方程 y = 2*x。

    【讨论】:

      【解决方案3】:

      所有共享的方法都是线性时间复杂度,即O(n)。但是他们直接/间接地遍历数组中的相同元素两次,而 Aquarius(The Asker)正在寻找一次性遍历方法。以下代码遍历数组一次,并在遍历时对其进行排序。

      int left = 0, right = arr.length - 1;
      while (left < right)
          {
              while (arr[left] == 0 && left < right)
                  left++;
      
              while (arr[right] == 1 && left < right)
                  right--;
      
              if (left < right)
              {
                  arr[left] = 0;
                  arr[right] = 1;
                  left++;
                  right--;
              }
          }
      

      为了记录,

      O(c*n) = O(n),其中 c 是一个常数

      【讨论】:

        【解决方案4】:

        “线性时间”是指算法所需的时间随着数组的大小线性增加。在这里,对于您添加到数组中的每个项目,您还有两个比较(即 2n)。

        【讨论】:

          【解决方案5】:

          在解决方案中,数组被遍历了两次。所以,订单是O(2n) = O(n)。 Big-O 符号忽略常量。 n2n 都随着 n 的值线性增长。将常数与函数相乘或相加不会改变函数的行为。

          【讨论】:

          • 请解释一下线性排序的含义。不是说数组应该遍历一次吗?
          • @AquariusTheGirl;在这种情况下,linear 表示时间复杂度用线性函数表示。
          【解决方案6】:

          O(2n)、O(1221n)、O(n)、O(n/2)。所有这些都是线性的。这意味着执行时间总是在不断变化。因此,例如,如果您有一个大小为 10 的数组,它总是比对大小为 5 的数组进行排序要多两倍。

          【讨论】:

          • 是的。 / 是除法。
          猜你喜欢
          • 2013-10-07
          • 2014-03-27
          • 2019-12-11
          • 2014-03-02
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多