Хочу почати з того, що це НЕ є питанням домашнього завдання. Я читаю Вступ до алгоритмів - відомого тексту CLRS, щоб стати кращим програмістом. Я намагаюся самостійно вирішити проблеми та вправи, подані в книзі.
Я намагаюся вирішити вправу 10.1-2 з розділу 10 Елементарні структури даних з CLRS Second Edition. Ось що говориться про його:
Поясніть, як реалізувати два стеки в одному масиві 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) .
Я вже досить довго стукаю головою про це питання. Я на правильному шляху? Чи може хтось дати мої можливі вказівки для вирішення цієї проблеми?
Загалом, як я повинен «думати» про ці проблеми? Або лише справді розумні люди можуть вирішувати такі проблеми? Чи допоможе мені вирішити / вирішити подібні проблеми (тобто набути досвіду) мені стати кращим у цьому?
Я чекаю просвітлення.