Ищу алгоритм удаления
Цилиндром со времен ЕС ЭВМ называлось все находящееся по головками в текущем положении.
Ну так тонко и намекаю, что до такого определения цилиндра можно дойти только по ужО выпитой
и не раз.
Но похоже все идеи по делу уже закончились. Ну ладно, будет пока неоптимальное решение.
либо полная информация и нормальные решения.
У меня такое чувство что ты забрался в раковину и никак не хочешь оттуда вылезти ![]()
Только какие то постулаты. Либо только фиксированные блоки либо только таблица обо всех блоках.
Ну вот пишу я миллион записей и ничего не удаляю, на кой мне информация о занятых блоках?
Тем более, что решение было и достаточно простое, раз не запомнилось. Но всё вертелось вокруг того, что размер блоков был кратен степени двойки.
задачу полностью определи
да не знаю что еще добавить, вроде уже всё написано.
Ну вот маленькая часть:
Есть список блоков в файле длина которых кратна степени двойки, соответственно есть начало блока Х и его длина L.
Появляется некий новый блок из того же файла с началом блока Х1 и длиной L1.
Если Х1+L1 = Х или Х+L = Х1, то блоки смежные и их можно объединить.
Ограничения: список блоков находится на диске (в памяти может не поместится), список блоков отсортирован по длине блоков.
Хочется иметь красивый алгоритм поиска смежных блоков. Что помню - это был побочный эффект организации списка блоков.
вроде уже всё написано
-------
Рамазано по постам, что-то учитывается, что опущено.
надо собрать в кучку
Надо обосновать отказ от предложенных вариантов.
Появляется некий новый блок из того же файла
-=-----
Ээээ... что значит - появляется? Его выбрали произвольно, с перекрытием других блоков? Его дописали? Начало? средина? Конец? Перехлест имевшихся блоков?
То, что Ты сам,Я или кто-то еще имеет какое-то свое понимание - не важно - опиши детали.
Х1+L1 = Х или Х+L = Х1
-------
Ну так у тебя написно - проверить текущий (Х1) на "смежность" с предыдущим и следующим.
список блоков отсортирован по длине блоков.
-------
Ну и как ты собираешься искать предыдущий и следующий?
Либо сортировка по Х, либо пороход по списку с выбором пары
побочный эффект организации списка
------
Списка или массива представления списка?
В первом случае у тебя только гарантия сортировки по длине, без информации об положении элементов списка.
Во втором у тебя список остается как был, но элементы можно физически упорядочить по возрастанию Х.
Его выбрали произвольно, с перекрытием других блоков? Его дописали? Начало? средина? Конец? Перехлест имевшихся блоков?
Перехлёст и перекрытие блоков абсолютно невозможно. В блоках же какая то инфа записана.
Да и вообще какая разница откуда он появляется? Если так интересно - его удалили.
не важно - опиши детали.
появляется проблема - нужно ли описывать, что земля не стоит на трёх китах?
Ну так у тебя написано
сам же просишь опиши детали, вот это и важные детали, а то опять цилиндр приплетёшь.
Ну и как ты собираешься искать предыдущий и следующий?
ну это и есть задачка....
Либо А, либо Б
Так не бывает, вполне может быть и С. Так это это чисто твое персональное мнение.
Например, считаем минимальный размер блока 16 байт, тогда все блоки в списке можно представить в двоичном виде
0 0 1 0 0 1 1 1 0 0 1 1000 0,16,32,48,64,80,96,112,128, 144,160, 176 -> адрес
Здесь 3 блока длиной 16,48 и 32 байта, по адресам 32, 80, 160
Тоже самое но без пробелов
001001110011000
добавляем теперь блок в 32 байта, по адресу 48
001111110011000
сразу видно, что с адреса 32 появился большой блок в 6*16=96 байт
это и есть задачка
------
Не-е, это не задачка - у тебя просто нет этой информации
минимальный размер блока 16 байт
-------
256 - не хочешь из-за большой таблицы.
Здесь 3 блока длиной ... добавляем теперь блок в 32 байта, по адресу 48
------
У тебя выше блок определен как 16 байт.
32 байта блоке быть не может - используй другой термин. Пусть будет - сегмент - добавил сегмент из двух блоков.
Что у тебя должно получится в списке? Таблицу ( не список ) занятых/свободных блоков Я вижу.
Остаются три 4 ранее определенных сегмента?
Или их надо конвертирвать в два? В смысле - три - слипаются?
Сегмент удаляется целиком или произвольными блоками?
вторичная сортировка никак невозможна
-------
Тогда что ты понимаешь под тем что список отсортирован?
Физически упорядоченные узлы (нах тогда список?) или логически упорядоченные ( т.е. 9 ссылается на 5 потому что 5 - описывает следующий по размеру сегмент)
Это Я к тому, что логические связки могут быть по размеру, а физический порядок - по номерам начального блока. Изменение одного не меняет второго.
У тебя выше блок определен как 16 байт.
определен только минимальный размер блока
В смысле - три - слипаются?
А что это не естественно? Три смежных свободных сегмента можно смело пустить в дело как один.
Сегмент удаляется целиком или произвольными блоками?
Сегмент или нужен или не нужен. Но у меня есть только блоки переменной длины.
Тогда что ты понимаешь под тем что список отсортирован? (по размеру блока)
Я могу достаточно быстро найти блок зная его размер.
Любой другой поиск не предусмотрен либо может организовываться простым перебором всех элементов.
Это Я к тому, что логические связки могут быть по размеру, а физический порядок - по номерам начального блока
Ну это уже два типа сортировки одних и тех же элементов. Которая осуществляется по мере расширения списка, а не некими дополнительными проходами.
определен только минимальный размер блока
-------
Ну следующий будет 18 байт....
А что это не естественно?
--------
нет.
Три смежных свободных сегмента можно смело пустить в дело как один.
------
Вот тут ты сам себе противоречишь - либо они слипаются, либо остаются отдельными.
Ты говоришь - слипаются, но в то же время у тебя как то имеются смежные не слипшиеся.
Доопределяй.
Но у меня есть только блоки переменной длины.
-------
Т.е. имется 16 байт переменной длины.
может организовываться простым перебором всех элементов.
----------
Ну это Я тебе давно сказал - либо организация, либо перебор.
Ну это уже два типа сортировки одних и тех же элементов.
-------
Аааа... ты необходимости пересортировки боишься.
Зря. Тебе предлагается один список удовлетворяющий обоим критериям одновременно.
Ну следующий будет 18 байт....
не может быть в принципе, следующий 32.
Вот тут ты сам себе противоречишь - либо они слипаются, либо остаются отдельными.
Не вижу никакого противоречия. Есть либо занятые блоки, либо свободные.
У занятых блоков нет операции слияния. Только свободные имеют такое право.
Т.е. имется 16 байт переменной длины.
блоки могут быть переменной длины, 16 байт - абсолютно минимальный размер блока.

