Я придумал следующее:
Это сообщает о предмете с наивысшей оценкой с суммой его очков и баллов его ближайших соседей. Если используется сосед, об этом не сообщается отдельно.
Я предлагаю использовать дерево точек обзора в качестве метрического индекса.
Алгоритм будет выглядеть следующим образом:
- построение метрического индекса из строк и их оценок
- построение максимальной кучи из строк и их оценок
- для строки с наивысшей оценкой в максимальной куче:
- использовать метрический индекс для поиска ближайших строк
- напечатать строку, а сумму ее оценки и ближайших строк
- удалить из метрического индекса строку и каждый изстроки рядом с
- удалить из максимальной кучи строку и каждую из строк рядом с
- повторять 3-7, пока максимальная куча не станет пустой
Возможно, этоможно упростить, используя использованную таблицу, а не удаляя что-либо. Для индекса метрического пространства не требуется эффективного удаления, а максимальная куча не должна поддерживать удаление по значению. Но это было бы медленнее, если окрестности большие и часто перекрываются. Поэтому эффективное удаление может оказаться необходимой трудностью.
- построить индекс метрики из строк и их оценок
- построить максимальную кучу из строк и их оценок
- создайте используемую таблицу из пустого набора
- для строки с наибольшим счетом в максимальной куче:
- , если эта строка находится в используемой таблице: начните заново со следующей строки
- используйте метрический индекс, чтобы найти строки рядом:
- удалить все строки рядом, которые есть в используемой таблице.
- вывести строку, а также сумму ее оценки и ее значения рядом. строки
- добавить строки рядом с используемой таблицей
- повторять 4-9, пока максимальная куча не станет пустой
Я не могу предоставить анализ сложности.
Я думал о втором алгоритме. Часть, которую я думал, была медленной, была проверка соседства с использованным столом. В этом нет необходимости, поскольку удаление из дерева точек обзора может быть выполнено за линейное время. При поиске соседей, помните, где они были найдены, а затем удалите их позже, используя эти места. Если в качестве точки наблюдения используется сосед, пометьте его как удаленный, чтобы поиск не возвращал его, а оставил бы его в покое в противном случае. Я думаю, что это восстанавливает его ниже квадратичного. В противном случае это будет что-то вроде количества предметов, умноженного на размер окрестности.
В ответ на комментарий. Проблема заключалась в том, что «строки с меньшим числом свернуты в строки с большим числом». как таковой, он вычисляет это. Это не жадное приближение, которое может привести к неоптимальному результату, так как нечего было максимизировать или минимизировать. Это точный алгоритм. Возвращает предмет с наивысшей оценкой в сочетании с оценкой соседства.
Это можно рассматривать как назначение лидера каждому району так, чтобы у каждого предмета было не более одного лидера, и этот лидер имел наибольший общий результат. Это можно рассматривать как ориентированный граф.
Спецификация не предназначена для задач динамического программирования или оптимизации. Для этого вы бы попросили предмет с наибольшим количеством баллов в районе наибольшего общего выигрыша. Это также можно решить аналогичным образом, изменив строки функции ранжирования от ее оценки до пары суммы ее оценки и ее окрестности, и ее оценки.
Это означает, что это не может бытьрешается с максимальной кучей по баллам, так как удаление предметов влияет на соседей по соседству, и нужно будет пересчитать их балл по соседству, прежде чем снова найти предмет с наибольшим общим выигрышем по соседству.