二維坐標離散化


離散化的思想就是將分布大卻數量少(即稀疏)的數據進行集中化的處理,這樣可以有利於程序的空間與時間,能減少遍歷次數與空間儲存。

然而雖然我會了思想今天問了翔神半天才知道怎么實現。。

其實實現的方式與口述的角度還是有所不同。

思想理解起來其實道理很簡單,如坐標(3,2000),(10005,31),(10006,5)離散至新圖,先看x坐標,3個點有3,10005,10006,離散后即1,3,4; 3 -> 1,由於10005與3不是連續的兩個數故10005 -> 3,又10006與10005是連續的兩個數(即相鄰)故10006 -> 4,同理看y坐標,3個點有2000,31,5,按上面的思想離散的結果即5 -> 1,31 -> 3,2000 -> 5。離散后三個點坐標為(1,5),(3,3),(4,1)

代碼實現的方式並不是很簡單。先用 結構體or兩個數組(這里我用的結構體 node )存下需要離散的點(x,y),再用一個數組 x[ ]存所有點的x坐標,用數組 y[ ]存所有點的y坐標,為了能按順序離散以及提高效率,將在數組 x[ ],y[ ]中加入原圖的最小最大值來表示圖的邊界,然后排序並去重。得到處理后數組長度len1,len2。

設一個tot用來表示新圖的下標,然后就for i in len一遍判斷前后兩個數如果只相差1說明連續,則tot++就可以用一個數組 nx[ ],ny[ ]存 下一個點,否則可以存一個中間值。這樣就得到了一個原坐標與離散坐標的一個映射關系,這種映射關系即nx[ ],ny[ ]里每個下標與相應值。

在按照這個映射關系將一開始存在node里的x,y用lower_bound(nx,nx+tot,node[ i ].x) - nx得到對應下標,y同理省略,存入新圖。

綜上離散完畢。

 

附上離散板子

注意最后存的數組ma[][]中的maxn應該是2*點數+5。

 

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 點數;//這個就是離散完的圖的大小
 5 const int maximum = 離散前圖的最大邊界;
 6 struct Node
 7 {
 8     int x,y;
 9 }node[maxn];
10 int x[maxn], y[maxn];
11 int  nx[maxn], ny[maxn];
12 int m[maxn*2+5][maxn*2+5];
13 void discrete(int n)
14 {
15     int tot1 = 0,tot2 = 0;
16     //x y數組下標從1開始
17     //一般1是圖的最小邊界,最大邊界maximum看題意自己定吧。
18     x[0]=1,x[n+1]=maximum;
19     y[0]=1,y[n+1]=maximum;
20     sort(x,x+n+2);//數組長n+2
21     sort(y,y+n+2);
22     int len1 = unique(x,x+n+2) - x;
23     int len2 = unique(y,y+n+2) - y;
24     //離散x軸
25     for(int i = 0; i < len1;i++)
26     {
27         if(i&&x[i]!=x[i-1]+1)nx[tot1++]=x[i]-1,nx[tot1++]=x[i];
28         else nx[tot1++]=x[i];
29     }
30     //離散y軸
31     for(int i = 0; i < len2;i++)
32     {
33         if(i&&y[i]!=y[i-1]+1)ny[tot2++]=y[i]-1,ny[tot2++]=y[i];
34         else ny[tot2++]=y[i];
35     }
36     //用映射關系將需離散的點放入離散圖中
37     for(int i = 0;i < n;i++)
38     {
39         int newx=lower_bound(nx, nx+tot1,node[i].x)-nx;
40         int newy=lower_bound(ny, ny+tot2,node[i].y)-ny;
41         m[newx][newy]=1;
42     }
43 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM