これは、私が思いつくことができる最もメモリ効率の良いレイアウトです。明らかに、エンディアンがすべて適切に処理されていると仮定すると、使用しているベクトルは使用しているデータブロブに置き換えられます。以下のコードの前提は単純です。
1024 個のランダムな値をペアで生成します。各ペアは、1 から 500 までの最初の数値と 1 から 50 までの 2 番目の数値で構成されます。
リスト全体を反復し、すべての偶数インデックス値を次の奇数インデックス値で反転します。
2つstd::qsort
の値のアイテム幅と元のベクトルの半分のカウントで全体を送信します。int32_t
コンパレータ関数は、最初に即値でソートし、最初の値が等しい場合は 2 番目の値でソートします。
以下のサンプルは、1024 個のアイテムに対してこれを行います。134217728 アイテム (正確には 536870912 バイト) の出力なしでテストしたところ、わずかな macbook air ラップトップでは約 15 秒で、実際の並べ替えでは約 10 秒しかかからず、かなり印象的な結果が得られました。理想的に最も重要なことは、データ ベクトルを超えて追加のメモリ割り当てが必要ないことです。はい、純粋主義者には、私は呼び出しスタック スペースを使用しますが、それは q-sort が使用するためです。
あなたがそれから何かを得ることを願っています。
注: 出力の最初の部分のみを表示しますが、探しているものが表示されることを願っています。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <cstdint>
// a most-wacked-out random generator. every other call will
// pull from a rand modulo either the first, or second template
// parameter, in alternation.
template<int N,int M>
struct randN
{
int i = 0;
int32_t operator ()()
{
i = (i+1)%2;
return (i ? rand() % N : rand() % M) + 1;
}
};
// compare to integer values by address.
int pair_cmp(const void* arg1, const void* arg2)
{
const int32_t *left = (const int32_t*)arg1;
const int32_t *right = (const int32_t *)arg2;
return (left[0] == right[0]) ? left[1] - right[1] : left[0] - right[0];
}
int main(int argc, char *argv[])
{
// a crapload of int values
static const size_t N = 1024;
// seed rand()
srand((unsigned)time(0));
// get a huge array of random crap from 1..50
vector<int32_t> data;
data.reserve(N);
std::generate_n(back_inserter(data), N, randN<500,50>());
// flip all the values
for (size_t i=0;i<data.size();i+=2)
{
int32_t tmp = data[i];
data[i] = data[i+1];
data[i+1] = tmp;
}
// now sort in pairs. using qsort only because it lends itself
// *very* nicely to performing block-based sorting.
std::qsort(&data[0], data.size()/2, sizeof(data[0])*2, pair_cmp);
cout << "After sorting..." << endl;
std::copy(data.begin(), data.end(), ostream_iterator<int32_t>(cout,"\n"));
cout << endl << endl;
return EXIT_SUCCESS;
}
出力
After sorting...
1
69
1
83
1
198
1
343
1
367
2
12
2
30
2
135
2
169
2
185
2
284
2
323
2
325
2
347
2
367
2
373
2
382
2
422
2
492
3
286
3
321
3
364
3
377
3
400
3
418
3
441
4
24
4
97
4
153
4
210
4
224
4
250
4
354
4
356
4
386
4
430
5
14
5
26
5
95
5
145
5
302
5
379
5
435
5
436
5
499
6
67
6
104
6
135
6
164
6
179
6
310
6
321
6
399
6
409
6
425
6
467
6
496
7
18
7
65
7
71
7
84
7
116
7
201
7
242
7
251
7
256
7
324
7
325
7
485
8
52
8
93
8
156
8
193
8
285
8
307
8
410
8
456
8
471
9
27
9
116
9
137
9
143
9
190
9
190
9
293
9
419
9
453