реклама на сайте
подробности

 
 
> Быстрый доступ к элементу.
Jenya7
сообщение Oct 22 2017, 08:54
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я получаю пакеты данных. Эти пакеты я должен хранить в RAM. Глубина хранения не определена но пока что это 512 пакетов.
То есть в RAM я создал массив 512 пакетов.
У каждого пакета есть два поля ID - ID1/ID2. Значения инденцификационных полей варьируются ID1=0-10000, ID2=0-255.
Мне приходит команда - добавь пакет 700/12, удали пакет 700/12, редактируй пакет 700/12. Команда приходит довольно часто - худший случай - каждую милисекунду поэтому время поиска элемента критично.
Проблема в быстром поиске пакета. Сделать хэш таблицу ID1-ID2 <=> индекс - громадная таблица получиться.
Сейчас к чему я пришел - самое оптимальное связанный список.
И тут я вспомнил работу с SQL базами данных - это ж просто праздник какой то. Добавляй, удаляй, редактируй записи сколько влезет и очень быстро.
В принципе это может быть non-SQL база данных - у меня всего одна таблица.
Есть реализация базы данных для эмбедед? кто нибудь видел такое? может даже реализовывал?

P.S. Погуглил эту тему. Вроде как советуют SQLLite. Но я не нашел примеров SQLLite для эмбеддед в С.

Сообщение отредактировал Jenya7 - Oct 22 2017, 09:02
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Oct 22 2017, 09:36
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



QUOTE
1. Зачем хранить указатели на пакеты? Вместо них лучше индексы. Тогда один элемент таблицы поиска можно ужать до 32 бит:
log(10000)/log(2)+8+9 = 31бит


В данном случае это O(1).

QUOTE
ааа. то есть сортировать массив по ключу и делать бинарный поиск?


Конечно.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2017, 09:52
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Rst7 @ Oct 22 2017, 14:36) *
В данном случае это O(1).

Конечно.

Допустим у меня массив с ID 3 5 7 13 25 178 1355. Пришел ID 18. Я должен вставить его в свободное место и потом сортировать весь массив? А при удалении элемента сдвинуть все элементы влево?
Это займет много время.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2017, 10:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Oct 22 2017, 12:52) *
Допустим у меня массив с ID 3 5 7 13 25 178 1355. Пришел ID 18. Я должен вставить его в свободное место и потом сортировать весь массив? А при удалении элемента сдвинуть все элементы влево?

Не в свободное место, а раздвинув существующие. И не все надо сдвигать, а от позиции нового пришедшего, до позиции удаляемого.

Цитата(Rst7 @ Oct 22 2017, 12:59) *
В данном случае за 3 сравнения (бинарным поиском) Вы находите место для вставки элемента с ID 18 (между 13 и 25). После чего Вам его просто нужно вставить (копирование трех элементов плюс запись нового). Массив остается отсортированным.

Исходить надо из случая заполненности всего массива (имеются все 512 кадров). И при старте делать инициализацию, заполнив первоначально массив недопустимыми индексами (с ID1 > 10000 например).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2017, 10:07
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Rst7 @ Oct 22 2017, 14:59) *
В данном случае за 3 сравнения (бинарным поиском) Вы находите место для вставки элемента с ID 18 (между 13 и 25). После чего Вам его просто нужно вставить (копирование трех элементов плюс запись нового). Массив остается отсортированным.

копирование трех элементов плюс запись нового не получиться - таки надо раздвинуть.

Цитата(jcxz @ Oct 22 2017, 15:04) *
Не в свободное место, а раздвинув существующие. И не все надо сдвигать, а от позиции нового пришедшего, до позиции удаляемого.


Исходить надо из случая заполненности всего массива (имеется все 512 кадров). И при старте делать инициализацию, заполнив первоначально массив недопустимыми индексами (с ID1 > 10000 например).

то есть сдвинуть все элементы вправо от искомого. а при удалении все элементы влево от искомого.

наверно это все равно будет быстрее чем с несортированным массивом.

Сообщение отредактировал Jenya7 - Oct 22 2017, 10:09
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 22 2017, 10:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Oct 22 2017, 13:07) *
то есть сдвинуть все элементы вправо от искомого. а при удалении все элементы влево от искомого.

Я уже несколько раз написал - это можно сделать за одну операцию memmove(): сдвиг элементов в массиве поиска от добавляемого до удаляемого. Всего одна memmove.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 22 2017, 10:32
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ Oct 22 2017, 13:18) *
. . . . это можно сделать за одну операцию memmove(): сдвиг элементов в массиве поиска от добавляемого до удаляемого. Всего одна memmove.

Это зависит от платформы ? - в смысле содержимого memmove() - аппаратная или программная реализация пересылки ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Быстрый доступ к элементу.   Oct 22 2017, 08:54
- - jcxz   Цитата(Jenya7 @ Oct 22 2017, 11:54) Пробл...   Oct 22 2017, 09:09
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 14:09) Сделайт...   Oct 22 2017, 09:20
- - Rst7   QUOTE И тут я вспомнил работу с SQL базами данных ...   Oct 22 2017, 09:14
|- - jcxz   Цитата(Rst7 @ Oct 22 2017, 12:14) Потому ...   Oct 22 2017, 09:33
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 14:33) 1. Заче...   Oct 22 2017, 09:48
|- - jcxz   Цитата(Jenya7 @ Oct 22 2017, 12:48) допус...   Oct 22 2017, 09:52
|- - k155la3   Цитата(Jenya7 @ Oct 22 2017, 12:48) . . ....   Oct 22 2017, 10:07
- - Rst7   QUOTE переберите все сочитания 0-10000 и 0-255. Уж...   Oct 22 2017, 09:28
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 14:28) Вы не п...   Oct 22 2017, 09:34
|- - Jenya7   Цитата(jcxz @ Oct 22 2017, 15:18) Я уже н...   Oct 22 2017, 10:24
|- - Jenya7   Цитата(k155la3 @ Oct 22 2017, 15:32) Это ...   Oct 22 2017, 10:39
|- - jcxz   Цитата(k155la3 @ Oct 22 2017, 13:32) Это ...   Oct 22 2017, 11:15
- - Rst7   QUOTE Допустим у меня массив с ID 3 5 7 13 25 178 ...   Oct 22 2017, 09:59
- - Rst7   QUOTE Исходить надо из случая заполненности всего ...   Oct 22 2017, 10:07
- - Rst7   А вообще-то для полной универсальности топикстарте...   Oct 22 2017, 10:09
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 15:09) А вообщ...   Oct 22 2017, 10:16
|- - Rst7   QUOTE (Jenya7 @ Oct 22 2017, 13:16) это к...   Oct 22 2017, 10:47
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 15:47) Еще раз...   Oct 22 2017, 10:49
|- - Rst7   QUOTE (Jenya7 @ Oct 22 2017, 13:49) Посмо...   Oct 22 2017, 11:33
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 16:33) Ну если...   Oct 22 2017, 11:38
- - Rst7   QUOTE а я понял. ну вот в этом вопрос - насколько ...   Oct 22 2017, 10:59
- - Rst7   QUOTE Да ладно! Какой компилятор? IAR-овский m...   Oct 22 2017, 11:22
|- - jcxz   Цитата(Rst7 @ Oct 22 2017, 14:22) Итого з...   Oct 22 2017, 11:31
- - Jenya7   Rst7, jcxz. Большое вам спасибо. Сделаю так. Вооб...   Oct 22 2017, 11:30
- - Rst7   QUOTE вы говорите на больших размерах можно подума...   Oct 22 2017, 11:41
|- - Jenya7   Цитата(Rst7 @ Oct 22 2017, 16:41) Даже не...   Oct 22 2017, 12:37
- - Jenya7   хотел уточнить такой вопрос для вставки Кодmemmove...   Oct 23 2017, 11:36
- - Rst7   QUOTE получается я должен добавить отступ? Нет. Н...   Oct 23 2017, 13:16
|- - Jenya7   Цитата(Rst7 @ Oct 23 2017, 19:16) Нет. На...   Oct 23 2017, 13:24
- - Rst7   QUOTE но а+2 не будет адресом элемента a[2]. Что ...   Oct 23 2017, 14:04
|- - Jenya7   Цитата(Rst7 @ Oct 23 2017, 20:04) Что зна...   Oct 23 2017, 14:35
- - XVR   Советую отделить id от data и хранить id+индекс в ...   Oct 23 2017, 21:16
|- - Jenya7   Цитата(XVR @ Oct 24 2017, 02:16) Советую ...   Oct 24 2017, 06:23
- - ViKo   Высказываю идею. Пока пакетов меньше 1024 (чисто п...   Oct 24 2017, 07:43
- - Jenya7   Результаты такие. При добавлении элемента я вылета...   Oct 24 2017, 07:44
|- - ViKo   Цитата(Jenya7 @ Oct 24 2017, 10:44) так я...   Oct 24 2017, 08:05
- - skripach   Цитата(Jenya7 @ Oct 22 2017, 11:54) масси...   Oct 24 2017, 07:55
- - Jenya7   Нашел проблемку. Функция вставки в причесанном вар...   Oct 24 2017, 08:41
- - Rst7   Ну правильно вот так CODEmemcpy(messages...   Oct 24 2017, 10:09
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 15:09) Ну прав...   Oct 24 2017, 11:12
- - Rst7   QUOTE не совсем понимаю. memmove переносит из адре...   Oct 24 2017, 11:41
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 16:33) Вы пере...   Oct 24 2017, 11:43
- - Rst7   QUOTE ммм...а можете показать как. я не понимаю на...   Oct 24 2017, 11:57
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 16:57) Обновит...   Oct 24 2017, 12:07
- - Rst7   Ну и чисто эстетический момент. Лично меня вымораж...   Oct 24 2017, 12:10
|- - Jenya7   Цитата(Rst7 @ Oct 24 2017, 17:10) Ну и чи...   Oct 24 2017, 12:17
- - Jenya7   по моему в КодTEST_MESSAGE *AllocMessage(void...   Oct 26 2017, 07:34
- - Rst7   QUOTE Элементы вставляются но p->data всех элем...   Oct 26 2017, 08:00
|- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 14:00) Ээээ, т...   Oct 26 2017, 09:23
|- - Rst7   QUOTE (Jenya7 @ Oct 26 2017, 12:23) Да. Н...   Oct 26 2017, 09:47
|- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 15:47) Я так з...   Oct 26 2017, 10:39
- - Rst7   Я не понимаю, что Вы смотрите. Все поля msg_p[i].p...   Oct 26 2017, 11:29
- - Jenya7   Цитата(Rst7 @ Oct 26 2017, 16:29) Что печ...   Oct 26 2017, 11:36


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016