Russian Qt Forum
Ноябрь 23, 2024, 10:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Слияние 2 сортированных контейнеров  (Прочитано 7172 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Август 04, 2014, 12:50 »


Но, вот если юзер тыкнет мышью и изменит значение на 0.0, то затраты на "выковыривание" этой точки из первого контейнера (вектора) перекроют затраты на поиск..
С одной точкой все прекрасно получается в общем виде. Все равно чтобы "выковырять" ее надо сначала найти.

Хотите быстрый поиск (logN), придётся использовать контейнер с random access доступом..
Короче, оно того стоит?     
Насколько я помню random access означает просто одинаковое время доступа к эл-ту, массив этому требованию удовлетворяет. Вероятно Вы имели ввиду ассоциативный контейнер, напр std::map/set. С таким конечно думать не надо, все операции очевидны (за что придется заплатить перегонками в др местах кода). И так ли уж это хорошо? Напр при большом кол-ве удаляемых std::set легко может оказаться медленнее. Вообще чем сортированный массив хуже? Тем что накладно вставлять/удалять? Так здесь это в одной интерактивной операции, не страшно. Что тут сложного/военного? Только то что никогда раньше это не делали  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #16 : Август 04, 2014, 13:36 »

Цитировать
Насколько я помню random access означает просто одинаковое время доступа к эл-ту, массив этому требованию удовлетворяет. Вероятно Вы имели ввиду ассоциативный контейнер, напр std::map/set. С таким конечно думать не надо, все операции очевидны (за что придется заплатить перегонками в др местах кода). И так ли уж это хорошо? Напр при большом кол-ве удаляемых std::set легко может оказаться медленнее. Вообще чем сортированный массив хуже? Тем что накладно вставлять/удалять? Так здесь это в одной интерактивной операции, не страшно. Что тут сложного/военного? Только то что никогда раньше это не делали
random access - это фактически доступ по индексу за константное время (например вектор).
Например в списке, даже сортированном, поиск будет "линейным", а не "логарифмическим", но..
Я хотел сказать, что если подразумевается возможное удаление, вставка элементов, то для вектора, даже с логарифмическим поиском, это будет затратнее в целом, чем, например, с тем же списком, хоть и с линейным поиском.
Вообщем, все эти пляски с частными случаями и оптимизацией сейчас напоминают миф о Сизифе..

Может имеет смысл/правильнее вернуться назад и пересмотреть архитектурно те решения, которые привели к этой задаче?) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Август 04, 2014, 14:28 »

Вообщем, все эти пляски с частными случаями и оптимизацией сейчас напоминают миф о Сизифе..

Может имеет смысл/правильнее вернуться назад и пересмотреть архитектурно те решения, которые привели к этой задаче?) 
К чему сводится этот "архитектурный пересмотр"? Давайте возьмем более подходящий контейнер (напр std::set). Это понятно, но не всегда удобно/выгодно. Есть др модули для которых текущий формат данных утвержден (кстати он такой же и в др приложениях), а гонять из одного контейнера в другой не есть хорошо. Кроме того, прикинув возможные варианты, легко убедиться что шаблонное решение std::set оптимальным совсем не является. Вот были бы данные не сортированы - тогда да, а так нет.

Меня вполне устраивает слияние в выходной контейнер (как обсуждалось выше), но интересна общая ситуация. Фактически есть сортированный контейнер (первый) и набор команд (типа batch) - второй контейнер. Набор полный: изменить/добавить/удалить. Как его оптимально "процессить"?

Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 24.