3

多くの行と 3 つ以上の列を持つテーブルを作成する必要があります。適切で高速なデータ構造を提案します。そのテーブルからいくつかのエントリを更新したり削除したりしません。ルックアップ関数のみを使用します。
たとえば、次のテーブルがあります。

 
   | | 列 1 | 列 2 | 列 3|
| | asd | awd | ASFC |
b | asgf | アーフ | asgfc |

私は持っている:

文字列 a = "列 1"
文字列 b = "b"
文字列 c = find(a,b);

最後に、の値は にcなりますasgf

4

1 に答える 1

0

ハッシュテーブルに基づいて、連想配列 (いわゆる辞書) を使用する必要があります。ルックアップの平均時間の複雑さ - 最悪の場合は O(1 + n/k) および O(n)。テーブルを列のディクショナリとして整理する必要があります (列名をキーとして)。そして列は値の辞書でなければなりません(行名をキーとして)

より詳しい情報:

http://en.wikipedia.org/wiki/Dictionary_(data_structure ) http://en.wikipedia.org/wiki/Hash_table

C# での例:

using System;
using System.Collections;
using System.Collections.Generic;

namespace Test {
    public class Test
    {
        class Table {
            class Column {
                public Dictionary<string, string> cells;

                public Column() {
                    cells = new Dictionary<string, string>();
                }

                public string Find(string rowName) {
                    string resultValue;
                    if (cells.TryGetValue(rowName, out resultValue)) 
                        return resultValue;
                    else
                        throw new Exception("oops, no such cell");
                }
            }

            Dictionary<string, Column> columns;
            List<string> rowNames;

            public Table() {
                columns = new Dictionary<string, Column>();
                rowNames = new List<string>();
            }

            public void AddColumn(string columnName, params string[] values) {
                Column column = new Column();
                columns.Add(columnName, column);

                // fill new cells
                int counter = 0;
                foreach (string rowName in rowNames) {
                    if (counter < values.Length)
                        column.cells.Add(rowName, values[counter]);
                    else
                        column.cells.Add(rowName, "");
                    counter++;
                }
            }

            public void AddRow(string rowName, params string[] values) {
                rowNames.Add(rowName);

                // fill new cells
                int counter = 0;
                foreach (KeyValuePair<string, Column> columnPair in columns) {
                    Column column = columnPair.Value;
                    if (counter < values.Length)
                        column.cells.Add(rowName, values[counter]);
                    else
                        column.cells.Add(rowName, "");
                    counter++;
                }
            }

            public string Find(string columnName, string rowName) {
                Column resultColumn;
                if (columns.TryGetValue(columnName, out resultColumn))
                    return resultColumn.Find(rowName);
                else
                    throw new Exception("oops, no such cell");
            }
        }

        public static void Main()
        {
            Table table = new Table();
            table.AddRow("a");
            table.AddRow("b");
            table.AddColumn("column 1", "asd", "asgf");
            table.AddColumn("column 2", "awd", "aasf");
            table.AddColumn("column 3", "asfc", "asgfc");
            Console.WriteLine(table.Find("column 1", "b") );
        }
    }
}
于 2012-06-05T12:06:04.260 に答える