স্পেস কমপ্লেক্সিটি ও PSPACE
এই পাঠে যা শিখবেন
- স্পেস কমপ্লেক্সিটির সংজ্ঞা এবং টাইম কমপ্লেক্সিটি থেকে এটি কীভাবে ভিন্ন
- ক্লাস PSPACE-এর ফরমাল সংজ্ঞা ও $P \subseteq NP \subseteq PSPACE$ কন্টেইনমেন্ট
- স্যাভিচের থিওরেম — স্পেসের জন্য নন-ডিটারমিনিজমের প্রকৃত "মূল্য" কেন টাইমের চেয়ে ভিন্ন ও জানা
- TQBF — PSPACE-কমপ্লিট প্রবলেম, ও এর জন্য একটি বাস্তব রিকার্সিভ এভালুয়েটর
১ · স্পেস কমপ্লেক্সিটি — মেমোরি দিয়ে জটিলতা মাপা
M10 জুড়ে আমরা একটি টুরিং মেশিন সমস্যাটি সমাধান করতে কত সময় (ধাপ) নেয় তা মেপেছি। কিন্তু একটি TM-এর দ্বিতীয়, স্বতন্ত্র সম্পদ (resource) আছে — সেটি চলার সময় কতগুলো টেপ সেল স্পর্শ করে, অর্থাৎ কতটা স্পেস কমপ্লেক্সিটিSpace Complexityইনপুট দৈর্ঘ্য n-এর ফাংশন হিসেবে, worst-case-এ একটি TM কতগুলো টেপ সেল ব্যবহার করে — সময় যতই লাগুক না কেন, সম্পূর্ণ স্বতন্ত্র একটি মাপ। ব্যবহার করে। এই দুটো সম্পূর্ণ স্বতন্ত্র সম্পদ — একটি অ্যালগরিদম কম সময়ে কিন্তু বেশি মেমোরি ব্যবহার করে চলতে পারে, অথবা উল্টোটা। স্পেস কমপ্লেক্সিটি বিশেষভাবে গুরুত্বপূর্ণ কারণ মেমোরি পুনরায় ব্যবহারযোগ্য (একই সেল বারবার ওভাররাইট করা যায়) — তাই একটি অ্যালগরিদম কম স্পেসে অনেক বেশি সময় ধরে চলতে পারে, যা একটি গুরুত্বপূর্ণ, ভিন্ন ট্রেড-অফ তৈরি করে।
২ · ক্লাস PSPACE
$$PSPACE = \{L : L \text{ কোনো TM } O(n^k) \text{ স্পেসে ডিসাইড করে, কোনো ধ্রুবক } k \text{-এর জন্য}\}$$
লক্ষ্য করুন এই সংজ্ঞায় সময়ের কোনো সীমা নেই — শুধু স্পেস পলিনমিয়াল হতে হবে, TM যত সময় খুশি নিতে পারে (যদিও দেখানো যায় পলিনমিয়াল স্পেসে সীমাবদ্ধ একটি TM এক্সপোনেনশিয়াল সময়ের বেশি চলতে পারে না, কারণ TM-এর সম্ভাব্য মোট কনফিগারেশন সংখ্যা স্পেস দ্বারা সীমাবদ্ধ — একই কনফিগারেশনে দুবার ফিরলে লুপ ধরা পড়ে)।
একটি গুরুত্বপূর্ণ, প্রতিষ্ঠিত কন্টেইনমেন্ট সম্পর্ক (state করা, প্রমাণ ছাড়াই এই মুহূর্তে):
$$P \subseteq NP \subseteq PSPACE$$
৩ · স্যাভিচের থিওরেম — স্পেসে নন-ডিটারমিনিজমের প্রকৃত মূল্য
$NP \subseteq PSPACE$ কন্টেইনমেন্টের পেছনে আছে একটি সত্যিই গুরুত্বপূর্ণ, নামকরা ফলাফল:
যেকোনো ল্যাঙ্গুয়েজ যা একটি নন-ডিটারমিনিস্টিক TM $f(n)$ স্পেসে ডিসাইড করতে পারে, সেটি একটি ডিটারমিনিস্টিক TM মাত্র $O(f(n)^2)$ স্পেসে ডিসাইড করতে পারে।
এর মানে — স্পেসের জন্য, নন-ডিটারমিনিজম বাদ দিতে চাইলে সর্বোচ্চ একটি বর্গাকার (quadratic) ব্লো-আপ লাগে, যা $n^k$-এর জন্য এখনো $n^{2k}$ — অর্থাৎ এখনো পলিনমিয়াল। তাই NP (নন-ডিটারমিনিস্টিক পলিনমিয়াল টাইম)-এর প্রতিটি প্রবলেম, নন-ডিটারমিনিজম প্রতিস্থাপন করলেও, পলিনমিয়াল স্পেসে থেকেই যায় — এই কারণেই $NP \subseteq PSPACE$।
এখানে একটি সত্যিই গুরুত্বপূর্ণ, স্পষ্টভাবে বলার মতো অসামঞ্জস্য (asymmetry) আছে: স্পেসের জন্য আমরা জানি নন-ডিটারমিনিজম খুব বেশি খরচসাপেক্ষ নয় (স্যাভিচ) — কিন্তু টাইমের জন্য আমরা জানি না (P বনাম NP, পরবর্তী পাঠ L49-এর মূল প্রশ্ন) — একই ধরনের প্রশ্ন, দুটি ভিন্ন সম্পদের জন্য, দুটি একেবারে ভিন্ন উত্তরের অবস্থা।
৪ · PSPACE-কমপ্লিট প্রবলেম — TQBF
L45-এর মতোই, PSPACE-এর মধ্যেও "সবচেয়ে কঠিন" প্রবলেম আছে — PSPACE-কমপ্লিট প্রবলেম, যেখানে PSPACE-এর প্রতিটি প্রবলেম পলিনমিয়াল-টাইমে রিডিউস হয়। এর ক্লাসিক উদাহরণ — TQBFTrue Quantified Boolean FormulaSAT-এর সম্প্রসারণ যেখানে প্রতিটি ভ্যারিয়েবলে একটি quantifier ($\exists$ বা $\forall$) যুক্ত থাকে — প্রশ্ন হলো পুরো কোয়ান্টিফায়েড ফর্মুলাটি সত্য কি না। — একটি বুলিয়ান ফর্মুলা যেখানে প্রতিটি ভ্যারিয়েবলের সামনে $\exists$ ("কোনো একটি মান আছে যাতে...") অথবা $\forall$ ("সব মানের জন্যই...") বসানো থাকে, যেমন $\exists x \forall y\, (x \vee \neg y)$। TQBF সরাসরি দুই-খেলোয়াড় গেম সমাধানের সাথে সম্পর্কিত (উল্লেখযোগ্য: অনেক বোর্ড-গেমের সাধারণীকৃত/n×n সংস্করণ PSPACE-কমপ্লিট) — এই বিমূর্ত ক্লাসকে পরিচিত কিছুর সাথে যুক্ত করে।
# P / NP / PSPACE তুলনা টেবিল, এবং একটি সত্যিকারের রিকার্সিভ TQBF-এভালুয়েটর
comparison = {
"P": {"resource": "পলিনমিয়াল সময়", "known_containment": "P subseteq NP subseteq PSPACE",
"canonical_complete_problem": "সার্কিট ভ্যালু প্রবলেম (P-কমপ্লিট)"},
"NP": {"resource": "নন-ডিটারমিনিস্টিক পলিনমিয়াল সময়", "known_containment": "P subseteq NP subseteq PSPACE",
"canonical_complete_problem": "SAT (কুক-লেভিন, L46)"},
"PSPACE": {"resource": "পলিনমিয়াল স্পেস (সময় সীমাহীন)", "known_containment": "NP subseteq PSPACE, স্যাভিচ থিওরেম দিয়ে",
"canonical_complete_problem": "TQBF"},
}
print(f"{'ক্লাস':8s} | {'সম্পদ':30s} | {'কমপ্লিট প্রবলেম'}")
print("-" * 70)
for cls, info in comparison.items():
print(f"{cls:8s} | {info['resource']:30s} | {info['canonical_complete_problem']}")
print()
# --- TQBF এভালুয়েটর -----------------------------------------------------
# কোয়ান্টিফায়েড ফর্মুলা রিপ্রেজেন্টেশন (নেস্টেড টাপল):
# ('exists', var, subformula) | ('forall', var, subformula)
# ম্যাট্রিক্স (কোয়ান্টিফায়ার-মুক্ত অংশ): ('var', name) | ('not', e) | ('and', e1, e2) | ('or', e1, e2)
def evaluate_matrix(expr, assignment):
if expr[0] == 'var':
return assignment[expr[1]]
if expr[0] == 'not':
return not evaluate_matrix(expr[1], assignment)
if expr[0] == 'and':
return evaluate_matrix(expr[1], assignment) and evaluate_matrix(expr[2], assignment)
if expr[0] == 'or':
return evaluate_matrix(expr[1], assignment) or evaluate_matrix(expr[2], assignment)
raise ValueError("অজানা এক্সপ্রেশন")
def evaluate_tqbf(formula, assignment):
if formula[0] == 'exists':
_, var, sub = formula
for val in (False, True): # দুটোর যেকোনো একটি কাজ করলেই যথেষ্ট
new_assign = dict(assignment); new_assign[var] = val
if evaluate_tqbf(sub, new_assign):
return True
return False
if formula[0] == 'forall':
_, var, sub = formula
for val in (False, True): # দুটোই কাজ করতে হবে
new_assign = dict(assignment); new_assign[var] = val
if not evaluate_tqbf(sub, new_assign):
return False
return True
return evaluate_matrix(formula, assignment)
# উদাহরণ ১: for all x, exists y : (x XOR y) -- হাতে-যাচাই: x=T হলে y=F কাজ করে, x=F হলে y=T কাজ করে -> সবসময় True
xor_expr = ('or',
('and', ('var', 'x'), ('not', ('var', 'y'))),
('and', ('not', ('var', 'x')), ('var', 'y')))
formula1 = ('forall', 'x', ('exists', 'y', xor_expr))
print("∀x ∃y (x XOR y) =", evaluate_tqbf(formula1, {}), " (প্রত্যাশিত: True)")
# উদাহরণ ২: exists x, for all y : (x AND y) -- হাতে-যাচাই: y=False হলে x∧y সবসময় False, তাই এমন x নেই -> False
and_expr = ('and', ('var', 'x'), ('var', 'y'))
formula2 = ('exists', 'x', ('forall', 'y', and_expr))
print("∃x ∀y (x AND y) =", evaluate_tqbf(formula2, {}), " (প্রত্যাশিত: False)")
evaluate_tqbf-এর রিকার্সিভ গঠন লক্ষ্য করুন — $\exists x$-এর জন্য x=False ও
x=True দুটো শাখাই রিকার্সিভভাবে ট্রাই করে (একটি কাজ করলেই যথেষ্ট, ঠিক NFA-স্টাইল "কোনো একটি পথ"
যুক্তি), অথচ $\forall x$-এর জন্য দুটো শাখাই কাজ করতে হয়। এই রিকার্সিভ ট্রি-এর গভীরতা ভ্যারিয়েবল সংখ্যার সমান,
কিন্তু প্রতিটি ধাপে শুধু একটি partial assignment মনে রাখলেই চলে (পুরো ট্রি একসাথে নয়) — এটাই
কেন TQBF পলিনমিয়াল স্পেসে সমাধানযোগ্য যদিও এক্সপোনেনশিয়াল সময় লাগতে পারে।
স্পেস কমপ্লেক্সিটি টাইম থেকে সম্পূর্ণ স্বতন্ত্র একটি সম্পদ, আর PSPACE ($P \subseteq NP \subseteq PSPACE$) দেখায় পলিনমিয়াল-স্পেস অ্যালগরিদম টাইমের কোনো সীমা ছাড়াই কতটা শক্তিশালী হতে পারে। স্যাভিচের থিওরেম প্রমাণ করে স্পেসে নন-ডিটারমিনিজম সস্তা (মাত্র বর্গাকার ব্লো-আপ) — টাইমের একই প্রশ্ন এখনো অমীমাংসিত, যা পরের পাঠের বিষয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ একটি অ্যালগরিদম কম টাইম কিন্তু বেশি স্পেস ব্যবহার করতে পারে, বা উল্টোটা — একটি বাস্তব উদাহরণ ভাবুন।
একটি ক্লাসিক উদাহরণ — একটি মান আগে থেকে গণনা করে একটি বড় লুকআপ টেবিলে ক্যাশ (cache) করে রাখা: এতে সময় কম লাগে (টেবিল থেকে সরাসরি পড়া) কিন্তু স্পেস বেশি লাগে (পুরো টেবিল সংরক্ষণ করতে হয়) — এটি "টাইম-স্পেস ট্রেড-অফ"-এর একটি ধ্রুপদী উদাহরণ, যেখানে একটি সম্পদ কমাতে অন্যটি বাড়াতে হয়।
প্র ০২ স্যাভিচের থিওরেম যদি টাইমের জন্যও (অর্থাৎ P = NP) সত্য প্রমাণিত হতো, তাহলে কী পরিবর্তন হতো?
তাহলে P = NP প্রমাণিত হয়ে যেত, আর L49-এর পুরো "P বনাম NP" প্রশ্নটাই সমাধান হয়ে যেত — কুক-লেভিনের (L46) প্রতিষ্ঠিত সমস্ত NP-কমপ্লিট প্রবলেম (SAT, 3-SAT, ভার্টেক্স কভার, TSP, ইত্যাদি, L47) হঠাৎ পলিনমিয়াল সময়ে সমাধানযোগ্য হয়ে যেত — একটি বিপ্লবী ফলাফল। কিন্তু বাস্তবে স্যাভিচের থিওরেম শুধু স্পেসের জন্যই প্রমাণিত, টাইমের জন্য এই ধরনের কোনো ফলাফল এখনো নেই — এটাই সেই গুরুত্বপূর্ণ অসামঞ্জস্য যা এই পাঠে বলা হয়েছে।
প্র ০৩
উপরের evaluate_tqbf-এ formula2 ($\exists x \forall y (x \wedge y)$) কেন False, অথচ formula1 ($\forall x \exists y (x \oplus y)$) True?
formula2-তে $x$ প্রথমে নির্বাচিত হয় (বাইরের কোয়ান্টিফায়ার), এবং তারপর সব $y$-এর জন্য $x \wedge y$ সত্য হতে হবে — কিন্তু $y=\text{False}$ নিলে $x \wedge y$ সবসময় False (x যাই হোক না কেন), তাই কোনো $x$-ই কাজ করে না, ফলাফল False। formula1-এ $x$ প্রথমে যেকোনো মান নেয় (বাইরের $\forall$), কিন্তু ভেতরের $\exists y$ প্রতিটি $x$-এর জন্য আলাদাভাবে $y$ বেছে নিতে পারে ($y = \neg x$) — তাই প্রতিটি $x$-এর জন্যই একটি কাজ-করা $y$ পাওয়া যায়, ফলাফল True। কোয়ান্টিফায়ারের ক্রম এখানে সিদ্ধান্তমূলক।
অনুশীলন
-
চিন্তা করুন: TQBF-এ যদি কোনো ফর্মুলায় ৩টি ভ্যারিয়েবল থাকে, তাহলে
evaluate_tqbfসর্বোচ্চ কতগুলো ম্যাট্রিক্স-এভালুয়েশন করতে পারে? (প্রতিটি ভ্যারিয়েবলের দুটি সম্ভাব্য মান আছে ভাবুন।)প্রতিটি কোয়ান্টিফায়ার দুটি রিকার্সিভ শাখা খোলে (val=False, val=True), তাই ৩টি ভ্যারিয়েবলের জন্য সর্বোচ্চ $2^3=8$টি সম্পূর্ণ অ্যাসাইনমেন্ট পর্যন্ত পৌঁছানো যায় — এক্সপোনেনশিয়াল সময় (n ভ্যারিয়েবলের জন্য $2^n$), ঠিক যেমন এই পাঠে বলা হয়েছে TQBF সময়ে ব্যয়বহুল হতে পারে, যদিও স্পেসে সাশ্রয়ী।
-
পরীক্ষা করুন: উপরের কোড সেলে
formula1-এর কোয়ান্টিফায়ার ক্রম উল্টে('exists', 'x', ('forall', 'y', xor_expr))বানিয়ে Run চাপুন — ফলাফল একই থাকে কি না, আর কেন থাকে বা না থাকে হাতে যুক্তি দিন।$\exists x \forall y (x \oplus y)$ — এখন $x$ একবার আগে থেকে বেছে নিতে হবে, এবং তারপর সব $y$-এর জন্য $x \oplus y$ সত্য হতে হবে। কিন্তু যেকোনো নির্দিষ্ট $x$-এর জন্য, $y=x$ নিলে $x \oplus y = \text{False}$ — তাই কোনো $x$-ই সব $y$-এর জন্য কাজ করে না, ফলাফল এবার False। এটি প্রমাণ করে কোয়ান্টিফায়ারের ক্রম বদলালে ফলাফল বদলে যেতে পারে — TQBF-এ ক্রম গুরুত্বপূর্ণ।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৬টি পাঠ পরবর্তী পাঠ — P বনাম NP প্রশ্ন — থিওরেটিক্যাল কম্পিউটার সায়েন্সের সবচেয়ে বিখ্যাত অমীমাংসিত প্রশ্ন।
- পাঠ ৪৭ — আরও NP-কমপ্লিট প্রবলেম পূর্ববর্তী পাঠ NP-কমপ্লিট প্রবলেমের ক্যাটালগ — এই পাঠের PSPACE-কমপ্লিটনেসের সমান্তরাল ধারণা।
- Data Structures & Algorithms কোর্স সঙ্গী কোর্স অনেক দুই-খেলোয়াড় গেম-সলভিং অ্যালগরিদম (মিনিম্যাক্স, ইত্যাদি) এই পাঠের PSPACE-কমপ্লিট গেম-থিওরি সংযোগের সাথে সরাসরি সম্পর্কিত।