回答編集履歴

4

説明を差し替え、図を追加

2023/11/03 12:41

投稿

yanenosuzume
yanenosuzume

スコア2

test CHANGED
@@ -1,10 +1,9 @@
1
1
  yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較してソートします。
2
2
  座標が近ければデータも近い、とか
3
3
  データが近ければ座標も近い、という保証はありませんが、
4
- 座標が近いデータは近くに並びやすくなるので、
4
+ 座標が近いデータは近くに並びやすくなります。
5
- 一般的な状況は改善するでしょう。
6
5
 
7
- あらかじめ、xとyの値を正規化しておく必要があります。
6
+ あらかじめ、xとyの値をスケーリングしておく必要があります。
8
7
  (または、下のコードでは、ビットマスク mask をy座標・x座標で別々にするなど)
9
8
 
10
9
  C言語の例を示します。(xもyも0〜255の場合)
@@ -50,42 +49,31 @@
50
49
  }
51
50
 
52
51
  ```
52
+ 図にすると、x,y 各1ビットでは
53
+ ┌─┬─┐
54
+ │0→1│
55
+ ├─/─┤
56
+ │2→3│
57
+ └─┴─┘
53
- 下はxyも0〜63の範囲35個の点並べ替えた例です。
58
+ x,y 各2ビットは、これ再帰的に適用して
59
+ ┌─┬─┬─┬─┐
60
+ │0→①│④→⑤│
61
+ ├─/─/─/─┤
62
+ │②→③│⑥→⑦│
63
+ ├─┼─┼─┼─┤
64
+ │⑧→⑨│⑫→⑬│
65
+ ├─/─/─/─┤
66
+ │⑩→⑪│⑭→⑮│
67
+ └─┴─┴─┴─┘
54
- 近く点がとまっているのがわかると思います。
68
+ ようになります。
55
- x y
56
- 2 12
57
- 13 8
58
- 23 2
59
- 18 15
60
- 25 13
61
- 5 20
62
- 14 21
63
- 8 31
64
- 17 29
65
- 26 27
66
- 32 6
67
- 36 12
68
- 59 0
69
- 62 7
70
- 49 15
71
- 57 12
72
- 33 19
73
- 42 16
74
- 39 24
75
- 45 31
76
- 48 23
77
- 54 31
78
- 3 46
79
- 11 40
80
- 21 36
81
- 30 36
82
- 24 44
83
- 37 32
84
- 36 40
85
- 40 47
86
- 48 39
87
- 54 43
88
- 62 47
89
- 49 51
90
- 52 58
91
69
 
70
+ 座標の近傍をすべて探し出すには、
71
+ やはりcoco_bauerさんのようにインデックスを2本用意する必要があるかもしれません。
72
+
73
+ あまり厳密でない用途では、上記コードのxy混成ソートが役に立つかもしれません。
74
+ ・地図アプリで近くの店を提案する
75
+ ・戦略ゲームで近くの基地を提案する など
76
+
77
+ 座標にひもづけられた大きなデータを格納する場合に、
78
+ 図のようなソート順にするとキャッシュのヒット率が上がるといった
79
+ メリットがあるかもしれません。

3

説明補足

2023/11/03 04:06

投稿

yanenosuzume
yanenosuzume

スコア2

test CHANGED
@@ -1,10 +1,15 @@
1
- yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較します。
1
+ yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較してソートします。
2
+ 座標が近ければデータも近い、とか
3
+ データが近ければ座標も近い、という保証はありませんが、
4
+ 座標が近いデータは近くに並びやすくなるので、
5
+ 一般的な状況は改善するでしょう。
6
+
2
7
  あらかじめ、xとyの値を正規化しておく必要があります。
3
- (下のコードでは、ビットマスク mask をy座標・x座標で別々にするなど)
8
+ (または、下のコードでは、ビットマスク mask をy座標・x座標で別々にするなど)
9
+
10
+ C言語の例を示します。(xもyも0〜255の場合)
4
11
  一般的なコンピュータでは、上から下、左から右の順に並びます。
5
12
  (数学のxy座標では下から上、左から右の順になります)
6
-
7
- C言語の例を示します。(xもyも0〜255の場合)
8
13
 
9
14
  ```C言語
10
15
  #include <stdlib.h>

2

スケーリングについて補足

2023/11/03 03:44

投稿

yanenosuzume
yanenosuzume

スコア2

test CHANGED
@@ -1,5 +1,6 @@
1
1
  yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較します。
2
2
  あらかじめ、xとyの値を正規化しておく必要があります。
3
+ (下のコードでは、ビットマスク mask をy座標・x座標で別々にするなど)
3
4
  一般的なコンピュータでは、上から下、左から右の順に並びます。
4
5
  (数学のxy座標では下から上、左から右の順になります)
5
6
 

1

座標の向き、並べ替えの順序を訂正

2023/11/03 03:32

投稿

yanenosuzume
yanenosuzume

スコア2

test CHANGED
@@ -1,6 +1,7 @@
1
1
  yの上位ビット、xの上位ビット、…の順で下位ビットへと交互に比較します。
2
2
  あらかじめ、xとyの値を正規化しておく必要があります。
3
- xy座標では、上から下、左から右の順に並びます。
3
+ 一般的なコンピュータでは、上から下、左から右の順に並びます。
4
+ (数学のxy座標では下から上、左から右の順になります)
4
5
 
5
6
  C言語の例を示します。(xもyも0〜255の場合)
6
7