2017-10-12 77 views
1

我在正方形(即區域)的網格中執行一些地理計算。我使用的是Delphi,但是這個邏輯也可能應用於C++。讓我先解釋一下我想做什麼。訪問或省略不存在的數據

下面的圖像是「穿過層運動」一個我的網格,其通過二維陣列Square,它表示在每個正方形的中心點表示的部分,並且:

Image

綠色方塊的X和Y座標爲2,因此是Square[2,2]。實際座標存儲在Square[2,2].LatitudeSquare[2,2].Longitude中,以及例如其他信息。我用於計算的Square[2,2].Info

現在的目的是:我需要對周邊地區進行一些計算。有多少周邊地區可以稱爲「鄰居」,取決於我定義了多少「層」。在上面的圖片中,我使用了這兩個「圖層」。這意味着,從綠色單元開始時,我繞過一次(藍色箭頭),然後再次在第二層(紅色箭頭)中移動。

現在出現這個問題:如果我開始在Square[1,1](綠色正方形)而不是Square[2,2](如下圖所示),第二層(紅色)會嘗試訪問左側和底部的數據不存在(即在「-1」列和行中)。看到下面的圖片。當然,這個問題發生在所有邊界。

Image

我大概可以用IF語句爲每個場景中的例外,但如果有常見的編程「招數」,您試圖訪問數據不存在,可以處理這種情況我不知道。

例如,我想如果我可以按照第一張圖片中描繪的箭頭的圖案每次訪問所有相鄰方塊,即使存在不存在的方塊,它也會非常方便。所以,看着第一張圖片,在Square[3,0]之後,你會看到Square[3,-1]等東西,然後最終回到Square[0,3]的「可行」區域。

+0

我投票結束這個過於寬泛。 StackOverflow不適合人們爲您編寫算法,或者推薦關於算法設計的教程。請將您的問題重點放在特定問題上。 –

+0

在嘗試優化代碼之前,需要處理的最大可能數據集是什麼?您是否通過循環遍歷每個元素,在最大的數據集上嘗試了傳統的O(n)方法?如果訪問每個元素的作品,你可能會這樣做。 – user3437460

+0

@RemyLebeau:對不起,我已經編輯了這篇文章,以便更加關注點和編程問題。 – artnaz

回答

0

要訪問鄰域,您可以使用某種BFS(廣度優先搜索)。

但是對於稀疏結構(如最後一張圖所示),使用一些數據結構以良好方式組織單元格是值得的。也許kd-tree是合適的 - 你添加樹中所有現有的單元格,並在給定單元格周圍進行範圍搜索以獲得其附近的其他單元格。

另請參見另一空間數據結構(請參閱kd-tree頁面底部的列表)。

+0

不應該是*廣度*首先搜索? (你不是在談論你在麪包店買的東西,是嗎?)https://en.wikipedia.org/wiki/Breadth-first_search – dummzeuch

+0

謝謝,這確實是一種可能的方法。但是,如果我有一百萬個位置,那麼在所有位置上執行這樣的分區技術將是非常低效的。 就我而言,我確切地知道我的鄰居,並可以用我所說明的箭頭訪問它們。但問題是如何編程訪問區域外的位置,因此不存在。或者,也許這不應該像我想的那樣容易...... – artnaz