Какова наиболее эффективная структура данных для хранения списка целых чисел, которые нужно много искать в .Net? - PullRequest
3 голосов
/ 17 августа 2010

Мне нужна эффективная структура данных для хранения списка целых чисел. Сумма в списке может варьироваться от 1 до, вероятно, никогда не более 1000. Список будет запрашиваться около 20 раз за запрос. Какой тип коллекции будет наиболее эффективным для хранения?

UPDATE

Чтобы дать немного больше понимания, возьмем www.wikipediamaze.com (небольшая игра, которую я написал) в качестве примера (не реальный сценарий, но достаточно близкий для разговора). Для списка головоломок на любой странице в настоящее время я возвращаю список из таблицы головоломок, присоединенной к таблице, в которой хранятся головоломки, в которые играл текущий пользователь. Вместо этого я хочу кэшировать список головоломок, не связанных с пользователем. Поэтому я сначала загружаю и кэширую список головоломок из базы данных. Затем я загружаю и кеширую список головоломок, в которые играл пользователь. Затем, когда я перебираю головоломки для их отображения, я хочу сделать это:

protected BestDataStructure<long> PlayedPuzzles {get; set;} //Loaded from session

protected bool HasBeenPlayed(long puzzleId)
{
    return PlayedPuzzles.Contains(puzzleId)
}

Всякий раз, когда они играют новую головоломку, я сохраняю запись в базе данных и добавляю ее в список, сохраненный в сеансе.

Спасибо!

Ответы [ 4 ]

5 голосов
/ 17 августа 2010

Это зависит от того, как вам нужно их запрашивать, но на ум приходит простой массив, или HashSet<int>.

Оба являются O (1), когда вы индексируете их. HashSet.Contains также O (1).

В ответ на ваш комментарий к вопросу : используйте HashSet, так как вам нужно проверить, существует ли указанное целое число. Вы должны использовать Contains () в HashSet для этого; это даст вам лучшую производительность. Если вам нужно сохранить какое-то другое значение, связанное со значением, возможно, используйте Dictionary.

2 голосов
/ 17 августа 2010

Если вы ищете структуру, которая эффективно выполняет такую ​​операцию, как Contains(), то HashSet<int> - это то, что вы ищете. HashSet<int> - это O (1) (постоянное время) для Contains(), что так же сложно, как вы собираетесь получить.

1 голос
/ 17 августа 2010

если вам нужно проверить наличие элемента, то, вероятно, bool[] с 1000 элементами и установить true для существующих целочисленных элементов?

1 голос
/ 17 августа 2010
...