Я хочу начать с того, что это НЕ домашний вопрос. Я читаю Введение в алгоритмы - известный текст CLRS, чтобы стать лучшим программистом. Я пытаюсь решить проблемы и упражнения, приведенные в книге, самостоятельно.
Я пытаюсь решить Excercise 10.1-2 из главы 10 «Элементарные структуры данных» из второго издания CLRS. Вот что говорится:
Объясните, как реализовать два стека в одном массиве A [1..n] таким образом, чтобы ни один из стеков не переполнялся, если общее количество элементов в обоих стеках вместе не равно n . Операции PUSH и POP должны выполняться за O (1) раз.
Решение, которое я нашел до сих пор:
Пусть массив A [1..n] реализует два стека: S1 [1..i] и S2 [i..n] .
Для операций PUSH-S1 и PUSH-S2 , если стек заполнен, тогда начните помещать элементы в другой стек (например, если стек S1 заполнен, когда новый элемент пытается быть вставленным, затем вставьте этот элемент в стек S2 и наоборот).
Проблема с этим подходом заключается в том, что я не смогу надежно POP-S1 или POP-S2, поскольку нет способа «запомнить», какой элемент принадлежит какому стеку. Если элементы стека являются парами (ключ, значение) , ключом является номер стека, то для извлечения элемента мне придется искать, в худшем случае, i или (ni) раз - что будет O (n). ) (не стесняйтесь поправлять меня, если я ошибаюсь), что не будет O (1) .
Я уже давно бьюсь над этим вопросом. Я на правильном пути? Может кто-нибудь дать мои возможные указатели для решения этой проблемы?
В общем, как мне «думать» об этих проблемах? Или только действительно умные люди могут решить такие проблемы? Поможет ли мне решение таких проблем (например, получение опыта) стать лучше?
Я жду просветления.