LINUX.ORG.RU

Подскажите по алгоритму обработки массива с дырками.

 ,


0

2

Допустим, есть некий массив вида

{ data, data, NULL, data, data, NULL, data }

То есть это как бы обычный массив с данными, но в нём есть «дырки». Пытаюсь организовать доступ к этому массиву так, чтоб он был виден как массив без дырок

{ data, data, data, data, data }

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

{ 0, 1, 3, 4, 6 }

В сети ничего путного не моуй найти. Подскажите, как грамотно называются такие массивы? Также буду благодарен, если накидаете умных слов по теме для самообучения и литературу, где описываются методы работы с такими данными.

★★
Ответ на: комментарий от yars068

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

u5er ★★
() автор топика
Ответ на: комментарий от bugfixer

А как тогда всякие файловые менеджеры пишутся? Мониторят текущий каталог на предмет изменений, чтобы, например, при копировании/перемещении файлов «в главном окне, за диалогом копирования/перемещения», показывать изменения на панелях?

yars068 ★★★★
()
Ответ на: комментарий от u5er

А как тогда назвать структуру, которая наоборот - большинство элементов значимые, а небольшое количество «дефолтные»?

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

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Тогда подскажи алгоритм. Вот у меня есть список на экране. Каждый пункт меню нумеруется по порядку от 0 и до конца экрана. Там нет дырок. А во входных данных они есть. Если не промежуточный массив, то что?

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Если не промежуточный массив, то что?

Ну, что-то промежуточное будет точно. Вот только что именно не сильно от вас зависит - чего от вас ваш «любимый» UI framework / toolkit хочет, в том виде скармливать ему и придётся. Сколько тех элементов на экране одновременно помещается? Ну пусть 100. Такой вектор создать ничего не стОит.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

чего от вас ваш «любимый» UI framework / toolkit хочет

Мой любимый toolkit дёргает функцию обратного вызова и передаёт в неё порядковый номер элемента и буфер, в который я могу напечатать что-то. Это что-то и будет представлять элемент списка на экране. Таким образом реализована полная абстракция.

u5er ★★
() автор топика
Последнее исправление: u5er (всего исправлений: 1)
Ответ на: комментарий от u5er

Если не промежуточный массив, то что?

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

ugoday ★★★★★
()
Ответ на: комментарий от u5er

Мой любимый toolkit дёргает функцию обратного вызова и передаёт в неё порядковый номер элемента и буфер

Я не до конца понимаю откуда у вас дырки берутся. Но думается мне что в контексте директорий (dentries переменной длины) индексировать (создавать вектор смещений в массив dentries) всё равно придётся, на этом этапе и избавитесь от дырок. Самое простое, кмк.

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

… как, собственно, вы и собирались.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Я не до конца понимаю откуда у вас дырки берутся

Другой пример. Есть модем, который управляется с помощью АТ-команд. В сим-карте есть 220 слотов для записей контактов. Каждый слот имеет свой порядковый номер. Выборка записей идёт по порядковому номеру слота. Теперь ситуация. Я создал 3 контакта: Маша, Петя и Вася. Они заняли 1, 2 и 3 слот. Потом я посрался с Петей и удалил его. В итоге образовалась дырка под индексом 2.

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Я создал 3 контакта: Маша, Петя и Вася. Они заняли 1, 2 и 3 слот. Потом я посрался с Петей и удалил его. В итоге образовалась дырка под индексом 2.

Free-list. Если записи фиксированной длины - вообще тривиально делается. С плавающей длиной появляются варианты различной степени извращённости. Но индексировать всё равно придётся :)

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Но индексировать всё равно придётся :)

Вот я и занимаюсь индексированием как и написал в шапке.

Я тут писал, что у меня менее 150к оперативки. Вот точные данные

I (543) heap_init: Initializing. RAM available for dynamic allocation:
I (550) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (556) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (562) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (569) heap_init: At 3FFC5B50 len 0001A4B0 (105 KiB): DRAM
I (575) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (581) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (588) heap_init: At 4009AA60 len 000055A0 (21 KiB): IRAM

Это список доступных куч. IRAM лучше не использовать под данные, т.к. в ней можно расположить код. Остаётся DRAM. Но дело ещё осложняется тем, что может не быть доступен весь объём в виде непрерывного куска. Поэтому я буду упарываться и экономить каждый байт до тех пор, пока скорость остаётся приемлемой (а она таковой остаётся) :)

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Поэтому я буду упарываться и экономить каждый байт

Подкину идею: вовсе необязательно индексировать всё, достаточно держать в индексе только то что потенциально может быть отображено на UI прямо сейчас. Плюс возможность его относительно быстро пере/достраивать по необходимости (при условном «скролле»).

bugfixer ★★★★★
()
Ответ на: комментарий от ugoday

(Маша Вася)

Ок, теперь я хочу отредактировать контакт Вася. Я должен использовать индекс 3, а в этом списке это 2 (там нумерация с 1 идёт вроде… не важно). Напомню, что ресурсы памяти значительно ограничены, поэтому грузить всё в память - не вариант ;)

u5er ★★
() автор топика
Ответ на: комментарий от u5er

Я должен использовать индекс 3, а в этом списке это 2

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

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

односвязный список

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

u5er ★★
() автор топика