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

 
 
 
Reply to this topicStart new topic
> Устаревание записей в таблице
ataradov
сообщение Dec 27 2011, 22:43
Сообщение #1


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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

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

Ресурсы ограничены, поэтому на каждую запись желательно потратить не более одного байта под это дело. Применение связанных списков и прочих сложных структур данных тоже отпадает.
Go to the top of the page
 
+Quote Post
Major
сообщение Dec 28 2011, 03:35
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 375



Как происходит поиск записи в таблице?

Если у вас не хеш, а прямой поиск, то пузырьковая сортировка.
Пусть есть обращение к записи с индексом N, то переносим ее в индекс N-1 (делаем swap(rec[N-1],rec[N])
Пр появлении новой записи она записывается в самый последний индекс, так как в самом низу самая редкая запись.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Dec 28 2011, 03:39
Сообщение #3


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



QUOTE (Major @ Dec 28 2011, 06:35) *
Как происходит поиск записи в таблице?
Простым последовательным поиском.

QUOTE (Major @ Dec 28 2011, 06:35) *
Если у вас не хеш, а прямой поиск, то пузырьковая сортировка.
Спасибо. У меня это в голове вертелось, но я зациклился на переносе в самый верх, а не на одну запись.
Go to the top of the page
 
+Quote Post
Major
сообщение Dec 28 2011, 03:50
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 375



Думаю что такой метод запатентован (текущее патентное право не одобряю).
Go to the top of the page
 
+Quote Post
ataradov
сообщение Dec 28 2011, 03:52
Сообщение #5


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



QUOTE (Major @ Dec 28 2011, 06:50) *
Думаю что такой метод запатентован (текущее патентное право не одобряю).
Да куда не плюнь - все запатентовано, делать-то нужно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 28 2011, 05:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Major @ Dec 28 2011, 07:50) *
Думаю что такой метод запатентован (текущее патентное право не одобряю).

Даже если запатентовано, спокойно игнорируем патент и работаем дальше. Если объёмы выросли настолько, что начинают приставать с патентами, то это скорее хорошо, чем плохо :-)
Кстати, поиск по патентам иногда выдаёт что-нибудь интересное:
Google Patents
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 28 2011, 12:02
Сообщение #7


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

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



QUOTE
Есть таблица (маршрутизации, но это не важно)


Важно.

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

Если у Вас записи в таблице маршрутизации случайно разбросаны (относительно ключа поиска - например, адрес приемника), то прямой поиск будет иметь вычислительные ресурсы O(n). Обычно таблицы маршрутизации хранят в сортированном по ключу виде, дабы при использовании бинарного поиска ресурсов бы требовалось O(log2(n)).

Естественно, в такой таблице простой метод перемещения записей вверх не работает. Надо строить деревья, заводить дополнительные поля (таймер либо счетчик), и т.д. и т.п.

Но! Если у Вас в среднем основную нагрузку на маршрутизацию создают источники, количество который не превышает log2(n), то метод перемещения наиболее часто используемых вверх списка и прямой поиск будет вполне адекватен бинарному по производительности.

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

Скажем, разбить массив на 256 записей на 8 частей (блоков) по 32 записи. Сначала ищется запись в блоках (худший случай - 8*5=40 операций), затем запись переносится из текущего блока (в котором нашли) в предыдущий. Первый блок будет содержать самые часто используемые записи, второй - менее, и так далее. Причем, имеется один финт ушами для оптимизации - найденное бинарным поиском место, в котором могла бы быть данная запись в предыдущем блоке надо запомнить - туда будет вставляться найденная запись. Запись рядом с вставляемой записью переносится в блок, из которого вытащена найденная запись - это еще +5 операций поиска.

Как-то так.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Major
сообщение Dec 28 2011, 14:19
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 375



Нравиться электроникс тем что почти по любой специфике (постановка эксперимента, основы естественных наук) найдется человек по теме sm.gif
Чтобы не совсем офф-топ:
Кнута читать надо (или хотя бы Дейкстру). Ощущение что программисты перестали изучать математику и теорию алгоритмов.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Dec 28 2011, 17:49
Сообщение #9


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



Это все верно для "взрослых" применений, мне-же время поиска не сильно критично, отправка идет через медленный канал в любом случае. В то же время критичен объем программы и ОЗУ, так как исполняется на очень мелких МК.

Но в любом случае всем спасибо за участие.
Go to the top of the page
 
+Quote Post

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

 


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


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