2017-02-25 67 views
-2

我正在爲Hackerrank編寫一個編程問題。 https://www.hackerrank.com/challenges/30-2d-arrays。我已經解決了這個問題,但是像所有優秀的培訓開發人員一樣,我正在尋找創建最快代碼執行的2d數據結構的最佳實踐建議。矢量vs二維數組vs vs int *裏面的數組。

問題很簡單,並要求在二維數組中定義一個形狀並計算該形狀的所有出現的最高值。

因此,首先,我們不是使用模板中提供的矢量,而是使用二維數組。然而,我有一些指針的訓練,所以我做了一個結構指針這樣的二維數組:

  1. 是我的解決方案比只使用普通的舊的二維數組更好嗎?
  2. 如果是這樣,我甚至不應該爲了一個大項目而付出努力嗎?
  3. 如果不是,我應該什麼時候(永遠)選擇這種事情?

在此先感謝

#include <iostream> 
using namespace std; 

struct row { 
    signed int * usePointers; 
}; 

int main() { 
    int highest = -324; 
    int next; 

    row* chart; 
    chart = new row[6]; //allocate all rows first 

     for (int arr_i = 0; arr_i < 6; arr_i++) { 
      chart[arr_i].usePointers = new int[6]; //allocate each column here 

      for (int arr_j = 0; arr_j < 6; arr_j++) { 
       chart[arr_i].usePointers[arr_j] = 0; //fill each element here 
       cin >> chart[arr_i].usePointers[arr_j]; 
      } 
     } 

     //create the hourglass (n-3)*(n-3) times 
     for (int arr_i = 0; arr_i <=3; arr_i++) { 
      for (int arr_j = 0; arr_j <=3; arr_j++) { 
       next = 0; 
       //top 
       next += chart[arr_i].usePointers[arr_j] + 
        chart[arr_i].usePointers[arr_j+1] + 
        chart[arr_i].usePointers[arr_j+2]; 

       //mid 
       next += chart[arr_i+1].usePointers[arr_j + 1]; 

       //bottom 
       next += chart[arr_i+2].usePointers[arr_j] + 
        chart[arr_i+2].usePointers[arr_j + 1] + 
        chart[arr_i+2].usePointers[arr_j + 2]; 

       if (next > highest) 
        highest = next; 

       //cout << chart[arr_i].usePointers[arr_j]; 
      } 
     } 
     cout << highest; 

     free(chart); 

    return 0; 
} 
+0

如果您的解決方案有效,您最好在[codereview.se]上提問這個問題。 – ForceBru

+0

不要垃圾標籤!這顯然不是C.那麼「新的二維數組」會是什麼? – Olaf

+0

我使用了一個c風格的結構,並製作了一個雙指針。我認爲代碼領域對C開發人員來說很熟悉。 此外,你也是唯一一個在線程中說「新的二維數組」,不要濫用引號,因爲我搜索它,所以我可以回答你的問題,什麼都沒發現。 – Crawsome

回答

1

如果你只需要一個固定大小的二維數組,那麼你或許應該簡單地使用類似int a[6][8],並用它做。如果你需要一個動態的2D數組,通常將數組分配爲一個連續的內存塊,然後執行自己訪問數組元素所需的偏移量計算通常會更高效。亂七八糟的指針數組可能會很慢,因爲數組將位於多個不同區域的內存中,這將打敗CPU緩存算法。