Как лучше подходить к этой (жадной?) Проблеме? - PullRequest
2 голосов
/ 07 марта 2019

Допустим, у меня есть n блоков, где внутри каждого блока есть какое-то значение b[i]. Я могу гарантировать, что массив ящиков отсортирован так, что b[1] <= b[2] <= ... <= b[n]. Я также могу гарантировать, что есть элемент b[i] = x, и я хотел бы выяснить, в каком ящике x находится. Проблема в том, что открытие каждого ящика b[i] имеет определенную стоимость c[i].

Проблема в том, как минимизировать общую стоимость поиска x? Мой интуитивный подход заключается в выполнении бинарного поиска на b[i]. Это уменьшает общее количество операций (так как я получаю это O (logn) сравнения), но я не могу точно понять, как это минимизирует общую стоимость.

Очевидно, что просто выбрать самую дешевую коробку и продолжить не получится, поскольку в худшем случае я бы открывал каждую коробку. Любые идеи о том, как я мог бы улучшить это или как я могу доказать, что мой подход является оптимальным / не оптимальным?

1 Ответ

0 голосов
/ 07 марта 2019

Используйте динамическое программирование, чтобы найти оптимальное дерево решений.Пусть T(i, j) будет наихудшей стоимостью поиска местоположений i..j.Тогда

T(i, j) = { 0,                                              if i > j;
          { min_{k=i}^j (c[k] + max(T(i, k-1), T(k+1, j))), otherwise.

Запомните лучший выбор k для каждого интервала.

Время выполнения составляет O(n^3), сводится к O(n^2) с использованием трюка Кнута для оптимального BST.

...