Эффективная программа для печати / возврата всех возрастающих подпоследовательностей размера 3 в массиве

Для массива вида

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: На самом деле у меня было два вопроса: конкретный (об операторах перегрузки в абстрактных классах) и еще один о моем намерении (как я могу позволить клиенту настраивать реализацию). Первому был дан ответ: не надо. Что касается последнего, кажется, что используемый мной паттерн Интерфейсный класс на самом деле является хорошим решением этой проблемы (согласно Гриффитсу и Рэдфорду ), просто мне не следует связываться с перегруженными операторами.

7
задан AnonymousCoward 2 February 2011 в 19:12
поделиться