संख्यात्मक एल्गोरिदम में संख्याओं का एकात्मक प्रतिनिधित्व क्यों नहीं लिया जाता है?


15

एक छद्म-बहुपद समय एल्गोरिथ्म एक एल्गोरिथ्म है जिसमें इनपुट मूल्य (परिमाण) पर बहुपद चल रहा है लेकिन इनपुट आकार (बिट्स की संख्या) पर घातांक समय चल रहा है।

उदाहरण के लिए कि नंबर n प्राइम है या नहीं, इसके लिए 2 से तक के नंबरों के माध्यम से लूप की आवश्यकता होती है n1और जांचें कि क्या n mod i शून्य है या नहीं। यदि मॉड O (1) समय लेता है, तो समग्र समय जटिलता O (n) होगी।

लेकिन अगर हम x को इनपुट लिखने के लिए आवश्यक बिट्स की संख्या होने देते हैं तो x=logn (बाइनरी) इसलिए n=2x और समस्या का रनिंग समय O ( 2x ) होगा जो घातांक है।

मेरा प्रश्न है, अगर हम इनपुट निरूपण पर विचार करते हैं n, तो हमेशा x=n और फिर छद्म-बहुपद समय बहुपद समय जटिलता के बराबर होगा। तो हम ऐसा कभी क्यों नहीं करते?

इसके अलावा, वहाँ एक छद्म बहुपद समय एल्गोरिथ्म के लिए है knapsack, लेने से x=n, knapsack बहुपद होगा परिणामस्वरूप पी = एनपी


3
दरअसल, हम ऐसा करते हैं, बस अक्सर नहीं। समान कारणों से हम आम तौर पर एकात्मक भाषाओं से नहीं निपटते हैं, लेकिन इन जानवरों से संबंधित कई दिलचस्प परिणाम हैं। क्या आपने इस पर ध्यान दिया है?
आंद्रे सूजा लेमोस 18

2
हां, यदि आप आकार और परिमाण के बीच के अंतर को दूर कर लेते हैं, तो आप उन सभी अवधारणाओं को खो देते हैं जो उस अंतर पर पहले से बताई गई हैं।
एंड्रे सूजा लेमोस

7
क्योंकि यह दानव को एक अच्छी पोशाक में डाल रहा है। यह कुछ भी तेज नहीं करता है, यह केवल "रनिंग टाइम जटिलता" को अर्थहीन बनाता है।
राफेल

4
@Drupalist यूनीरी नॅकैपैक समस्या को वास्तव में NP- पूर्ण नहीं कहा जाता है क्योंकि नॅकैपैक समस्या में सामान्य कमी यह मानती है कि बाइनरी में नंबर लिखे गए हैं। यदि आप मानक कमी करने की कोशिश करते हैं, लेकिन संख्याओं को एकात्मक में लिखते हैं, तो कमी को बहुपद समय में गणना नहीं की जा सकती है। नतीजतन, बहुपत्नी समय में एकांतप्रिय समस्या होने का मतलब यह नहीं होगा कि पी = एनपी।
टेम्प्लेटेटिपेडेफ

2
आप विशेष रूप से इस एक में छद्म-बहुपद टैग किए गए अन्य उत्तरों की जांच करना चाहते हैं ।
राफेल

जवाबों:


17

इसका मतलब यह है कि यूनीरी knapsack P में है। इसका मतलब यह नहीं है कि knapsack (बाइनरी-एन्कोडेड संख्या के साथ) P में है।

नैकपैक एनपी-पूर्ण होने के लिए जाना जाता है। यदि आपने दिखाया है कि knapsack P में है, तो वह P = NP दिखाएगा।

लेकिन आपने यह नहीं दिखाया है कि knapsack P में है। आपने दिखाया है कि unary knapsack P में है। हालांकि, unary knapsack को NP-complete नहीं जाना जाता है (वास्तव में, मानक संदेह यह है कि यह सबसे अधिक संभावना है कि NP- पूर्ण नहीं है। )। इसलिए, पी में एकसमान नैकपैक लगाने का मतलब यह नहीं है कि पी = एनपी।


तो हमें कौन सी समस्या के बारे में अधिक ध्यान देना चाहिए, नैकपैक या अनियारी नैकपैक? यदि आपकी प्रेरणा व्यावहारिक चिंताओं पर आधारित है, तो उत्तर उन संख्याओं के आकार पर निर्भर करेगा, जिनके लिए आप नॅप्सैक समस्या को हल करना चाहते हैं: यदि वे बड़े हैं, तो आप निश्चित रूप से नॅाॅपैक की तुलना में नैकपैक की अधिक देखभाल करते हैं। यदि आपकी प्रेरणा सैद्धांतिक चिंताओं पर आधारित है, तो निपटा यकीनन अधिक दिलचस्प है, क्योंकि यह हमें एक गहरी समझ प्राप्त करने की अनुमति देता है - यह हमें आकार बनाम परिमाण के बीच का अंतर बनाने की अनुमति देता है - जबकि एकरी नैकपैक हमें यह अंतर बनाने से रोकता है।


नैकपैक समस्या के लिए डायनामिक प्रोग्रामिंग एल्गोरिथ्म के बारे में अनुवर्ती प्रश्न का उत्तर देने के लिए:

हाँ, एक ही गतिशील प्रोग्रामिंग एल्गोरिथ्म दोनों knapsacks और unary knapsack पर लागू किया जा सकता है। इसका चलने का समय संख्याओं के परिमाण में बहुपद है, लेकिन बाइनरी में एन्कोड किए जाने पर संख्या की लंबाई में घातीय (बहुपद नहीं) है। इस प्रकार, अपने चलने का समय है इनपुट की लंबाई में बहुपद जब इनपुट एकल में एन्कोड लेकिन है नहीं जब इनपुट बाइनरी में एन्कोड किया गया है इनपुट की लंबाई में बहुपद। के कारण है कि हम यही करते हैं पर विचार इस गतिशील प्रोग्रामिंग एल्गोरिथ्म एकल नैपसैक के लिए एक बहुपद समय एल्गोरिथ्म हो सकता है, लेकिन नहीं है इसके लिए (बाइनरी एन्कोड) नैपसैक एक बहुपद समय एल्गोरिथ्म मानते हैं।

स्मरण करो कि हम कहते हैं कि एक एल्गोरिथ्म बहुपद समय में चलता है यदि इसका चलने का समय इनपुट की लंबाई के कुछ बहुपदों में होता है, बिट्स में


1
बहुत-बहुत धन्यवाद, मुझे नहीं पता था कि एक ही एल्गोरिथ्म की एकता और गैर-एकता की जटिलता अलग हो सकती है। स्टैंडर्ड नॅप्सैक के डायनामिक प्रोग्रामिंग सॉल्यूशन को एकतरफा नैकपैक पर क्यों नहीं लागू किया जा सकता है, और यह जटिलता के विभिन्न वर्ग को जन्म देता है? मुझे समस्याओं के एकात्मक संस्करण को समझने में समस्या हो रही है।
एम एम डी

@ चिकित्सक, मैंने उस प्रश्न का उत्तर देने के लिए अंत में दो पैराग्राफ जोड़ने के लिए अपना उत्तर संपादित किया है।
DW

x=n

x=n

1
@NikosM।, ठीक है, मिल गया। प्रतिक्रिया के लिए धन्यवाद। निजी तौर पर, मुझे विश्वास नहीं है कि बयान गलत है, इसलिए मैं इसे छोड़ने जा रहा हूं। (मेरा तर्क: इनपुट की लंबाई प्रतिनिधित्व की पसंद पर निर्भर करती है, इसलिए मुझे विश्वास नहीं है कि आपने जो कुछ भी लिखा है उसका खंडन करें।) हालांकि यह पूरी तरह से संभव है कि मेरा दृष्टिकोण बहुत संकीर्ण हो सकता है, या इससे अधिक विस्तृत विवरण या स्पष्टीकरण हो सकता है। एक अलग दृष्टिकोण मूल्य जोड़ सकता है। यदि आपको लगता है कि यह उत्तर स्पष्ट हो सकता है, तो एक अतिरिक्त उत्तर लिखने के लिए स्वतंत्र महसूस करें या एक संपादन का सुझाव दें।
डीडब्ल्यू

6

मैं डीडब्ल्यू के जवाब में एक छोटी सी बात जोड़ूंगा:

मैंने ऐसे लोगों को देखा है जो सोचते हैं कि चूँकि Unary Knapsack P में है इसलिए हम इसका उपयोग Knapsack के स्थान पर कर सकते हैं जिसमें सबसे अच्छा वर्तमान एल्गोरिदम का घातीय समय है।

W={w1,,wn}kO(nk)

O(nk)

यदि आप अलगाव में किसी समस्या की परवाह करते हैं तो आप ऐसा कर सकते हैं। दरअसल यही वह है जो एल्गोरिदम में लोग अक्सर करते हैं। ग्राफ़ एल्गोरिदम की जटिलता अक्सर संख्या के कोने और किनारों की संख्या के संदर्भ में व्यक्त की जाती है, न कि उन्हें कोड करने वाले स्ट्रिंग के आकार की।

लेकिन यह तभी है जब हम एक अलग समस्या से निपट रहे हैं। यह उपयोगी नहीं है जब हम विभिन्न प्रकार के इनपुट के साथ समस्याओं से निपट रहे हैं। रेखांकन के लिए हम समय संख्या और कोने और किनारों की संख्या के बारे में बात कर सकते हैं। Knapsack के लिए हम आइटमों की संख्या और Knapsack के आकार के बारे में बात कर सकते हैं। लेकिन क्या होगा अगर हम दोनों के बारे में बात करना चाहते हैं? उदाहरण के लिए, जब हम समस्याओं के बीच कटौती करना चाहते हैं, या समस्याओं के वर्ग पर चर्चा करते हैं, जिसमें मनमानी समस्याएं शामिल हैं, न कि केवल इनपुट के रूप में एक ग्राफ के साथ। हमें इनपुट का एक सार्वभौमिक पैरामीटर चाहिए। सामान्य रूप से एक इनपुट सिर्फ एक स्ट्रिंग है, यह हम है जो अपने प्रतीकों को एकात्मक संख्याओं, द्विआधारी संख्याओं, रेखांकन आदि के रूप में व्याख्या करता है। एल्गोरिथ्म की जटिलता और समस्याओं के सामान्य सिद्धांत को विकसित करने के लिए हमें इनपुट के एक सामान्य पैरामीटर की आवश्यकता होती है। इनपुट का आकार एक स्पष्ट विकल्प है और यह काफी मजबूत निकला है कि हम इसके ऊपर एक उचित सिद्धांत का निर्माण कर सकते हैं। यह एकमात्र संभावना नहीं है। एक कृत्रिम के लिए हम एक सिद्धांत पर आधारित निर्माण कर सकते हैं2

k100100k21001kk21001

nnp(n)kp(n)k2p(n)1kk

nk


बहुत बहुत धन्यवाद, एक और सवाल, इनपुट को इसकी एकात्मक प्रतिनिधित्व में परिवर्तित करके यह निर्धारित करने की समस्या का क्या होगा कि कोई संख्या प्रधान है या नहीं? यह समस्या इनपुट परिमाण पर आधारित बहुपद है लेकिन इनपुट बिट्स पर आधारित घातांक (जैसा कि मैंने प्रश्न में बताया है), क्या यह रूपांतरण कुछ बेहतर बना देगा?
एम अमा डी

nO(n)nb=210241210241210241
केवह

अच्छी तरह से स्पष्टीकरण, हालांकि DW के उत्तर के तहत मेरी टिप्पणी पर एक नज़र डालते हैं जो इस पोस्ट से संबंधित है
निकोस एम।

2

संक्षिप्त और सरल में, मैं आपको दिखाऊंगा कि क्यों।

Tally

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

xxO(2n)

Tally/UnaryO(n)x

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

इनपुट प्रतिनिधित्व कोड को तेजी से नहीं चलाता है। भले ही दूसरा एल्गोरिथ्म वास्तव में पॉली-टाइम हो। आरएसए के कारकों को खोजने में यह बहुत व्यावहारिक नहीं है।


अच्छा उदाहरण, धन्यवाद
एम एम डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.