Какова лучшая структура данных для этой таблицы поиска в памяти? - PullRequest
5 голосов
/ 13 марта 2009

Мне нужно хранить таблицу поиска в качестве члена экземпляра в одном из моих классов. Таблица будет инициализирована при создании объекта. Каждая «строка» будет иметь 3 «столбца»:

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

Я хочу выбрать структуру данных, которая обеспечит наилучшую производительность для поиска с помощью StringKey или с помощью EnumKey.

Неловко иметь 2 ключа для одного и того же значения словаря. Я никогда не сталкивался с этим раньше, поэтому мне интересно, что является нормой для такого рода вещей.

Я мог бы создать структуру Ключ / Значение / Значение вместо Ключ / Ключ / Значение, но мне интересно, какой тип влияния на производительность это может оказать.

Думаю ли я, что все это неправильно?

Ответы [ 5 ]

5 голосов
/ 13 марта 2009

Ну ... "Неправильно" - это суровый способ выразить это. Я думаю, что поскольку наиболее распространенным словарем является «один ключ к значению», и много усилий направлено на обеспечение эффективных структур данных для этого (карт), часто лучше всего использовать два из них, разделяя память для значений, если все возможно.

4 голосов
/ 13 марта 2009

У вас есть два хеш-карты.

  • Один из StringKey в значение.

  • Один из EnumKey для значения.

Вам не нужно дублировать все экземпляры Value, эти объекты могут быть разделены между двумя хэш-картами.

Если это МНОГО элементов, вы можете использовать две древовидные карты вместо двух хеш-карт. Но основной принцип («разделяй ценности») применим к обеим структурам. Один набор ценностей с двумя картами.

1 голос
/ 13 марта 2009

Действительно ли необходимо вводить одну и ту же структуру с обоими типами ключей? Вам, вероятно, не нужно перестраивать сложную структуру данных самостоятельно. Вы можете выполнить инкапсуляцию для справочной таблицы, чтобы у вас действительно было две справочные таблицы, если память не является проблемой. Вы можете использовать эту инкапсулирующую структуру для имитации возможности извлечения значения из «той же» структуры с любым типом ключа.

OR

Если есть какой-то способ сопоставления между значением перечисления и строковым ключом, вы можете пойти по этому пути, имея только один тип справочной таблицы.

0 голосов
/ 13 марта 2009

Если гарантировано, что каждое значение будет доступно обоим типам ключей, другой идеей будет преобразование одного типа ключа в другой. Например:

public Value getValue(String key)
{
    dictionary.get(key); // normal way
}

public Value getValue(Enum enumKey)
{
    String realKey = toKey(enumKey);
    getValue(realKey); // use String key
}

Вы можете сделать так, чтобы ваш Enum реализовал метод toKey (), который возвращает их ключ String, или, может быть, есть другой словарь, который отображает значения Enum на аналоги String.

0 голосов
/ 13 марта 2009

Интерфейс LINQ's ILookup (TKey, TElement) может помочь. Предполагая, что ваш словарь что-то вроде:

Dictionary<carKey, carValue> cars;

Вы можете использовать:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(... на самом деле, я думаю, что я немного неправильно прочитал вопрос - но ILookUp все еще может соответствовать требованиям, но набор ключ / значение может быть ключом и перечислением.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...