Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Ищу алгоритм удаления

3445  1 2 3 4 5 6 все
AlexNek патриот27.01.24 12:18
AlexNek
27.01.24 12:18 

Вспомнил проблемку которую давно решил, но совершенно не помню как.

Что имеем?

Некий файл, хранилище данных, данные туда записываются поблочно, типа 100, 200, 500 байт. Этих блоков может быть дофига, миллионы и больше.

Каждый блок имеет свой адрес (смещение от начала файла). Этот адрес может записываться в другие блоки, то бишь блоки желательно не перемещать.


С записью проблем проблем нет, пиши всегда в конец. Но блоки нужно удалять, либо вместо малого блока записать более большой, когда при обновлении блока данных стало больше.

Удаленные блоки можно записывать в список удаленных, после оттуда выбирать подходящие. Из больших блоков можно делать маленькие, а два маленьких соседних блока объединять в большой.


Вот как сделать этот список удаленных блоков лучшим образом? Он же тоже место будет занимать.

Удалили 1000 блоков, а после использовали 900. Список остался, но уже не такой большой.

#1 
AlexNek патриот27.01.24 12:19
AlexNek
NEW 27.01.24 12:19 
в ответ AlexNek 27.01.24 12:18, Последний раз изменено 27.01.24 17:26 (AlexNek)

для добавлений....

#2 
alex445 коренной житель27.01.24 13:26
NEW 27.01.24 13:26 
в ответ AlexNek 27.01.24 12:18
Вот как сделать этот список удаленных блоков лучшим образом? Он же тоже место будет занимать.

И что?

Раз вы решили управление файлами вынести на более высокий уровень прикладного кода, то и создавайте на этом уровне что-то вроде файловой таблицы. Только вместо файлов в ней будут ваши блоки.


А почему, собственно, пишете в один файл, вместо того, чтобы по файлу на блок?

#3 
AlexNek патриот27.01.24 13:36
AlexNek
NEW 27.01.24 13:36 
в ответ alex445 27.01.24 13:26
решили управление файлами вынести на более высокий уровень

Это не управление файлами - это скорее dynamic storage


А почему, собственно, пишете в один файл, вместо того, чтобы по файлу на блок?

Миллионы файлов в каталоге?

#4 
Murr патриот27.01.24 13:41
Murr
NEW 27.01.24 13:41 
в ответ AlexNek 27.01.24 12:18

Стандартно - блоки помечаются - удаленные. Никуда не перемещаются.

После изменения статуса - перестраиваются индексы.

Когда наступает "Ой, звиздец" - проводится ужимание с физическим удалением.


Основной вопрос - нахрен? - блобы вполне подходят.

#5 
Murr патриот27.01.24 13:44
Murr
NEW 27.01.24 13:44 
в ответ AlexNek 27.01.24 13:36

Миллионы файлов в каталоге?

-----

Для компа - почти пофиг. Просто не лезь туда гуем...

#6 
wasja-de знакомое лицо27.01.24 13:53
NEW 27.01.24 13:53 
в ответ AlexNek 27.01.24 12:18

это классическая задача аллокаторов памяти. В каждый блок в начале записываете структурку, которая связана соседями линейным двухсвязанным списком (чтобы детектировать, что соседний блок удалили и надо объединить свободное пространство), а в каждый удаленный - дополнительно пишем структуру динамически балансируемого дерева, в котором все отсортировано по размеру этого свободного пространства.


При запросе на новый блок в за логарифмическое время находите первый блок по размеру, который удовлетворяет (или если нет, то пишем в конец).

При удалении пользуемся линейным списком чтобы понять соседа и, если сосед пустой, объединяем (еще два реквеста в бинарное дерево).


Если программа имеет информация о блоках и при удалении может сказать еще размер блока, то двухсвязанный список можно не хранить, чтобы память сэкономить, но тогда надо иметь еще одно бинарное дерево, в котором сортировка уже идет по местоположению в памяти.


Так устроенный аллокатор памяти реально ускоряет алгоритмы, в которых часто надо аллоцировать-деаллоцировать, и последний раз я проверял в линуксе и винде несколько лет назад, ускорение было разы по сравнению со штатными системными средствами.

#7 
AlexNek патриот27.01.24 13:56
AlexNek
NEW 27.01.24 13:56 
в ответ Murr 27.01.24 13:41
Стандартно - блоки помечаются - удаленные.

Ну пометил, а как искать? не лазить же по всему файлу.


проводится ужимание

каким образом? Позицию "занятых" блоков менять нельзя, разве что системные блоки, которые еще можно контролировать как то.


блобы вполне подходят

В базе? нет, никакой прослойки, быстродействие резко упадет думаю.

Вот как раз проблема перед глазами. Была отличная прога каталогизатор файлов с бинарным сохранением данных.

Сделали новую и решили пользовать SQLite. Пользоваться прогой невозможно стало и медленней и размеры сохранённых данных увеличились

#8 
AlexNek патриот27.01.24 13:57
AlexNek
NEW 27.01.24 13:57 
в ответ Murr 27.01.24 13:44
Просто не лезь туда гуем...

А быстродействие, а перенос?

#9 
AlexNek патриот27.01.24 14:00
AlexNek
NEW 27.01.24 14:00 
в ответ wasja-de 27.01.24 13:53
а в каждый удаленный - дополнительно пишем структуру динамически балансируемого дерева,

Ну так как проблема как раз в этом дереве. На каждый удаленный блок пишется дополнительная структура. Блок взяли а что делать со структурой?

#10 
alex445 коренной житель27.01.24 14:05
NEW 27.01.24 14:05 
в ответ Murr 27.01.24 13:44

Миллионы файлов в каталоге?

-----

Для компа - почти пофиг. Просто не лезь туда гуем...

А если ещё и отдельное место на диске с запасом выделить под это дело, чтобы фрагментация не влияла... А ещё и нормальные SSD использовать с хорошими буферами...

#11 
Murr патриот27.01.24 14:35
Murr
NEW 27.01.24 14:35 
в ответ AlexNek 27.01.24 13:56

а как искать?

-------

по индексу перестроенному после изменения


менять нельзя

------

Можно. Разумеется с коррекцией ссылок.


Можно подумать над чем-то похожим на FAT (FAT16,FAT32,FAT64)


быстродействие резко упадет думаю

-----

Не-а...

Пока ты добъешься такого же - последняя весна закончится



невозможно стало

-----

Кури доку на sqlite.Я об нем ничего не знаю

Что Я знаю на 100% - нормальный сервер БД с большим объемом данных работает быстрее самописок.

С единственным исключением - когда данные статичны и денормализованны - самописка будет быстрее. Но! Статичных данных у нас не бывает.

#12 
Murr патриот27.01.24 14:39
Murr
NEW 27.01.24 14:39 
в ответ AlexNek 27.01.24 13:57

А быстродействие, а перенос?

------

нормально - просто работаешь на чуть более низком уровне

Про - понос - не понял.

#13 
Murr патриот27.01.24 14:41
Murr
NEW 27.01.24 14:41 
в ответ AlexNek 27.01.24 14:00

Блок взяли а что делать со структурой?

-------

Читай доки на FAT.

#14 
Murr патриот27.01.24 14:44
Murr
NEW 27.01.24 14:44 
в ответ alex445 27.01.24 14:05

с хорошими буферами...

-------

просто не пользуй то что берет с диска ненужное.

#15 
AlexNek патриот27.01.24 14:49
AlexNek
NEW 27.01.24 14:49 
в ответ Murr 27.01.24 14:35
а как искать? ------- по индексу перестроенному после изменения

Так как раз в дополнительных данных и проблема, как их сделать динамическими?


Можно. Разумеется с коррекцией ссылок.

Ссылки менять не могу - это прерогатива пользователя.


Не-а...Пока ты добъешься такого же - последняя весна закончится

очень сомневаюсь


нормальный сервер БД с большим объемом данных работает быстрее самописок

многое зависит от данных и их организации

#16 
AlexNek патриот27.01.24 14:52
AlexNek
NEW 27.01.24 14:52 
в ответ Murr 27.01.24 14:39
нормально - просто работаешь на чуть более низком уровне

найти файл, открыть файл, прочитать данные - быстрее чем просто прочитать данные? шок


Есть вот у меня миллионы файлов в одном каталоге, нужно их же перенести на другой комп/ в другой каталог.

#17 
wasja-de знакомое лицо27.01.24 16:21
NEW 27.01.24 16:21 
в ответ AlexNek 27.01.24 14:00
Ну так как проблема как раз в этом дереве. На каждый удаленный блок пишется дополнительная структура. Блок взяли а что делать со структурой?


проблемы-то нет. Каждая структура (или класс, если на С++) листка этого бинарного дерева сидит в блоке со свободной памятью - вы же ее удалить не можете, так как после нее есть блок с занятой памятью. Очевидно, если блок был в конце файла, то лучше его просто удалить и из бинарного дерева и из файла. А вот головка, или корень этого бинарного дерева - это несколько десятков байт, и их можно в оперативке сохранить.


Самописный код бинарного дерева

380 725 7945 bintree.c
83 191 1942 bintree.h
463 916 9887 итого

меньше 500 строк сишника, в современном С++ есть соответствующий класс, и не надо велосипед выдумывать. Предполагаю, что в других языках и бинарное дерево, и двухсвязанные списки тоже в стандартных библиотеках имеются. Весь код такого аллокатора:

380 725 7945 bintree.c
83 191 1942 bintree.h
112 216 2158 decmem.c
463 969 11349 dmem.c
93 267 3159 dmem.h
336 592 5963 memc.c
62 170 1358 memc.h
292 1127 7883 memf.f
303 639 6732 quemem.c
2124 4896 48489 итого

у меня в свое время получился слегка больше двух тысяч строк и в 90-х я это примерно за месяц запрограммировал и радовался. Как я говорю, сейчас все это решается стандартными средствами С++, поэтому код дарить не буду, но рассказать-объяснить постараюсь. Если хотите, или так будет проще, могу войсом, тогда в личке телефонами обменяться надо будет.

#18 
AlexNek патриот27.01.24 17:25
AlexNek
NEW 27.01.24 17:25 
в ответ wasja-de 27.01.24 16:21
и их можно в оперативке сохранить.

В том и дело, что нельзя.


Открыл прогу, добавил данных, ушел.

Открыл прогу удалил данные, ушел.

Открыл прогу, добавил данных, ушел.


и в 90-х я это

Там именно я и об этом. В каком - то журнале было описание процесса сохранения данных, мне так понравилось, что в следующем проекте это и использовал. Было просто и удобно.

Сейчас что подобное хочется, но детали забылись.


поэтому код дарить не буду

Да код и не нужен, спасибо. Главное идея, а уж реализовать дело вторичное.

Относительно телефона нет проблем, но эта не та проблема, на которую нужно еще тратить ваше время. Это если вам, что понадобится просто с кем то обсудить, то всегда пож.


Ну и Си с плюсами я уже давно не пользую. Только С#.

#19 
Бесконечный цикл постоялец27.01.24 17:36
NEW 27.01.24 17:36 
в ответ AlexNek 27.01.24 12:18, Последний раз изменено 27.01.24 17:38 (Бесконечный цикл)

Стандартная и очень частая задача. Ну например ссылки в Яве, DNS (именя в IP адреса) и т.п.

Решается путем введения двух идентификаторв: физического представления блока (смещение) и его логического представления (ссылка на блок), а также отображения между ними. Используется только логические ссылки. Физическое представление только в реализации.

BlockRef // Логический идентификатор, напрмер, int

BlockOffset // Физическое расположение например смещение в файле

interface Storage
  BlockRef alloc(size int)
  delete(BlockRef)

  resize(new_size int)

  byte[] read(BlockRef)
  write(BlockRef, byte[])

class FileStorage implements Storage
  File file // Здесь все храним
  Map block_allocation<BlockRef, BlockOffset> // Фактически таблица размещения это главная структура (тоже интерфейс)

  gc() // Запускаем периодически для сборки мусора, уплотнения и пр. оптимизаций


Главное это как отображать логические ссылки в физическое расположение. В простейшем случае это map. Но в реальности думаю есть миллионы разных способов для разных применений. Как говорится "зависит от контекста". Ну например можно хранить во многих файлах или большие блоки отдельно от маленьких или реализовать очередь запросов в случае конкурентного доступа и т.п. Надо конечно заниматься подсчетом использования ссылок, но это все просто для простых применений, а для сложных можно постепенно улучшать, поскольку интерфейс определен.

#20 
wasja-de знакомое лицо27.01.24 18:04
NEW 27.01.24 18:04 
в ответ AlexNek 27.01.24 17:25
> и их можно в оперативке сохранить.

В том и дело, что нельзя.

можно, не значит нужно, если надо полностью иметь структуру на диске, то эта сотня байт спокойно помещаются в начало файла с данными, или в любой другой дополнительный файл.


Только С#.

не знаю его библиотеки и шарпом не пользуюсь, но предполагаю, что можно присовокупить соответствующий класс их С++ и средствами шарпа сохранить на диск туда, где ему нужно быть. Остальную логику я вроде рассказал. Если не понятно объяснил, не стесняйтесь, спрашивайте.


Это если вам, что понадобится просто с кем то обсудить, то всегда пож.

спасибо, не, у меня такой задачи сейчас нет, была когда в 90-х диссер писал, и с тех пор особо не менял там ничего, работает же, и есть доказательство оптимальности при определенных условиях.

#21 
Бесконечный цикл постоялец27.01.24 19:00
NEW 27.01.24 19:00 
в ответ AlexNek 27.01.24 12:18
С записью проблем проблем нет, пиши всегда в конец. Но блоки нужно удалять, либо вместо малого блока записать более большой, когда при обновлении блока данных стало больше.Удаленные блоки можно записывать в список удаленных, после оттуда выбирать подходящие. Из больших блоков можно делать маленькие, а два маленьких соседних блока объединять в большой.Вот как сделать этот список удаленных блоков лучшим образом? Он же тоже место будет занимать. Удалили 1000 блоков, а после использовали 900. Список остался, но уже не такой большой.

Ну добавлять всегда в конец это не очень хорошо. Вернее хорошо, если скорость добавления важнее других требований. А так в общем случае можно например завести таблицу выделенных блоков где одна запись описывает один блок. И таблицу свободного пространства (дырок), где одна запись это одна дырка, т.е. свободный блок. Они индексируются по длине, чтобы быстро находить блок или дырку нужного размера. При выделении нового блока находится подходящая дырка. При удалении блока надо либо новую дырку добавить либо расширить соседние дырки. Вопрос только как обновлять таблицу размещения и индекс.

#22 
Murr патриот27.01.24 20:23
Murr
NEW 27.01.24 20:23 
в ответ AlexNek 27.01.24 14:49

как их сделать динамическими?

------

Апдейтить после каждого изменения исходных данных.


это прерогатива пользователя.

-----

Ну так вообще никаких проблем - подтверждает актуализацию или ждет оной. Не твоя же забота.



зависит от данных и их организации

-----

Не понял.

ты хочешь сравнивать не эквивалентные схемы? Так это изначально бессмысленно.

#23 
Murr патриот27.01.24 20:30
Murr
NEW 27.01.24 20:30 
в ответ AlexNek 27.01.24 14:52

быстрее чем просто прочитать данные?

------

В некоторых случаях - да.

У тебя получается короткий "индекс" из имен файлов, вместо скана всего файла.


нужно их же перенести на другой комп/ в другой каталог.

-------

Зачем?

Написал батник и запустил без окна - все пройдет довольно быстро.

#24 
AlexNek патриот27.01.24 21:45
AlexNek
NEW 27.01.24 21:45 
в ответ wasja-de 27.01.24 18:04
то эта сотня байт

Каким образом? Вот минимальное Node всего на один удаленный блок


int Size

long FreeBlockRef

long LeftNode

long RightNode


и средствами шарпа сохранить на диск туда, где ему нужно быть

Да, всё тоже самое что и в С++

#25 
AlexNek патриот27.01.24 21:52
AlexNek
NEW 27.01.24 21:52 
в ответ Бесконечный цикл 27.01.24 19:00
И таблицу свободного пространства (дырок), где одна запись это одна дырка, т.е. свободный блок

Ну так это и есть проблема, как ее оптимально организовать.

#26 
AlexNek патриот27.01.24 21:57
AlexNek
NEW 27.01.24 21:57 
в ответ Murr 27.01.24 20:30
Написал батник и запустил без окно

Виндузятники так не делают бебе


#27 
AlexNek патриот27.01.24 22:01
AlexNek
NEW 27.01.24 22:01 
в ответ Murr 27.01.24 20:30
вместо скана всего файла

кто сказал такую глупость?

#28 
Бесконечный цикл постоялец27.01.24 22:16
NEW 27.01.24 22:16 
в ответ AlexNek 27.01.24 21:52, Последний раз изменено 27.01.24 22:19 (Бесконечный цикл)
Ну так это и есть проблема, как ее оптимально организовать.

Это именно решение:

1. список дырок в виде записей <смещение, размер>: <1000, 500>, <2000, 200>, <3000, 700>

2. индекс в виде сортировки по размеру: [1, 0, 2]


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


А проблемы здесь было 2:

- как избежать обновления ссылок на блоки при перемещении блоков -> Ответ: путем введения логических ссылок

- как управлять таблицей размещения -> Ответ: путем сортировки по размеру (и потом двоичного поиска)


Обе проблемы для технического интервью на мидла наверное.

#29 
Murr патриот27.01.24 23:00
Murr
NEW 27.01.24 23:00 
в ответ AlexNek 27.01.24 21:45

1. выкидываешь - size - всегда распределяешь стандартными блоками 512, 1024, 8096

2. выкидываешь - freeblockref - цепочка свободных блоков, если нужна, ведется отдельно

3. выкидываешь - leftnode - скан всегда рута

4. заменяешь - rightnode - на - nextblock - это где лежит продолжение, если не уместился


делаешь другую структуру (имя/ключ(8.3?), firstblock, size, removed)


работает так

- начальная разметка - пустой список ключей и зануленная таблица блоков

- добавил- сделал запись ключа, заполнил занятые блоки, последний пометил мах(н) FFF?

- удалил -- пометил ключ как удаленный

- очистка - зануляешь цепочку nextblock и удаляешь ключ


Таблицу структур имя/ключ пишешь в обычный блок и расширяешь по мере необходимости.

Таблицу nextblok'ов - размещаешь целиком на максимальный размер набора.

Это грубая эмуляция FAT. Код есть на сайтах эмбедеров.

#30 
AlexNek патриот27.01.24 23:01
AlexNek
NEW 27.01.24 23:01 
в ответ Бесконечный цикл 27.01.24 22:16
Так что не вижу где здесь еще что-то можно решать.

Попробую пояснить.

Есть какой-то список дырок, каждый элемент списка имеет свой размер.

Вначале список пустой, затем увеличивается, после может уменьшаться.

Вот процесс увеличения и уменьшения размера списка и интересует.

Даже скорее уменьшение размера списка дырок.


Ответ: путем введения логических ссылок

Еще один уровень для доступа и еще одна таблица перевода логических ссылок в физические?

#31 
Murr патриот27.01.24 23:02
Murr
NEW 27.01.24 23:02 
в ответ AlexNek 27.01.24 22:01

кто сказал такую глупость?

------------

таки - ты Индексы же строить отказываешься.

#32 
AlexNek патриот27.01.24 23:06
AlexNek
NEW 27.01.24 23:06 
в ответ Murr 27.01.24 23:00
Таблицу nextblok'ов - размещаешь целиком на максимальный размер набора.

А не знаю я максимального размера набора


выкидываешь - size - всегда распределяешь стандартными блоками 512, 1024, 8096

ну так всё равно нужно знать размер: 1,2,3.

#33 
AlexNek патриот27.01.24 23:07
AlexNek
NEW 27.01.24 23:07 
в ответ Murr 27.01.24 23:02
таки - ты Индексы же строить отказываешься.

воображение у вас батенька большое бебе

#34 
Murr патриот27.01.24 23:14
Murr
NEW 27.01.24 23:14 
в ответ AlexNek 27.01.24 23:01

Вначале список пустой, затем увеличивается, после может уменьшаться.

--------------

Либо резервируется изначально. Где много вставок - чем больше резервируется - тем лучше.

И зачем уменьшаться? Увеличение всегда дорого.


Если будет совсем плохо - см ISAM. Сишных реализаций не знаю.


#35 
Murr патриот27.01.24 23:16
Murr
NEW 27.01.24 23:16 
в ответ AlexNek 27.01.24 23:06

А не знаю я максимального размера набора

------

Размер диска или квота.

#36 
Murr патриот27.01.24 23:19
Murr
NEW 27.01.24 23:19 
в ответ AlexNek 27.01.24 23:06

ну так всё равно нужно знать размер

------

Ну так он всегда один - какой выберешь - такой и будет.

#37 
AlexNek патриот27.01.24 23:28
AlexNek
NEW 27.01.24 23:28 
в ответ Murr 27.01.24 23:14
Либо резервируется изначально.

Ну вот создал я файл, сколько резервировать?


И зачем уменьшаться

Допустим у меня в папочке 10 тыс. файлой, тогда в моем списке будет 10000+1 записи (папочка+файлы)

удаляю я всю папочку, получаю 10т.+1 описаний дырок. Сканирую следующую папочку с 9т. файлов, остается всего 1т. дырок.

Значит теперь структура описания удаленных файлов содержит 9т ненужных записей.

Всё оставлять?

#38 
AlexNek патриот27.01.24 23:29
AlexNek
NEW 27.01.24 23:29 
в ответ Murr 27.01.24 23:19
Ну так он всегда один - какой выберешь - такой и будет

Один размер для 4 байт и 1000?

#39 
AlexNek патриот27.01.24 23:36
AlexNek
NEW 27.01.24 23:36 
в ответ Murr 27.01.24 14:41, Последний раз изменено 27.01.24 23:50 (AlexNek)
Читай доки на FAT.


https://droopy.narod.ru/FAT.htm


см. Потери на остатках кластеров.

#40 
Murr патриот27.01.24 23:38
Murr
NEW 27.01.24 23:38 
в ответ AlexNek 27.01.24 23:28

Ну вот создал я файл, сколько резервировать?

------

размер диска/квоты делишь на размер выбранного блока => получаешь возможное количество блоков

смотришь сколько байт нужно чтобы поместился номер последнего блока

резервируешь: количество блоков * количество байт для номера


И, кстати, будет не вредно сразу прописать весь файлик мусором - чтоб место физически выделилось.

#41 
Murr патриот27.01.24 23:41
Murr
NEW 27.01.24 23:41 
в ответ AlexNek 27.01.24 23:29

Один размер для 4 байт и 1000?

------

именно так.

для 4 байт один блок

для 1000 - 1 или 2 или 4 - по размеру блока

#42 
Murr патриот27.01.24 23:46
Murr
NEW 27.01.24 23:46 
в ответ AlexNek 27.01.24 23:36

Читай доки на FAT.

----------

Мне то зачем? Я и так знаю.


При побайтвом мапинге будет другая проблема - фрагментированность - единственный записанный байт залочит всю систему.

#43 
uscheswoi_82 коренной житель27.01.24 23:47
NEW 27.01.24 23:47 
в ответ AlexNek 27.01.24 12:18

1. Все полезные алгоритмы нужно хранить на флешки/CD/внешнем диске.

2. Даже Microsoft не смогла сделать толком нормальную утилиту по дефрагментации диска, она купила её помойму у Symantec. Когда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными. Дефрагментация это долгий процесс.

3. В файловой системе блоки (сектора) фиксировоной длины, помойму 1 блок (сектор) = 512 байт.

4. Не понял задачу, но как-то так:

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
// Копирует блок в общую память
void copy_block(char *buf, char *data, int pos) {
    memcpy(buf+pos, data, strlen(data));
}
// Удаляет блок из общей памяти
void delete_block(char *buf, int pos, int len) {
    memset(buf+pos, '\0', len);
}
int main(int argc, char** argv) {
    char *buf; // Общая память
    char block1[] = "Hello "; // блок содержащий слово Hello
    char block2[] = "Igor"; // блок содержащий слово Igor
    char block3[] = "Ann";// блок содержащий слово Ann
    buf = (char *)malloc(65535); // Резервируем память 65К
    memset(buf, '\0', 65535); // Инициализируем память
    copy_block(buf, block1, 0); // Копируем в 0 ячейку памяти Hello
    copy_block(buf, block2, strlen(block1)); // Копируем в 5 ячейку памяти Igor
    cout << buf << endl; // Выводим на экран Hello Igor
    delete_block(buf, strlen(block1), strlen(block2)); // Удаляем в 5 ячейки памяти 3 байта
    cout << buf << endl; // Выводим на экран Hello
    copy_block(buf, block3, strlen(block1));// Копируем в 5 ячейку памяти Ann
    cout << buf << endl; // Выводим на экран Hello Ann
    free(buf); // Освобождаем зарервированную память
    return 0;
}


А с блоками можно сделать примерно так:

    struct BLOCK_1 {
        long next_offset;
        char buf[5];
    };

    struct BLOCK_2 {
        long next_offset;
        char buf[10];
    };

    struct BLOCK_3 {
        long next_offset;
        char buf[15];
    };
        
    BLOCK_1 block_1;
    BLOCK_2 block_2;
    BLOCK_3 block_3;
    
    block_1.next_offset = 5;
    strcpy(block_1.buf, "Igor");
    block_2.next_offset = 5 + 10;
    strcpy(block_2.buf, "Ann");
    block_3.next_offset = 5 + 10 + 15;
    strcpy(block_3.buf, "Mustermann");

P.S.:Извиняюсь если ответил не так, что-то последние три дня плохо соображаю, две ночи плохо спал.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение Моя ФЛ Он и Она
#44 
AlexNek патриот27.01.24 23:51
AlexNek
NEW 27.01.24 23:51 
в ответ Murr 27.01.24 23:41
Один размер для 4 байт и 1000?------именно так.
Спасибо но не надо, решение было очень красивым, поэтому и понравилось
#45 
AlexNek патриот27.01.24 23:52
AlexNek
NEW 27.01.24 23:52 
в ответ Murr 27.01.24 23:46
Мне то зачем? Я и так знаю.

Исправил, это была "ссылка" на твой запрос

#46 
AlexNek патриот27.01.24 23:58
AlexNek
NEW 27.01.24 23:58 
в ответ uscheswoi_82 27.01.24 23:47
buf = (char *)malloc(65535); // Резервируем память 65К

Это сразу не годится


Структура записи должна быть типа такой, хотя ссылка на следующий блок совершенно не нужна

struct BLOCK {
        long next_offset;
        char buf[];
    };
#47 
AlexNek патриот28.01.24 00:00
AlexNek
NEW 28.01.24 00:00 
в ответ uscheswoi_82 27.01.24 23:47, Последний раз изменено 28.01.24 18:05 (AlexNek)
Все полезные алгоритмы нужно хранить на флешки/CD/внешнем диске.

в то время прога была еще на дискетах и никто не думал, что на них есть что то полезное. Тем более что читать их было уже нечем.

#48 
Murr патриот28.01.24 00:01
Murr
NEW 28.01.24 00:01 
в ответ AlexNek 27.01.24 23:28

получаю 10т.+1 описаний дырок.

------

Просто затираешь в таблице блоков освободившиеся блоки.

В том числе и блоки под папкой.

Единственный неудаляемый блок - корневой

#49 
Murr патриот28.01.24 00:06
Murr
NEW 28.01.24 00:06 
в ответ AlexNek 27.01.24 23:51
решение было очень красивым

-----------------

Значит вопрос фрагментации не решался.

#50 
alex445 коренной житель28.01.24 01:48
NEW 28.01.24 01:48 
в ответ uscheswoi_82 27.01.24 23:47, Последний раз изменено 28.01.24 01:52 (alex445)
Когда удаляются файлы, там помечается каким-то флагом что файл удалён, и при этом остаются дырки, а при дефрагметации диска пустые места (дырки) заполняются данными.

А зачем физически удалять данные, если достаточно пометить их как свободные для перезаписи?

Дефрагментация это долгий процесс.

Вместо вредной и медленной дефрагментации лучше скопировать всё на другой пустой диск, а потом на первом всё удалить. Теперь можно при необходимости повторить процесс, но в обратном направлении.


Чтобы фрагментация меньше доставляла проблем, нужно придерживаться примерно такого же правила, как для RAM - память должна использовать не более, чем на 2/3 от доступной. В идеале не более, чем на половину. Если используется больше, нужно докупить памяти. Оперативка, кстати, тоже страдает от фрагментации, хотя и в меньшей степени из-за своей скорости. Но ещё она страдает вдобавок и от свопа.

#51 
AlexNek патриот28.01.24 12:05
AlexNek
NEW 28.01.24 12:05 
в ответ Murr 28.01.24 00:01, Последний раз изменено 28.01.24 12:05 (AlexNek)
Просто затираешь в таблице блоков освободившиеся блоки.

А как это повлияет на размер файла? Или как я туда смогу что то записать из данных?

#52 
AlexNek патриот28.01.24 12:12
AlexNek
NEW 28.01.24 12:12 
в ответ Murr 28.01.24 00:06
Значит вопрос фрагментации не решался.

Всё отлично решалось. И блоки были, только не фиксированной длины, а просто кратные степени 2ки.

Но пока ничего не навеяло на путь решения. Уже на этапе удаления блока, два соседних удалённых блока объединялись и в таблицу удаленных записывался только этот объединённый блок.

#53 
Murr патриот28.01.24 17:10
Murr
NEW 28.01.24 17:10 
в ответ AlexNek 28.01.24 12:05

А как это повлияет на размер файла?

-------

А должно?


Или как я туда смогу что то записать из данных?

------

Находишь в таблице блоков пустой (000) блок и пишешь туда. Что не вошло - пишешь в следующий пустой.

Там навигация по блокам совершено элементарная - по положению описателя блока сразу получаешь смещение в файле, а описатель содержит номер следующего используемого блока.

#54 
Murr патриот28.01.24 17:18
Murr
NEW 28.01.24 17:18 
в ответ AlexNek 28.01.24 12:12

не фиксированной длины, а просто кратные степени 2ки.

------

голову примени - либо фрагментация, либо фиксированный размер блока. Другого просто нет. Даже не комбинируется.

У винды, кстати, память управляется блоками фиксированной длины и под это дело уходит хренова куча памяти.

#55 
Murr патриот28.01.24 17:27
Murr
NEW 28.01.24 17:27 
в ответ AlexNek 28.01.24 12:12

два соседних удалённых блока объединялись

-----

У тебя квота Х.

Ты пишешь последовательно (Х/2-2), (4). (Х/2-2) - полный.

Освобождаешь оба (Х/2-2).

Теперь тебе надо писать ровно (Х/2) - все, приплыли.

Если не приплыли, то как-то без блоков переменой длины.

#56 
AlexNek патриот28.01.24 18:09
AlexNek
NEW 28.01.24 18:09 
в ответ Murr 28.01.24 17:10
А как это повлияет на размер файла?-------А должно?

конечно, зачем мне лишний мусор в файле


Находишь в таблице блоков пустой

Речь как то и идет о таблице пустых блоков мне нужно утилизовать записи которые уже не используются.


Что не вошло - пишешь в следующий пустой

Концепт другой, блок заполняется полностью.

#57 
AlexNek патриот28.01.24 18:12
AlexNek
NEW 28.01.24 18:12 
в ответ Murr 28.01.24 17:18
либо фрагментация, либо фиксированный размер блока. Другого просто нет

Ага, конечно нет. Когда сам же и делал. И речь о 100% дефрагментации не идёт.

#58 
AlexNek патриот28.01.24 18:15
AlexNek
NEW 28.01.24 18:15 
в ответ Murr 28.01.24 17:27
Теперь тебе надо писать ровно (Х/2) - все, приплыли.

Мысля у вас какая то странная.

вот один свободный блок на 16 байт, вот рядышком еще один на 16. Объединяем и получаем блок на 32 байта.

Где проблема, то?

#59 
Murr патриот28.01.24 19:13
Murr
NEW 28.01.24 19:13 
в ответ AlexNek 28.01.24 18:09

зачем мне лишний мусор в файле

------

Чтобы повех него писать новую инфу.

Или т при удалении файла прописываешь занимаемое им место поперемено 0/1?


о таблице пустых блоков

------

А нету такой. За ненадобностью.


мне нужно утилизовать записи

-----

Ну так объявляешь блоки свободными и все.


Концепт другой,

------

Выше написано во что упрешься.

#60 
Murr патриот28.01.24 19:16
Murr
NEW 28.01.24 19:16 
в ответ AlexNek 28.01.24 18:15

Где проблема, то?

-----

Выше очень подробно писано. Там где об (Х/2-2)

#61 
AlexNek патриот28.01.24 20:21
AlexNek
NEW 28.01.24 20:21 
в ответ Murr 28.01.24 19:13, Последний раз изменено 28.01.24 21:51 (AlexNek)
Чтобы поверх него писать новую инфу.

ну так и я о том же.


о таблице пустых блоков
------А нету такой. За ненадобностью.

И как же ты будешь дырки отслеживать?


Ну так объявляешь блоки свободными и все.

Для этого удаленные блоки данных и записываются в таблицу свободных блоков.


Выше написано во что упрешься.

расскажи лучше IBM, что процессор может быть только одноядерным

#62 
AlexNek патриот28.01.24 20:23
AlexNek
NEW 28.01.24 20:23 
в ответ Murr 28.01.24 19:16
Выше очень подробно писано. Там где об (Х/2-2)

Вижу только какую-то билиберду смущ

Что за (Х/2-2)? х=10, 5-2=3 - не может быть блок равен 3

#63 
AlexNek патриот28.01.24 21:23
AlexNek
NEW 28.01.24 21:23 
в ответ AlexNek 27.01.24 12:18

Можно начать с более простой проблемы.


Если размер выделяемых блоков кратен степени 2, то как быстрее всего найти два удалённых смежных блока?

Если все удаленные блоки хранятся в каком то списке.

#64 
Murr патриот28.01.24 21:48
Murr
NEW 28.01.24 21:48 
в ответ AlexNek 28.01.24 20:21

И как же ты будет дырки отслеживать?

-------

Может все же доки на FAT почитаешь?

#65 
AlexNek патриот28.01.24 21:52
AlexNek
NEW 28.01.24 21:52 
в ответ Murr 28.01.24 21:48
Может все же доки на FAT почитаешь?

Так ссылку уже давал раньше - не годится эта фигня, там размер блока фиксированный

#66 
Murr патриот28.01.24 21:55
Murr
NEW 28.01.24 21:55 
в ответ AlexNek 28.01.24 20:21

в таблицу свободных блоков.

------=

В таблицу блоков пишется:

000 - блок свободен для записи

FFF - блок последний в цепочке использованных блоков (первый - указан рядом с именем/ключем)

любое другое - номер следующего использованного этой записью блока

#67 
Murr патриот28.01.24 21:57
Murr
NEW 28.01.24 21:57 
в ответ AlexNek 28.01.24 20:23

не может быть блок равен 3

---------

Всего лишь Х у тебя неправильный....

#68 
AlexNek патриот28.01.24 22:05
AlexNek
NEW 28.01.24 22:05 
в ответ Murr 28.01.24 21:55
В таблицу блоков пишется:

так разве в этом проблема? Проблема в организации этой самой таблицы.


любое другое - номер следующего использованного этой записью блока

так это уже будет таблица использованных блоков, которая как раз и не требуется

#69 
AlexNek патриот28.01.24 22:05
AlexNek
NEW 28.01.24 22:05 
в ответ Murr 28.01.24 21:57
Всего лишь Х у тебя неправильный....

ну напиши правильный...

#70 
Murr патриот28.01.24 22:06
Murr
NEW 28.01.24 22:06 
в ответ AlexNek 28.01.24 21:23

как быстрее всего найти два удалённых смежных блока?

-------

Никак.

Потому как

- если блоки фиксированной длинны, то без разницы смежные они или нет

- если блоки переменной длины - в момент освобождения должны склеиваться

#71 
AlexNek патриот28.01.24 22:12
AlexNek
NEW 28.01.24 22:12 
в ответ Murr 28.01.24 22:06
если блоки переменной длины - в момент освобождения должны склеиваться

Вот бери клей бебе

0..15

120..127

#72 
Murr патриот28.01.24 22:16
Murr
NEW 28.01.24 22:16 
в ответ AlexNek 28.01.24 22:05

так это уже будет таблица использованных блоков

----------------

Это таки таблица где свободные блоки помечены 000 и порядковый номер(индекс в массиве) однозначно определяет смещение от общей выбранной точки до начала блока.

Если у тебя жопа с размерами данных - можешь сделать несколько групп блоков с разными размерами блоков и писать куда подходит.

#73 
Murr патриот28.01.24 22:19
Murr
NEW 28.01.24 22:19 
в ответ AlexNek 28.01.24 22:12

Вот бери клей

--------

А откуда взято что они смежные?

Ну да пустяки - китайца с ножницами и клеем - посадишь - будет клеить...

#74 
AlexNek патриот28.01.24 22:23
AlexNek
NEW 28.01.24 22:23 
в ответ Murr 28.01.24 22:19
А откуда взято что они смежные?

Из твоего определения - "если блоки переменной длины - в момент освобождения должны склеиваться"

#75 
AlexNek патриот28.01.24 22:26
AlexNek
NEW 28.01.24 22:26 
в ответ Murr 28.01.24 22:16
Это таки таблица где свободные блоки помечены 000

И нафига мне такая громадная таблица для всех используемых блоков?

#76 
Murr патриот29.01.24 00:13
Murr
NEW 29.01.24 00:13 
в ответ AlexNek 28.01.24 22:23

Из твоего определения -

-----------

В моем определении сказано - если - смежные - там где кончается один - начинается другой.

Как по твоим цифрькам определить смежность? А то у меня одна из возможностей определить смежность как нахождение на следующей плоскости того же цилиндра да еще с фиксированным сдвигом.


#77 
Murr патриот29.01.24 00:15
Murr
NEW 29.01.24 00:15 
в ответ AlexNek 28.01.24 22:26

А две твои таблицы - по свободным и по занятым - при том же объеме будут меньше?

#78 
AlexNek патриот29.01.24 18:02
AlexNek
NEW 29.01.24 18:02 
в ответ Murr 29.01.24 00:13
В моем определении сказано - если - смежные - там где кончается один - начинается другой.

А ты случаем не забыл это определение написать?


А то у меня одна из возможностей определить смежность как нахождение на следующей плоскости того же цилиндра да еще с фиксированным сдвигом.

Ну да, если пустую бутылку от столичной обвернуть hex дампом файла, то возможно что то похожее и получится.бебе


#79 
AlexNek патриот29.01.24 18:03
AlexNek
NEW 29.01.24 18:03 
в ответ Murr 29.01.24 00:15
А две твои таблицы - по свободным и по занятым

Откуда взялось две таблицы? Нужно только одна со свободными блоками.

#80 
Murr патриот29.01.24 18:58
Murr
NEW 29.01.24 18:58 
в ответ AlexNek 29.01.24 18:02

если пустую бутылку

------

А если полную?

Цилиндром со времен ЕС ЭВМ называлось все находящееся по головками в текущем положении.

Ну да, чистые софтовики этого не знают - все столичной меряют... а по гермашке - ужО выпитой...

#81 
AlexNek патриот29.01.24 19:27
AlexNek
NEW 29.01.24 19:27 
в ответ Murr 29.01.24 18:58
Цилиндром со времен ЕС ЭВМ называлось все находящееся по головками в текущем положении.

Ну так тонко и намекаю, что до такого определения цилиндра можно дойти только по ужО выпитой смущ и не раз.


Но похоже все идеи по делу уже закончились. Ну ладно, будет пока неоптимальное решение.

#82 
Murr патриот29.01.24 19:31
Murr
NEW 29.01.24 19:31 
в ответ AlexNek 29.01.24 18:03

Нужно только одна со свободными блоками.

-------

как обычно - либо полная информация и нормальные решения.

либо частичная и решение частное (а-ля как нибудь)

#83 
Murr патриот29.01.24 19:35
Murr
NEW 29.01.24 19:35 
в ответ AlexNek 29.01.24 19:27

Но похоже все идеи по делу уже закончились.

----------

задачу полностью определи - может что-то добавится.

#84 
AlexNek патриот29.01.24 19:50
AlexNek
NEW 29.01.24 19:50 
в ответ Murr 29.01.24 19:31
либо полная информация и нормальные решения.

У меня такое чувство что ты забрался в раковину и никак не хочешь оттуда вылезти смущ

Только какие то постулаты. Либо только фиксированные блоки либо только таблица обо всех блоках.


Ну вот пишу я миллион записей и ничего не удаляю, на кой мне информация о занятых блоках?

Тем более, что решение было и достаточно простое, раз не запомнилось. Но всё вертелось вокруг того, что размер блоков был кратен степени двойки.

#85 
AlexNek патриот29.01.24 20:07
AlexNek
NEW 29.01.24 20:07 
в ответ Murr 29.01.24 19:35
задачу полностью определи

да не знаю что еще добавить, вроде уже всё написано.

Ну вот маленькая часть:

Есть список блоков в файле длина которых кратна степени двойки, соответственно есть начало блока Х и его длина L.

Появляется некий новый блок из того же файла с началом блока Х1 и длиной L1.

Если Х1+L1 = Х или Х+L = Х1, то блоки смежные и их можно объединить.


Ограничения: список блоков находится на диске (в памяти может не поместится), список блоков отсортирован по длине блоков.


Хочется иметь красивый алгоритм поиска смежных блоков. Что помню - это был побочный эффект организации списка блоков.

#86 
Murr патриот29.01.24 22:09
Murr
NEW 29.01.24 22:09 
в ответ AlexNek 29.01.24 20:07

вроде уже всё написано

-------

Рамазано по постам, что-то учитывается, что опущено.

надо собрать в кучку

Надо обосновать отказ от предложенных вариантов.


Появляется некий новый блок из того же файла

-=-----

Ээээ... что значит - появляется? Его выбрали произвольно, с перекрытием других блоков? Его дописали? Начало? средина? Конец? Перехлест имевшихся блоков?

То, что Ты сам,Я или кто-то еще имеет какое-то свое понимание - не важно - опиши детали.


Х1+L1 = Х или Х+L = Х1

-------

Ну так у тебя написно - проверить текущий (Х1) на "смежность" с предыдущим и следующим.


список блоков отсортирован по длине блоков.

-------

Ну и как ты собираешься искать предыдущий и следующий?

Либо сортировка по Х, либо пороход по списку с выбором пары

#87 
Murr патриот29.01.24 22:21
Murr
NEW 29.01.24 22:21 
в ответ AlexNek 29.01.24 20:07

побочный эффект организации списка

------

Списка или массива представления списка?

В первом случае у тебя только гарантия сортировки по длине, без информации об положении элементов списка.

Во втором у тебя список остается как был, но элементы можно физически упорядочить по возрастанию Х.

#88 
AlexNek патриот29.01.24 22:55
AlexNek
NEW 29.01.24 22:55 
в ответ Murr 29.01.24 22:09, Последний раз изменено 29.01.24 23:00 (AlexNek)
Его выбрали произвольно, с перекрытием других блоков? Его дописали? Начало? средина? Конец? Перехлест имевшихся блоков?

Перехлёст и перекрытие блоков абсолютно невозможно. В блоках же какая то инфа записана.

Да и вообще какая разница откуда он появляется? Если так интересно - его удалили.


не важно - опиши детали.

появляется проблема - нужно ли описывать, что земля не стоит на трёх китах?


Ну так у тебя написано

сам же просишь опиши детали, вот это и важные детали, а то опять цилиндр приплетёшь.


Ну и как ты собираешься искать предыдущий и следующий?

ну это и есть задачка....


Либо А, либо Б

Так не бывает, вполне может быть и С. Так это это чисто твое персональное мнение.

Например, считаем минимальный размер блока 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 байт

#89 
AlexNek патриот29.01.24 22:59
AlexNek
NEW 29.01.24 22:59 
в ответ Murr 29.01.24 22:21
физически упорядочить по возрастанию Х.

Всё информация записана в файле, создать что то разумное еще можно, но вторичная сортировка никак невозможна.

#90 
Murr патриот29.01.24 23:33
Murr
NEW 29.01.24 23:33 
в ответ AlexNek 29.01.24 22:55

это и есть задачка

------

Не-е, это не задачка - у тебя просто нет этой информации


минимальный размер блока 16 байт

-------

256 - не хочешь из-за большой таблицы.


Здесь 3 блока длиной ... добавляем теперь блок в 32 байта, по адресу 48

------

У тебя выше блок определен как 16 байт.

32 байта блоке быть не может - используй другой термин. Пусть будет - сегмент - добавил сегмент из двух блоков.


Что у тебя должно получится в списке? Таблицу ( не список ) занятых/свободных блоков Я вижу.

Остаются три 4 ранее определенных сегмента?

Или их надо конвертирвать в два? В смысле - три - слипаются?

Сегмент удаляется целиком или произвольными блоками?

#91 
Murr патриот29.01.24 23:46
Murr
NEW 29.01.24 23:46 
в ответ AlexNek 29.01.24 22:59

вторичная сортировка никак невозможна

-------

Тогда что ты понимаешь под тем что список отсортирован?

Физически упорядоченные узлы (нах тогда список?) или логически упорядоченные ( т.е. 9 ссылается на 5 потому что 5 - описывает следующий по размеру сегмент)

Это Я к тому, что логические связки могут быть по размеру, а физический порядок - по номерам начального блока. Изменение одного не меняет второго.

#92 
Murr патриот29.01.24 23:53
Murr
NEW 29.01.24 23:53 
в ответ AlexNek 29.01.24 22:55

В блоках же какая то инфа записана.

------

Ну мне же это не мешает что-то прописать поверх... Потому и уточняю поведение системы.

#93 
AlexNek патриот30.01.24 18:00
AlexNek
NEW 30.01.24 18:00 
в ответ Murr 29.01.24 23:33
У тебя выше блок определен как 16 байт.

определен только минимальный размер блока


В смысле - три - слипаются?

А что это не естественно? Три смежных свободных сегмента можно смело пустить в дело как один.


Сегмент удаляется целиком или произвольными блоками?

Сегмент или нужен или не нужен. Но у меня есть только блоки переменной длины.

#94 
AlexNek патриот30.01.24 18:09
AlexNek
NEW 30.01.24 18:09 
в ответ Murr 29.01.24 23:46
Тогда что ты понимаешь под тем что список отсортирован? (по размеру блока)

Я могу достаточно быстро найти блок зная его размер.

Любой другой поиск не предусмотрен либо может организовываться простым перебором всех элементов.


Это Я к тому, что логические связки могут быть по размеру, а физический порядок - по номерам начального блока

Ну это уже два типа сортировки одних и тех же элементов. Которая осуществляется по мере расширения списка, а не некими дополнительными проходами.

#95 
Murr патриот31.01.24 00:57
Murr
NEW 31.01.24 00:57 
в ответ AlexNek 30.01.24 18:00

определен только минимальный размер блока

-------

Ну следующий будет 18 байт....


А что это не естественно?

--------

нет.


Три смежных свободных сегмента можно смело пустить в дело как один.

------

Вот тут ты сам себе противоречишь - либо они слипаются, либо остаются отдельными.

Ты говоришь - слипаются, но в то же время у тебя как то имеются смежные не слипшиеся.

Доопределяй.


Но у меня есть только блоки переменной длины.

-------

Т.е. имется 16 байт переменной длины.

#96 
Murr патриот31.01.24 01:07
Murr
NEW 31.01.24 01:07 
в ответ AlexNek 30.01.24 18:09

может организовываться простым перебором всех элементов.

----------

Ну это Я тебе давно сказал - либо организация, либо перебор.


Ну это уже два типа сортировки одних и тех же элементов.

-------

Аааа... ты необходимости пересортировки боишься.

Зря. Тебе предлагается один список удовлетворяющий обоим критериям одновременно.

#97 
AlexNek патриот31.01.24 17:22
AlexNek
NEW 31.01.24 17:22 
в ответ Murr 31.01.24 00:57
Ну следующий будет 18 байт....

не может быть в принципе, следующий 32.


Вот тут ты сам себе противоречишь - либо они слипаются, либо остаются отдельными.

Не вижу никакого противоречия. Есть либо занятые блоки, либо свободные.

У занятых блоков нет операции слияния. Только свободные имеют такое право.


Т.е. имется 16 байт переменной длины.

блоки могут быть переменной длины, 16 байт - абсолютно минимальный размер блока.

#98 
AlexNek патриот31.01.24 17:26
AlexNek
NEW 31.01.24 17:26 
в ответ Murr 31.01.24 01:07
ты необходимости пересортировки боишься.

лишнее время, элемент должен вставляется в список сразу на правильную позицию.


Тебе предлагается один список удовлетворяющий обоим критериям одновременно.

где?

#99 
Murr патриот01.02.24 00:48
Murr
NEW 01.02.24 00:48 
в ответ AlexNek 31.01.24 17:22

У занятых блоков нет операции слияния.

--------

добавляем теперь блок в 32 байта, по адресу 48

001111110011000

сразу видно, что с адреса 32 появился большой блок в 6*16=96 байт

Что-то меня слегка глючит...


Murr патриот01.02.24 00:51
Murr
NEW 01.02.24 00:51 
в ответ AlexNek 31.01.24 17:26

элемент должен вставляется в список сразу на правильную позицию.

-------

А что тебе мешет это делать?


где?

------------

#92

AlexNek патриот01.02.24 19:10
AlexNek
NEW 01.02.24 19:10 
в ответ Murr 01.02.24 00:48
Что-то меня слегка глючит...


видимо вторую строку не заметил, с начальными адресами. Самый обычный map

0  0  1  0  0  1  1   1   0    0   1
0,16,32,48,64,80,96,112,128, 144,160, 176 -> адрес
AlexNek патриот01.02.24 19:13
AlexNek
NEW 01.02.24 19:13 
в ответ Murr 01.02.24 00:51
#92

ссылка была бы лучше смущ

"Это Я к тому, что логические связки могут быть по размеру, а физический порядок - по номерам начального блока. "

И как ты собираешься это делать на диске?

Murr патриот01.02.24 22:58
Murr
NEW 01.02.24 22:58 
в ответ AlexNek 01.02.24 19:13

И как ты собираешься это делать на диске?

------

Какая разница где?

Ну будет вместо [] fseek()... проблем то...

AlexNek патриот02.02.24 00:00
AlexNek
NEW 02.02.24 00:00 
в ответ Murr 01.02.24 22:58
вместо [] fseek()

Это означает еще какая то структура дополнительно. И динамический массив не так просто сделать, опять упираемся в проблему как отдавать ненужные блоки.

1 2 3 4 5 6 все