2012-03-12 10 views
0

私は、Excelテーブルのプロパティを模倣しているオブジェクト構造を持っています。だから私はタイトル、ヘッダー行オブジェクトとボディ行オブジェクトなどのプロパティを含むテーブルオブジェクトを持っています。ヘッダー行と各本体行オブジェクト内に、私は行ごとに各セルの情報を含むセルオブジェクトを持っています。私は、このオブジェクトのための私の用途の1つで、私はその構造をスクリーン印刷しているので、このテーブル構造を格納するためのより効率的な方法を探しています。現在、私は、各セルの各行を印刷するための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

+0

テーブルは正方形ですね。 – Jodrell

+0

場合によってはストレージを最適化できますが、印刷を最適化することはできません。 – Svarog

答えて

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

最初に辞書エントリを追加するにはどうすればよいですか?私は今、私は名前とテーブルの2つのリストを持っていることを意味します。どのように私は辞書にmatchningエントリを追加するのですか?私はまず、どのテーブルがどのテーブルのタイトルにマッチするかを見つけなければならないでしょうか?これは、辞書を追加する目的で、テーブルに一致するタイトルを見つけるためにn^2の時間に両方のリストを繰り返しているとして、辞書を持つ目的を打ち消しませんでしたか? –

+0

テーブルクラスにタイトルを格納する場合、タイトルを別のリストに格納する必要はありません。タイトルリストとテーブルリストを完全に削除することができます。何らかの理由でテーブルリストを保持する必要がある場合は、それを行うことができます。テーブルのタイトルを返すには、テーブルクラスの 'ToString()'をオーバーライドします。たとえば、ComboBoxにタイトルのリストを表示する場合は、ComboBoxにテーブルオブジェクトを追加するだけで、タイトルが自動的に表示されます。 SelectedItemはテーブルタイトルではなくテーブルになります。 –

+0

タイトルの別のリストはgui要素から来ます。ユーザーは、テキスト入力に基づいて表示する表を選択します。次に、これらのコンマ区切りの表題は、Show Tablesボタンの実行時にリストに組み込まれます。私はテーブルの私のリストに印刷するそれらのテーブルを探しています –

0

値のN×N個の行列を出力するためのN^2の動作よりも効率的なものではありません。最悪の場合、あなたはいつもこれをやっています。

行と列のグラフィカルな関係を定義する多次元コレクションに値を格納する代わりに、それらを1次元のコレクションに入れ、各セルに行情報を含めると、値を持つセルを反復処理する必要があります。ワーストケースは、N行とN列のテーブルが完全に配置されている場合(1次元配列ですが、列挙するために線形になっていますが、N^2個のアイテムがあります)、最悪のケースはN^2ですが、そのテーブルのセルには一定時間になる(または存在しない)セルが設定されます。

+0

同じ違いですが、ルックアップが難しく、私は最初の段落に行きます。 – Jodrell

+0

すべてのテーブルが完全に完全であると仮定することができます –

0

この回答はテーブル部分を印刷する場合に適用されますが、質問は拡張されました。

テーブルパーツを入手するには、other answerを参照してください。


いいえ、ありません。

おそらく値が予測可能な分布に従わない場合は、xとyの関数を使用してデータをまったく格納しないことも、シードと関数を格納することもできます。

複数回必要な場合は、プリント出力を文字列またはStringBuiderにキャッシュすることができます。

データが十分あれば、圧縮アルゴリズムを適用するかもしれないと思いますが、それはもっと単純で効率的だとは言えません。

あなたが特定のタイトルを持つテーブルを探しているので
関連する問題