![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| fessko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.6.2006 Где: Минск, Беларусь Репутация: нет Всего: нет |
Есть такая задачаю Необходимо расширить Dictionaty<T,U> так, чтобы в нем хранилось только 10 записей. Но, если мы хотим добавить 11-ую запись, то самая старая запись удаляется. Самой старой является запись которую раньше других добавили, модифицировали, получали доступ к ней. Все операции должны выполняться за О(1). В этом и проблема. Как сделать так, чтобы добавление, доступ выполнядись за О(1). Если для каждой записи хранить время последнего доступа, мне все равно надо работать со всеми элементами - а это уже не О(1)
|
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Что то я не понимаю что это А по делу: что мешает наследоваться от Dictionary. В новом классе можно хранить время доступа к каждой записи, переписать метод Add (и другие), позволяя им удалять старую запись и добавлять на ее место новую. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Срочно читать о Big O нотации. fessko, можно, например, завести связанный список пар {ключ, значение}, при этом вновь добавляемые значения помещать в конец списка, а при доступе к значению тоже перемещать соответствующий узел списка в конец. При добавлении в словарь, уже содержащий максимально возможное число значений, удаляется пара, находящаяся в начале списка. Вот примерная реализация:
Это сообщение отредактировал(а) Void - 2.7.2006, 18:44 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
|
|||
|
||||
| fessko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.6.2006 Где: Минск, Беларусь Репутация: нет Всего: нет |
Void, cпасибо. Я для себя открыл, что в List<> все основные операции над элементами выполняются за O(1).
ivashkanet
Абсолютно верно. Это сообщение отредактировал(а) fessko - 2.7.2006, 22:33 |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
fessko, в List<> — нет, в LinkedList<> — да. Любые сомнения решаются Reflector'ом
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| fessko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.6.2006 Где: Минск, Беларусь Репутация: нет Всего: нет |
Void. Точно! Забыл помотреть удаление у List<>, а оно оказалось за О(n).
Но у LinkedList поиск за О(n) операций. Т.е. доступ к элементу в этом случае у меня будет не константный. Это сообщение отредактировал(а) fessko - 2.7.2006, 22:42 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Но ведь, LinkedList служит не для поиска, а для статистики по операциям чтения/добавления/удаления ! -------------------- ![]() |
|||
|
||||
| fessko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.6.2006 Где: Минск, Беларусь Репутация: нет Всего: нет |
А как получить thread-safe версию. Что-то я немного недопонимаю.
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ставим lock-и на все операции поиска и модификации Dictionary. Всё. -------------------- ![]() |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
У меня вопрос. А что метод в коде
... Глянул в Рефлекторе на LinkedList и убедился что все пучком P.S. Решил всетки запостить Добавлено @ 10:26 Кстати эта инструкция выполняется не за O(1). Это нормально? |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Думаю да. Невозможно (
Как минимум тогда бы это было реализовано в .Net |
|||
|
||||
| fessko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.6.2006 Где: Минск, Беларусь Репутация: нет Всего: нет |
Цитата из MSDN:
Т.о. доступ к элементу почти О(1). |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
В том то и дело что почти
Можно посмотреть код поиска в рефлекторе Добавлено @ 12:54 Там поиск ведется For-ом. Правда довольно хитрым способом |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
ivashkanet, Dictionary<,> — это хэш-таблица. Среднее время доступа к элементу хэш-таблицы O(1), но в худшем случае (при большом числе коллизий из-за неудачной хэш-функции) будет O(N).
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |