Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2012, 18:57   #1
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию [Решено] Алгоритм поиска наиболее подходящих [отдельное спасибо Abstraction]

1. Я так понял нет разделов "просто алгоритмы" без привязки к языку? (в принципе пишу на С, поэтому вопрос сюда)
2. Сама задача.
Есть много (~10 000) записей (структур). У каждой есть до 20 (почти всегда 20) характеристик в виде текст+число.
К примеру:
Слон - большой:100, нос:90, хвост:10, громкость:20, ухи:100.
Праздник - громкость:100, большой:80, детей:60, крови:1.

Количество разных текстовых характеристик (~10 000), их числовые значения колебаются от 0 до 100 включительно.

Возникают задачи выбрать из записей:
1) N самых больших.
2) N самых хвостатых и людей.
3) N самых громких или кровавых, но не детей.
И нужно выполнять задачи поиска менее чем за 1 секунду.

Задача 1-го типа если достаточно записей с такой характеристикой и числовым значением в 100 выполняется примерно секунду - уже критическое число. Если недостаточно 100, то (уменьшаю порог до 90 и прогоняю цикл поиска заново... пока не получу N записей) и уже не вкладываюсь.

Первая идея: предварительно в фоне просчитать чего-нить чтобы можно было бы это использовать в будущем (нет ограничений на время, но в разумных пределах). Но отсортированные записи по КАЖДОЙ характеристике слишком много. (Все записи весят 1Мб (примерно, без изб. инф.)) 1Мб*10 000 (facepalm)

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

Может у кого появятся какие иные идеи?
Пишу на чистом С, плюсы спилил.

Последний раз редактировалось LynXzp; 05.12.2012 в 22:51. Причина: Решено
LynXzp вне форума Ответить с цитированием
Старый 05.12.2012, 19:32   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

LynXzp

Есть много (~10 000) записей (структур). У каждой есть до 20 (почти всегда 20) характеристик в виде текст+число.

Возникают задачи выбрать из записей:
1) N самых больших.
2) N самых хвостатых и людей.
3) N самых громких или кровавых, но не детей.


На фига тут Си? В базу всё это и sql.
Rififi вне форума Ответить с цитированием
Старый 05.12.2012, 20:02   #3
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Это десктопное приложение.
Думал использовать sqlite
Но принципиально это не повысит производительность.
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 05.12.2012, 21:02   #4
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

В любом случае быстрый поиск только если данные упорядочены, поэтому поддержка дополнительных структур. Если действительно только эти три запроса, то здесь 4 упорядоченных структуры с указателями на соответствующие записи. Во вторую включаются только люди, в 3 и 4 не вкл. дети. Упорядочение индексированием дает 4х101 динамических списка без особых заморочек
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 05.12.2012, 21:23   #5
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Нет, не только эти три запроса, иначе да, заранее подготовить почти готовые ответы и проблем нету.
Запросы с любыми комбинациями И/ИЛИ/НЕ на любые характеристики (а их 10 000 для типичного пользователя). По всем заранее не упорядочить.
(И надо выбрать наиболее подходящие кандидатуры в числовом эквиваленте)
Пишу на чистом С, плюсы спилил.

Последний раз редактировалось LynXzp; 05.12.2012 в 21:29.
LynXzp вне форума Ответить с цитированием
Старый 05.12.2012, 21:33   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Свойства-тексты в отдельную таблицу, в объектах хранить только индекс свойства в таблице.
2) Составить массив указателей на объекты (10000 - немного).
3) При каждом запросе упорядочивать массив и выбирать первые N записей.

Не должно быть там секунды.
Abstraction вне форума Ответить с цитированием
Старый 05.12.2012, 21:50   #7
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Как у Abstraction должно уложиться во время
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 05.12.2012 в 21:58.
MihalNik вне форума Ответить с цитированием
Старый 05.12.2012, 21:58   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

1 Мб на запись, в записи - двадцать характеристик. 20 чисел не больше 100 - это 20 байт. След., все - текст. Получается, самый времязатрат - поиск точного соответствия характеристики по названию. Тогда в чем смысл хранить столько дублирующей информации в каждой записи?
//примерно так я понимаю объяснение первого пункта предпоследнего перед моим комментария.
Smogg вне форума Ответить с цитированием
Старый 05.12.2012, 22:01   #9
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

Записи были даны изначально, 1 мб - это очень мало записей-то (несколько тысяч, все там должно очень быстро работать.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 05.12.2012 в 22:05.
MihalNik вне форума Ответить с цитированием
Старый 05.12.2012, 22:16   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А, ещё:
Цитата:
2) N самых хвостатых и людей.
Как должно трактоваться такое условие? Точнее, можно ли построить автомат, который бы сопоставил каждому объекту некоторое целое число M так, что A "самее" B если и только если M(A)>M(B)? В этом случае имеет смысл делать массив пар (указатель на объект, оценка объекта) и сортировать его.

P.S. Также может оказаться выгодным трюк держать в объекте массив из 21 "характеристики", забивая все лишние нулевыми значениями. Тогда определение того, есть ли у объекта некоторая характеристика, может быть организовано как линейный поиск, что на 20 элементов может оказаться быстрее алгоритма поиска в отсортированном массиве.

Последний раз редактировалось Abstraction; 05.12.2012 в 22:20.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимальный алгоритм - получить список из N наиболее часто встречающихся элементов vedro-compota Общие вопросы по программированию, компьютерный форум 34 09.12.2012 13:11
Алгоритм поиска Sylar9 Общие вопросы C/C++ 0 03.04.2012 12:38
A* алгоритм поиска Nicko_mt Помощь студентам 2 04.10.2011 02:24
алгоритм поиска незнайка_на_земле Помощь студентам 4 08.03.2011 10:46
Алгоритм поиска!!!! vit1990 Помощь студентам 14 29.01.2011 21:18