По-моему вы просто хотите притянуть за уши хотелки к вашему решению. Человек же пишет, что не силен в алгоритмах, он не может точно сформулировать задачу, но, тем не менее, очень даже понятно чего он хочет. Свободный порт вы выдадите за О(1), а вернете вы его туда как, за O(1)?
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>По-моему вы просто хотите притянуть за уши хотелки к вашему решению. Человек же пишет, что не силен в алгоритмах, он не может точно сформулировать задачу, но, тем не менее, очень даже понятно чего он хочет. Свободный порт вы выдадите за О(1), а вернете вы его туда как, за O(1)?
Добавлю в голову/хвост списка. А что не так? Добавление в голову/хвост так же делается за константное время.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, -prus-, Вы писали:
P>>Как раз оптимизация по памяти тоже была бы к стати и поэтому представление диапазона в виде битового массива вариант подходящий. P>>Остался поиск и изменение состояний портов.
KP>Если уж ты решил остановиться на битовой карте, то вот мои исследования на этот счет.
Тю, если не доступно __builtin_ffsll, то почему в этих исследованиях не расстатривается самое напрашивающееся решение для поиска первого установленного в единицу бита?
Здравствуйте, Mystic, Вы писали:
M>Тю, если не доступно __builtin_ffsll, то почему в этих исследованиях не расстатривается самое напрашивающееся решение для поиска первого установленного в единицу бита?
Потому что:
Мне оно не пришло в голову;
Итоговый набор операций в приведенном решении врятли будет быстрее чем 2.5 (в среднем) операции `&`.
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>Здравствуйте, kaa.python, Вы писали:
KP>>Легко сделать O(1), если воспользоваться стеком/списком.
ATP>А как вы будете порт с заданным номером N удалять из списка или стека за O(1)?
Если не важен порядок получения свободных портов и не жалко 2х128К памяти, то получить О(1) очень легко.
Создаем два массива по 65К элементов (по числу доступных портов).
Первый массив (BusyArray) хранит номера портов, сгруппированные по занятости. Сперва идут свободные, затем занятые.
Переменная FirstBusy указывает на первый занятый порт.
Второй массив (PortPosition) хранит положение порта в массиве BusyArray. Получили элементарный хеш.
Чтобы освободить порт, нужно:
1. получить его положение в массиве занятых
2. переместить его на границу занятых и свободных.
3. инкрементировать FirstBusy
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Чтобы освободить порт, нужно: SVZ>1. получить его положение в массиве занятых SVZ>2. переместить его на границу занятых и свободных. SVZ>3. инкрементировать FirstBusy
В предыдущем сообщении ошибочка. Инкремент нужно вынести из под if:
Здравствуйте, kaa.python, Вы писали:
KP>Потому что:
KP> KP> Итоговый набор операций в приведенном решении врятли будет быстрее чем 2.5 (в среднем) операции `&`. KP>
Условия и TLB-промахи могут кусаться, плюс обращения к памяти.
SVZ>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>Чтобы освободить порт, нужно: SVZ>>1. получить его положение в массиве занятых SVZ>>2. переместить его на границу занятых и свободных. SVZ>>3. инкрементировать FirstBusy
SVZ>В предыдущем сообщении ошибочка. Инкремент нужно вынести из под if: SVZ>