【问题标题】:How to rearrange an array by another array of indexes in c++如何通过c ++中的另一个索引数组重新排列数组
【发布时间】:2015-07-23 05:25:44
【问题描述】:

给定数组:

int data[5] = {data[0],data[1],data[2],data[3],data[4]}

…和另一个带有索引的数组:

int idx[5] = {3,1,0,2,4}

重新排列data[5] 数组的最快方法是什么,使生成的(排序的)数组变为:

data[5] = {data[3],data[1],data[0],data[2],data[4]}

【问题讨论】:

  • 最好的可以是 O(n) ,
  • 空间复杂度可以是 O(n) 吗?或者应该小于那个?
  • @polasairam 我知道的最好的方法是首先复制原始数组,然后使用 for 循环进行分配。如果我获得更好的性能,O(n) 空间复杂度是可以接受的。

标签: c++ algorithm sorting


【解决方案1】:

根据索引对数组进行成对排序:对于您在参考数组中执行的任何比较和重新排序操作,同样移动另一个数组中的相应索引。

【讨论】:

    【解决方案2】:

    您可以简单地使用temp 数组,并用您的data 的数据将其填充到您的idx 订单中

    int temp[5];
    
    for(int i = 0 ; i< 5 ; i++){
        temp[i] = data[idx[i]];
    } 
    

    【讨论】:

    • 显然问题是在没有中间容器的情况下完成任务。
    • 明显?我刚刚再次阅读了这个问题,并没有发现任何关于不使用中间容器的想法!
    • 写 temp[i] = data[idx[i]]; 有什么问题?!
    • @VladfromMoscow,如果没有 任何 其他容器,至少要跟踪已处理的索引会更加棘手
    • @VladfromMoscow 我们都看到了更容易成为人们质疑的东西,你想要的东西更漂亮,但这不是这个问题的意义所在。
    【解决方案3】:

    恕我直言,最简单和最快的方法是使用相同大小的临时数组,将数据保存到其中,然后使用适当的索引重置数据。

    for (i=0; i<5; i++) {
        sv_data[i] = data[i];
    }
    for (i=0; i<5; i++) {
        data[i] = sv_data[idx[i]];
    }
    

    【讨论】:

      【解决方案4】:

      你的意思是就地重排吗?

      int idx[5] = {3,1,0,2,4}
      int idx2[5];
      for (int i = 0; i < 5; ++i) {
          idx2[idx[i]] = i;
      }
      // we have array int idx2[5] = {2,1,3,0,4}
      
      for (int i = 0; i < 5; ++i) {
          if (i == idx[i]) continue;
      
          std::swap(data[i], data[idx[i]]);
          idx[idx2[idx[i]]] = i; // Update indices list
      }
      

      【讨论】:

        【解决方案5】:

        以下代码不是最快的。 然而,空间复杂度是 O(1)。

        int data[] = {'c', 'b', 'd', 'a', 'e'}; // input array
        int idx[] = {3, 1, 0, 2, 4};    // sorted index
        for (int i = 0; i < 5; i++) {
            if (idx[i] != i) {
                int temp = data[i]; // save a datum
                int src = idx[i];
                int dst = i;
                do {    // cyclic permutation
                    data[dst] = data[src];  // move a datum
                    idx[dst] = dst; // replace an index
                    dst = src;
                    src = idx[dst];
                } while (src != i);
                data[dst] = temp;   // restore
                idx[dst] = dst;
            }
        }
        

        data[] 重新排列如下。

        (c, b, d, a, e)
        (_, b, d, a, e) {c}
        (a, b, d, _, e) {c}
        (a, b, _, d, e) {c}
        (a, b, c, d, e)
        

        其中,{ } 是temp
        idx[] 最后重新排列为 (0, 1, 2, 3, 4)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 2017-04-08
          • 2021-12-01
          • 2022-01-25
          • 2023-03-06
          • 2016-06-20
          相关资源
          最近更新 更多