2012-03-12 28 views
0

我有一個模仿Excel表格屬性的對象結構。所以我有一個包含屬性的表格對象,如標題,標題行對象和主體行對象。在標題行和每個主體行對象中,我有一個單元對象,每行包含每個單元格的信息。我正在尋找一種更有效的方法來存儲這個表結構,因爲在我使用這個對象時,我將它的結構打印到屏幕上。目前,我正在做一個爲O(n^2)打印每行每一個細胞的複雜性:簡化表格對象結構的複雜性

foreach(var row in Table.Rows){ 
    foreach(var cell in row.Cells){ 
     Console.WriteLine(cell.ToString()) 
    } 
} 

是否有存儲這種結構避免了N^2的更有效的方法?我問這是因爲這個打印功能存在於另一個n^2循環中。基本上我有一個表格標題和表格列表。我需要找到那些標題列在標題列表中的表格。然後對於每個表格,我需要在每行中打印它們的行和單元格。可以通過使用不同的數據結構進行存儲來優化此操作的任何部分?我不知道他們是如何工作,但我聽說過哈希和字典?

由於

+4

如果要打印出表n列和n行,那麼你打印出N^2項,因此n^2的時間是不可避免的。或者你的數據稀少,你可能只有數據在這些單元的一小部分中打印? – Chris 2012-03-12 15:05:04

+0

表格是正方形的,對吧? – Jodrell 2012-03-12 15:05:56

+0

您可以在某些情況下優化存儲空間,但不能優化打印。 – Svarog 2012-03-12 15:09:33

回答

1

既然你正在尋找具體名稱表,你可以使用一本詞典標題

Dictionary<string,Table> tablesByTitle = new Dictionary<string,Table>(); 

tablesByTitle.Add(table.Title, table); 
... 

table = tablesByTitle["SomeTableTitle"]; 

這將使查找表的O(1)操作的表存儲。查找n表將是O(n)操作。

打印表格的原因取決於行數和列數。沒有什麼可以改變這一點。


UPDATE:

string tablesFromGuiElement = "Employees;Companies;Addresses"; 
string[] selectedTables = tablesFromGuiElement.Split(';'); 
foreach (string title in selectedTables) { 
    Table tbl = tablesByTitle[title]; 
    PrintTable(tbl); 
} 
+0

我如何在第一個地方添加一個字典條目?我的意思是現在我有兩個名單,一個名字和一個表格。我如何在詞典中添加matchning條目?我不會首先找到哪個表匹配哪個表標題?這是否會打破字典的目的,即時通訊仍然會在n^2時間內迭代這兩個列表以找到表格的匹配標題以便添加到字典中? – 2012-03-12 15:36:58

+0

如果將標題存儲在表類中,則將標題存儲在單獨的列表中沒有意義。您可以完全刪除標題列表和表格列表。如果由於某種原因需要保留表格列表,您可以這樣做。重寫表類中的'ToString()'以返回表標題。例如,如果要在ComboBox中顯示標題列表,則可以將表格對象添加到ComboBox中,並自動顯示標題。 SelectedItem將是一個表格,而不僅僅是一個表格標題。 – 2012-03-12 15:59:40

+0

標題的單獨列表來自gui元素。用戶根據文本輸入選擇要查看的表格。然後,在執行「顯示錶」按鈕時,將這些逗號分隔的表格標題內置到列表中。然後,我要查找要在列表中打印的表格 – 2012-03-12 16:02:17

0

沒有任何比用於輸出值的NxN矩陣的N^2操作更高效。最壞的情況下,你會一直這樣做。

現在,如果不是將值存儲在定義行和列的圖形關係的多維集合中,而是將它們放入一維集合中,並將行列信息包括在每個單元格中,那麼您只會需要迭代具有值的單元格。對於N行和N列完全填充(一維數組,儘管線性列舉,將有N^2個項目)的表格,最壞情況仍然是N^2,但最好的情況是隻有一個該表中的單元格被填充(或沒有),這將是恆定時間。

+0

同樣的區別,但很難查找,我跟着第一段。 – Jodrell 2012-03-12 15:16:06

+0

你可以假設所有的表格都是完整的 – 2012-03-12 15:17:25

0

此答案適用於打印表格部分,但問題已擴展。

獲取表部分,請參閱other answer


不,沒有。除非您的值遵循某種可預測的分佈,否則您可以使用x和y的函數,並且根本不存儲數據,或者可能是種子和函數。

如果您需要多次,可以將打印輸出緩存在字符串或StringBuider中。

如果有足夠的數據,我想你可能會應用一些壓縮算法,但我不會說這是更簡單或更有效。