簡體   English   中英

什么數據結構用於多維網格? (C ++)

[英]what data structure to use for multidimensional mesh grid? (c++)

我需要編寫一個測試平台來測試特定的算法。 該系統應該可以通過輸入和三維來定義 - 類似於片上網絡,它具有連接它們的節點和鏈接元件。 由於節點之間的維度和鏈接,我在確定要使用的數據結構時遇到了一些困難 - 像數組[x] [y] [z]這樣的三維數組很難處理,因為指針在添加鏈接時有缺點連接節點(在結構中留下幾個空值孔)。 二進制搜索樹很難實現,因為它是網格類型。 出於這個原因,我考慮過做一個鏈接更容易實現的鏈表。 (最終的測試平台應該類似於下面的演示文稿),其中每個鏈接也會映射下來,因為它們包含通信計划

01-------02-------03
| \      | \      | \
|  10----|--11----|--12
|  | \   |  | \   |  | \
|  |  19-|--|--20-|--|--21
04-------05-------06 |  |
| \   |  | \|  |  | \|  |
|  13----|--14----|--15 |
|  | \|  |  | \|  |  | \|
|  |  22-|--|--23-|--|--24
07-------08-------09 |  |
  \|  |    \|  |    \|  |
   16-------17-------18 |
     \|       \|       \|
      25-------26-------27

你們中的任何人都可以提供一些幫助,了解c ++中哪種類型的結構適合這種任務。 在給定x,y和z的尺寸參數的情況下,完成的程序應該能夠生成這樣的結構。

目前粗略的輪廓應該是這樣的

>class Node{
>  public:
>   Link* north;
>   Link* east;
>   Link* south;
>   Link* west;
>   Link* up;
>   Link* down;
>   //will contain a node specific scheduler
>}
>
>class Link{
>
>   Node* A;
>   Node* B;
>   //will contain a link specific scheduler
>}

編輯22.01.2013

首先,它是一個模擬三維網絡片上多處理器系統的測試平台。 該系統必須完成的任務是啟用測試某些算法以幫助將任務映射到這些節點(每個節點連接到處理器核心)。 鑒於此,內存消耗可能不是問題,因為它僅用於我所說的測試,因此系統必須同時具有節點和鏈接,因為它們都不能被兩個事件用於同時(鏈接上的通信將阻止所有其他通信等,這就是為什么我寫的類型節點/鏈接將有一個調度程序)

這在很大程度上取決於您將在該結構上執行哪種操作 你需要做搜索嗎? 如果是這樣,那么:基於價值還是基於頭寸? 你需要對它進行轉換嗎? 您是否必須按順序重復訪問其所有元素? 您是否必須根據其在網格中的位置來訪問元素? 你的結構稀疏還是密集

此外,您想最小化創建時間, 搜索時間, 導航時間或轉換時間嗎? 這一切都為做出決定提供了基本信息。

不會尋求基於節點和鏈接的解決方案,因為它是:

  1. 內存消耗方面很昂貴(由於額外的鏈接指針);
  2. 昂貴的復雜性 (導航所有節點需要跟隨所有鏈接,因此沒有隨機訪問),和;
  3. 數據局部性方面是昂貴的(節點將被單獨分配並在整個堆中分布在不同的地址,這將產生許多緩存未命中並減慢程序速度);
  4. 容易出錯 (搞亂鏈接很容易,特別是如果你使用原始指針並且不想支付智能指針的內存開銷)

在不了解您的要求的情況下,我可能會建議您查看Boost.MultiArray

如果你想自己做事,那么(同樣,不太了解你的要求)我會建議你使用vector<vector<vector<double>>> ,它相對簡單,沒有固定的大小和允許你在運行時調整大小,保證你通過下標操作符O(1)訪問以及數據的某些位置(這里有幾個向量,所以只要你從一個向量性能訪問數據就可以了)。

一個簡單的C風格的多維數組也是一種可能性,但它本身就是不安全的,如果我是你的話,這將使它成為最后的選擇(如果你的結構很大,也可能無法分配連續的內存塊) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM