Для массива вида
1, 6, 5, 2, 3, 4
нам нужно вывести
1 2 3
1 3 4
1 2 4
2 3 4
Как лучше всего это сделать? Это динамическое программирование?
Есть ли способ лучше, чем грубая сила O (n3)? Я уверен, что есть.
Я говорю о динамическом программировании, потому что я вижу это как что-то вроде
для '1' (распечатайте все результаты подзадач остальной части массива с подпоследовательностями размера 2) .
для '2' (распечатайте все результаты подзадач остальной части массива с подпоследовательностями размера 2)
и продолжайте так.
Однако в приведенном выше есть много совпадений два результата, так что нам нужно найти эффективный способ их повторного использования, я думаю.
Ну, это просто случайные мысли. Вы можете исправить меня с помощью правильной оценки.
Хорошо, позвольте мне исправить, если не печатать, мне нужны возвращаемые различные возрастающие последовательности. Я хочу сказать, что мне нужно найти подход, чтобы добраться до этих последовательностей наиболее эффективным способом. public: virtual ~ Base () {} виртуальный базовый оператор + (const Base & rhs) = 0; ...
Предположим, у меня есть абстрактный базовый класс, который просто определяет контейнер, в котором может быть выполнено добавление:
class Base {
public:
virtual ~Base() {}
virtual Base operator+(const Base& rhs) =0;
};
Затем Я хочу, чтобы подклассы Base обеспечивали фактическую операцию:
class Derived: public Base {
public:
Base operator+(const Base& rhs) { // won't compile
// actual implementation
}
};
Вот моя проблема: оператор + () должен возвращать новый объект Base, но, будучи абстрактным, Base не компилируется.
Я попытался обойти это, используя фабрику для возврата ссылки на объект Base, но затем в теле оператора я обнаружил, что выполняю приведение типов, потому что добавление имеет смысл только для объектов Derived.
В любом случае, мне кажется, что я кусаю себя за хвост, есть ли правильное решение для этого?
ОБНОВЛЕНИЕ: На основании полученных ответов мне кажется, что я использую неправильный шаблон. Я хочу отделить интерфейс от реализации, так что код библиотеки должен знать только интерфейс, а клиентский код обеспечивает реализацию. Я попытался сделать это, предоставив интерфейс как абстрактный базовый класс, а реализацию как подклассы.
UPDATE2: На самом деле у меня было два вопроса: конкретный (об операторах перегрузки в абстрактных классах) и еще один о моем намерении (как я могу позволить клиенту настраивать реализацию). Первому был дан ответ: не надо. Что касается последнего, кажется, что используемый мной паттерн Интерфейсный класс на самом деле является хорошим решением этой проблемы (согласно Гриффитсу и Рэдфорду ), просто мне не следует связываться с перегруженными операторами.