【问题标题】:How do I compare two arrays that are equal but one is in ascending order and other is in descending order?如何比较两个相等但一个按升序排列而另一个按降序排列的数组?
【发布时间】:2020-12-25 06:45:36
【问题描述】:
int array1[] = {1,2,3,4,5};
int array2[] = {5,4,3,2,1};
if (std::equal(std::begin(array1), std::end(array1), std::begin(array2)))
    cout << "Arrays are equal.";
else
    cout << "Arrays are not equal.";

现在两个数组都是相等的,但是一个是升序的,另一个是降序的,所以这段代码的输出是“Arrays are not equal”,我们如何输出“Arrays are equal”?

【问题讨论】:

  • 你应该在比较之前对它们进行排序
  • @zhisme 这可以在线性时间内完成,无需修改数据。您可以在比较它们之前以线性时间反转其中一个数组,但这不是必需的,也可能是不可取的。排序更没有意义,它需要更多的工作。

标签: c++ arrays sorting


【解决方案1】:

使用reverse_iterator:

std::equal(std::begin(array1), std::end(array1), std::rbegin(array2))

【讨论】:

  • @MohsanAli 它还可以编译成非常高效的代码。这里是Compiler Explorer,内部循环只有7条汇编指令。
【解决方案2】:

如果您知道一个始终按升序排列,而另一个按降序排列,则很容易对一个使用正向迭代器,对另一个使用反向迭代器。

我的猜测是倒序只是包含相同数据但顺序不同的一个示例,而且它们恰好都是升序,您仍然希望它们比较相等。同样,如果两者的顺序是随机的,但仍然包含完全相同的元素,那么您也希望它们被视为相等。

在这种情况下,您几乎无法比较两个输入的排序副本。从理论上讲,您可以逐步完成一个,然后在另一个中搜索元素,但这很慢,并且需要非常小心才能正确(例如,除非您很小心,否则很容易最终得到一个说[1, 1, 2] 等于 [1, 2, 2])。更糟糕的是,即使你得到了真正正确的结果,你仍然会得到一个 O(N2) 算法,如果你有很多元素,它会很快变得很慢。

所以,如果你真的需要支持这一点,最实用的方法可能是为每个输入创建一个副本,对这些副本进行排序,然后将结果相互比较(尽管如果你可以对原件进行排序,这显然会减少内存使用)。

如果您正在处理大型数组,您还可以考虑使用类似std::unordered_map 的方式计算每个值出现的次数。这将预期的复杂度从 O(N log N) 降低到 O(N),因此如果元素足够多,它应该会更快(但究竟有多少足够可能很难猜测,并且可能因实现而异)。

【讨论】:

    【解决方案3】:

    从 C++20 开始,您可以使用范围工具将条件写为:

    std::ranges::equal(array1, std::views::reverse(array2))
    

    更直接、更清晰地表达了意图。

    【讨论】:

      【解决方案4】:

      请参阅解决问题的两种方法。

      1. 排序任何数组...例如。对降序数组进行排序。然后比较两个数组。但是排序函数需要 O(n log n) 时间。

      2. Traverse (Faster Approach) - 在这种方法中,让有两个数组 A1 和 A2。因此,在 A1 中从索引 0 到 A1 的长度。并在 A2 中从 A2 的长度移动到 0。如果元素相等,那么是的,两个数组都具有相同的元素,否则没有。

      int array1[]= {1,2,3,4,5}
      int array2[]= {5,4,3,2,1}
      
      bool is_same = true;
      
      for(int i=0; i<5; i++)
      {
          if(array1[i] != array2[4-i])
          {
              is_same = false;
              break;
          }
      }
      if (is_same)
          cout << "Arrays are equal.";
      else
          cout << "Arrays are not equal.";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-30
        • 2011-04-26
        • 2021-10-25
        相关资源
        最近更新 更多