Гаразд, тому ваша мета - показати, що основі C L A S S 1 [ g ( n ) ] = C L A S S 2 [ h ( n ) ]СЛ А СS1[ г( f( n ) ) ] = CЛ А СS2[ год ( ф( n ) ) ]СЛ А СS1[ г( n ) ] = СЛ А СS2[ год ( n ) ](ми не вказуємо, які саме це класи, ми просто знаємо, що вони якимось чином параметризовані з вхідним розміром). Ми маємо мову , вирішується деяким алгоритмом А . Тепер ми робимо мову L ′ , додаючи кожне слово в x ∈ L , так що його довжина тепер f ( n ) , і ми бачимо, що він міститься в C L A S S 1 [ gL ∈ CЛ А СS1[ г( f( n ) ) ]АL'x ∈ Lf(n) (наш новий алгоритм A 'в основному просто ігнорує додані нулі і виконує A на реальному, короткому вході).CLASS1[g(n)]A′A
Що ми робимо, це: ми беремо мову з більшого класу і вкладаємо її, так що вона може бути вирішена слабшим алгоритмом, який дає нам стримування в меншому класі - слабший алгоритм може це зробити, тому що він має однакову кількість 'справжню роботу' робити як раніше, але вона має обмеження (будучи функцією вхідної довжини) зняти шляхом розширення вводу.
Тепер ми знаємо, що і, отже, L ′ ∈ C L A S S 2 [ h ( n ) ] (вирішено за деяким алгоритмом B ′ ). Ми хотіли б звідси дістатися до L ∈ C L A S S 2 [ h ( f ( n ) ) ]L′∈CLASS1[g(n)]L′∈CLASS2[h(n)]B′L∈CLASS2[h(f(n))]. Але це просто - алгоритм вирішує L, просто прошиває вхід відповідно і працює B ' на вкладеному вході.BLB′
Цей крок може бути узагальнений наступним чином: ми хочемо визначити у більшому, більш винахідливому класі. Використовуючи наші додаткові ресурси, ми вкладаємо вхідні дані та запускаємо алгоритм, який вирішує вкладену мовуL .
Звичайно, тут задіяні деякі технічні деталі (наприклад, ми повинні переконатися, що накладка може бути реалізована в класах, які ми розглядаємо), але я просто ігнорую їх, щоб надати загальну інтуїцію.