किसी भी सरणी, क्रमबद्ध, रद्द करने के प्रत्येक तत्व को फैक्टरोरिज़ करें। फैक्टरोरिज्ड बाध्य आकार के इंट्स के लिए निरंतर समय है, सॉर्टिंग एन लॉग एन है, और रद्दीकरण रैखिक होगा। हालांकि, स्थिर कारक बड़े हो सकते हैं।
यदि आप निचले एसिम्प्टोटिक जटिलता के बजाय कम वास्तविक निष्पादन समय की कोशिश कर रहे हैं, तो शायद यह 2, 3, 5, और 7 की शक्तियों जैसे मैन्युअल रूप से छोटे कारकों को रद्द करके सरणी को पूर्ववर्ती करने के लिए चोट नहीं पहुंचाएगा। उच्च संभावना (यानी पैथोलॉजिकल इनपुट को छोड़कर), यह कुछ रैखिक-समय के पास की लागत पर, अधिकांश एल्गोरिदम को तेज कर देगा।
उपर्युक्त दृष्टिकोण को एकीकृत करने वाला एक और परिष्कृत विधि, sqrt(10^7) ~= 3162
तक प्राइम्स की एक सूची बनाकर शुरू करना होगा। प्राइम नंबर प्रमेय द्वारा लगभग 3162/ln(3162) ~= 392
ऐसे प्राइम होना चाहिए। (वास्तव में, चलने वाले समय को बचाने के लिए, आप इस तालिका को प्रीकंप्यूट कर सकते हैं।)
फिर, N
में प्रत्येक ऐसे पूर्णांक के लिए, और प्रत्येक प्राइम के लिए, उस प्राइम द्वारा पूर्णांक को कम करें जब तक कि यह समान रूप से विभाजित न हो जाए, और हर बार उस प्राइम के लिए गिनती बढ़ जाती है। D
के लिए वही करें, इसके बदले में कमी। एक बार जब आप प्राइम की मेज से गुजर चुके हैं, तो वर्तमान int गैर-1 होगा और केवल तभी होगा जब यह 3162 से बड़ा हो। यह प्रत्येक सरणी में कुल पूर्णांक का लगभग 7% होना चाहिए। आप इन्हें एक ढेर या somesuch में रख सकते हैं। जैसे ही आप साथ जाते हैं, उन्हें सरणी में भी सेट करें।
अंत में, आप सकारात्मक कारकों से अधिक सक्रिय हो जाते हैं और अपने उत्पाद को एन में डाल देते हैं। आपको शायद इसे एकाधिक सरणी स्लॉट में विभाजित करने की आवश्यकता होगी, जो ठीक है। ऋणात्मक कारकों को डी में रखें, और आप कर चुके हैं!
इस पर रनटाइम मुझे काम करने में एक मिनट लगेगा। उम्मीद है कि यह उचित है।
http://stackoverflow.com/questions/12359785/reducing -इंटर-फ्रैक्शन-एल्गोरिदम-समाधान-स्पष्टीकरण –
सुनिश्चित नहीं है कि आपने उत्तर के लिंक के साथ एक प्रश्न क्यों पोस्ट किया है। –
@ रेमंड चेन: जब मैंने प्रश्न पोस्ट किया था तो मेरे पास समाधान कोड नहीं था, और जब मुझे यह मिला तो समाधान कोड को समझ में नहीं आया, इसलिए स्पष्टीकरण के लिए अलग प्रश्न पोस्ट किया गया और उन्हें अंतःस्थापित किया गया। –