Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Помогите подобрать структуру данных.
1
  1  Mиша Панявин [PML], 15 сентября 2010 г. 12:19:43
      Спасибо я об этом думал, но испугался "писанины", а оказывается на деле всё проще.
  2  dAFTc0d3r Делюкин Максим, 14 сентября 2010 г. 17:08:13
      Ну я это и имел в виду под: "Удалением вершины и перестроением кучи" :)
  3  dAFTc0d3r Делюкин Максим, 14 сентября 2010 г. 9:45:56
      А как мы в куче найдём первые k элементов? Удалением вершины и перестроением кучи?
Можно и кучей в принципе тогда.

А почему set будет долго работать?
     Элементарно, за K*log(N). В вершине будем хранить максимум, а извлекая будем его удалять. Если удалять не нужно, то проще потом их добавлять обратно, нежели всю кучу сохранять в массив (чтобы порядок не нарушался). Полагаю, что структура самого сета такова, что он медленнее. Еще смотря как его использовать.
  4  Беляев Сергей Николаевич, 14 сентября 2010 г. 9:39:33
      На самом деле куча вполне подойдет, только реализовывать ручками прийдется, т.к. придется хранить позиции элементов. Получается, что все операции с одним элементом требуют O(log n). Множества не советую, будет медленнее.
  5  dAFTc0d3r Делюкин Максим, 14 сентября 2010 г. 0:08:07
      for (int i=0; i <k && sii != si.begin(); ++i) {
--sii;
printf("%d ",*sii);
}
  6  dAFTc0d3r Делюкин Максим, 13 сентября 2010 г. 23:58:48
      ну так всякий set подойдёт наверное

set <int> si;
set <int> :: iterator sii;
...
si.insert(value);
...
sii = lower_bound(si.begin(),si.end(),value); //как-то так
si.erase(sii);
...
sii = si.end;

for (int i=0; i <k && sii != si.begin(); ++i) {
--si;
printf("%d ",*sii);
}
  7  SKYDOS [Vladimir SU] [skydos.blogspot.com], 13 сентября 2010 г. 21:44:08
      вернее не хип, тупанул.. дерево, всякие там SortedList(), Sorted*** и прочее.
  8  SKYDOS [Vladimir SU] [skydos.blogspot.com], 13 сентября 2010 г. 21:43:12
      как вариант Система непересекающихся множеств для (1) и (2) и heap для (3) с СНМ(система неперсек. множ.)
  9  Панявин Михаил [HKL], 13 сентября 2010 г. 19:30:39
      Нужно уметь делать три операции над множеством:
1) добавлять элемент в множество
2) извлекать элемент из множества
3) получать К самых больших из множества

P.S. просто отсортированный массив не подойдёт - долго добавляет и извлекает.
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru