![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Добрый день Столкнулся с такой проблемой, хочеться реализовать паттерн switch.
Задача такова: у меня есть некоторый набор объектов определенного типа. У каждого объекта есть свой уникалиный id, тоже определенного типа. Хочеться чтоб по предъявлению этого идентификатора мне возвращалась ссылка на объект который соотв. этому идентификатору. причем поиск должен осущ. за 1 шаг, те я по адресу в векторе должен стукануться. Как это сделать? Совершенно не хочеться бегать по вектору в поисках нужного объекта. Вот примерный шаблон.
Таким образом, получается касяк в обращении за один шаг к нужному объекту. Это сообщение отредактировал(а) np9mi7 - 1.4.2005, 23:19 |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Здесь не паттерн нужен, a std::map<ID, Type>
ID - тип идентификатора твоего обьекта; Type - это тип ссылки или указателя(выбор твой) на твой обьект. Как получить обьект из map:
--------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
std::map как пишут в руководствах реализует алгоритм двоичного поиска (т.к. элементы map отсортированы по первому аргументу-ключу). Поэтому число итераций поиска oпрeдeляется зависимостью: log 2 (N), N - к-во элементов. Поиск за один шаг осущ. так наз. совершенный хэш (perfect hash). Но я этим не занимался. Мне достаточно STL. --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Fire-Plug
perfect hash, а что это такое? Можешь дать ссылку? Может у кого другие предложения??? По сути, ты предложил поиск, а я тебе про поиск в один шаг. |
|||
|
||||
| Fire-Plug |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
http://www.google.com/search?hl=en&q=perfe...G=Google+Search
Я предложил весьма практичное решение на основе STL, к-рое будет приемлемо в 95% прикладных задач. Число итераций метода двоичного поиска: Для контейнера из 10-ти элементов - 3 - " - из 100 элементов - 7 (2^7 = 128) - " - из 1000 элементов - 10 (2^10 = 1024) и т.д. Простейший (и тупейший) хэш - обычный массив. Или можно с тем же успехом и по тому же принципу юзать vector.
--------------------
Объясни другому - поймешь сам (Народная примета) |
||||||
|
|||||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Fire-Plug, ты как обычно пытаешся доказать что ты сто процентов прав! да ты прав! только, можно чуть лучше, согласись.... Гуглом я тоже пользоватьеся умею.... Только хотелось получить источник их которого ты это узнал, поэтому и спросил....
Понимаешь, мне нужен доступ за один шаг! Понимаешь? Поэтому и спросил, так сказать это в условии задачи обозначено... За perfect hash спасибо, но про ln предлагаю больше не офтоппить.... ок? |
|||
|
||||
| bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
что представляет из себя уникальный id? Если Id - это обычный enum, то пихай все в array[MAX_ENUM]; |
||||
|
|||||
| yaja |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 30.3.2005 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Нужны ссылки??
http://algolist.manual.ru/ds/s_has.php или можешь почитать в любой книжке по алгоритмам )) |
|||
|
||||
| Fire-Plug |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Нет, не понимаю. Потому, что "Хочеться" вместо обоснования, почему никакие другие решения принципиально не подходят. Если вопрос этот в плане учебы, повышения проф.уровня и т.д. и т.п., об этом прямо и честно надо заявить! Тогда будет смысл искать требуемое решение. А если "Хочеться", то когда сроки прижмут фигней заниматься, то сразу перехочется.
Источник - один крутой мэн, с к-рым у меня когда-то было интервью, в т.ч. по методам поиска. Он и рассказал, что есть такой perfect hash, но делать не заставлял - std::map катила... Добавлено @ 21:59
ln - ? Это что? --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||||
|
|||||||||
| np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Ну да, при такой постановке задачи без поиска никак...
|
||||
|
|||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Я никогда раньше не знал про perfect hash, но как я подумалл, можно добиться скорости в один шаг, только помещая в ключ указатель на адрес памяти где находится соответствующий этому ключу обьект.
Тогда не нужно будет поиска, программа просто читает по адресу. Это сообщение отредактировал(а) chipset - 2.4.2005, 01:36 --------------------
|
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Похоже, что тогда возникнет ситуация, что искать придется объект самого ключа, т.к. он перестанет быть примитивным типом, значение к-рого произвольно выбирается из нек-рого множества допустимых значений и его самого надо где-то хранить.
Диалектика, знаете ли... --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Что значит примитивный ключ? Какое может быть множество допустимых значений у сложного класса? Я и хочу то всего лишь сделать базовый класс hash_object с указателем на область void, который задействуется лишь когда он будет учтен в базе map и в этот указатель будет записан указатель на соответствующий обьект. Будет один шаг, но требование все-таки придется ввести для паттерна. Это сообщение отредактировал(а) chipset - 2.4.2005, 10:27 --------------------
|
||||
|
|||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Всем спасибо за советы, топик закрыт. Немного не правильная постановка задачи, мной недопонятая.
|
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Всё догнал, моё предложение не будет работать в большинстве случаев потому что значение ключа не хранит в себе указатель.
--------------------
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |