3

インタージャーの配列があるとします。

A[]={2, 2, 9, 8, 5, 7, 0, 6}

とステンシル:

B[]={1, 0, 0, 1, 1, 1, 0, 1}

私の質問は、B [i] == 1、B [j] == 0の場合、A[i]がA[j]の前にあることが保証されるように、B[]に従ってA[]をどのように再配置できるかということです。新しい配列。次のようになります。

C[]={2, 8, 5, 7, 6, 2, 9, 0}

PS:述語のみをサポートしていることを除けば、「パーティション」関数がほとんど答えであることがわかりました。回避策はありますか?

ヒントは大歓迎です!

4

2 に答える 2

1

これは、を使用して実装できますthrust::stable_sort_by_key()

于 2012-08-31T03:52:10.930 に答える
1

ステンシルが実装されたので(公式のThrustリポジトリからソースを取得する必要があるかもしれませんthrust::partitionこれは次の方法で実現できます。thrust::stable_partition

#include <thrust/partition.h>

struct is_one
{
  __host__ __device__
  bool operator()(const int &x)
  {
    return x == 1;
  }
};

// Partition values on device thanks to stencil
thrust::stable_partition(d_A.begin(),
                         d_A.end(),
                         d_B.begin(),
                         is_one());

これは次のことにつながります:

    A = 0   1   2   3 4   5   6 7   8   9
    B = 0   1   1   0 0   1   0 0   1   0
    C =    1   2   5   8   0 3 4 6 7 9

2つのパーティションの値を並べ替えていないため、この実装はより効率的です。同様のより複雑な例がここにあります(回答にいくつかの詳細があります)。

于 2013-05-19T04:41:35.333 に答える