三元陣列代表的稀疏矩陣的簡單輸入

如果有個2維資料範圍很大, ,x介於1到30000, y介於-30000到30000, 但是(x,y)的資料量不多, 最多250000筆. 這時通常不會開個xy[30001][60001]陣列來存資料, 而是放在xy[250000][3].

問題來了,如果要在xy[250000][3]裡快速地尋找同樣x或是同樣y的資料,要怎麼做呢?

我利用set來記錄資料順序, 因為資料不會重複而且set會自動幫我排序. SetX[30001]用y排序, SetY[60001]用x排序. 資料輸入後, 其實就已經排好了.

#include <stdio.h>
#include <memory.h>
#include <set>

#include<iostream>
using namespace std;

class XYNode{
	public:
		int X;
		int Y;
		int DATA;

		void Set(int x, int y, int data){
			X=x;
			Y=y;
			DATA=data;
		}

};

XYNode xynode[250000];
int NodeSize=0;

class CompareX{
	public:
		bool operator()(XYNode const *a, XYNode const *b) const {
			return a->X<b->X;
		}
};

class CompareY{
	public:
		bool operator()(XYNode const *a, XYNode const *b) const {
			return a->Y<b->Y;
		}
};

set<XYNode*, CompareX> SetY[60001];
set<XYNode*, CompareY> SetX[30001];

int main()
{
        //輸入資料
	int loop;
	cin >> loop;
	int x,y,data;	
	while(loop--){
		cin >> x >> y >> data;
		xynode[NodeSize].Set(x,y,data);

		SetY[y+30000].insert(&xynode[NodeSize]);
		SetX[x].insert(&xynode[NodeSize]);

		NodeSize++;
	}

	cout << endl;
	cout << endl;

	//列印資料
	for(y=30000;y>=-30000;y--){
		if(!SetY[y+30000].empty()){
			cout << "Y="<<y<<" ";
			auto it = SetY[y+30000].begin();
			while(it != SetY[y+30000].end()){
				cout << " " << (*it)->X <<":"<< (*it)->DATA;
				it++;
			}
                       cout << endl;
		}

	}
	return 0;
}
C++

測試資料

輸入一個正整數 N(1≤N≤250000),代表DATA的數量,接下來有N行,每一行有三個數字 X,Y和DATA。

10
2 0 1
2 -1 1
7 -1 0
7 2 1
4 2 0
4 1 0
3 1 1
3 2 0
1 -1 1
1 4 0

輸出結果

每列Y從大到小排序輸出, 同一列X從小到大排序。

Y=4 1:0
Y=2 3:0 4:0 7:1
Y=1 3:1 4:0
Y=0 2:1
Y=-1 1:1 2:1 7:0