कुशलता से प्रत्येक तत्व के लिए छोटे तत्वों की संख्या ज्ञात करना


9

मैं इस समस्या पर अड़ा हुआ हूं:

एक सरणी दी A पहले का n प्राकृतिक संख्या यादृच्छिक रूप से अनुमत, एक सरणी B का निर्माण किया जाता है, जैसे कि B(k) से तत्वों की संख्या है A(1) सेवा A(k1) जो छोटे हैं A(k)

मैंने दे दिया A क्या तुम खोज सकते हो B में O(n)समय?
ii) दिया गयाB क्या तुम खोज सकते हो A में O(n) समय?

यहाँ, B(1)=0। एक ठोस उदाहरण के लिए:

|A843172965B000031644|

क्या कोई मेरी मदद कर सकता है? धन्यवाद।


मुझे यह मिला: कम्प्यूटिंग परमीशन एन्कोडिंग जो देता हैO(nlogn)इन समस्याओं के लिए एल्गोरिदम। कम से कम मुझे लगता है कि वे वही समस्याएं हैं।
रियल्ज स्लाव

@ मेर्ब्स का कहना है कि हिंट ने आपको दिया है कि आपके पास समाधान है?
एजे

1
@Jed, इसका मतलब है कि मेरे पास एक एल्गोरिथ्म है, हालांकि यह लेता है O(n2) अंतरिक्ष के बिना सरल एल्गोरिथ्म के लिए और O(nlogn)अगर हमें जगह की अनुमति है। फिलहाल, मैं न तो इस ओर झुक रहा हूं और न ही संभव हैO(n)और दोनों एक ही एल्गोरिथ्म है।
मर्ब्स

@Merbs। मुझे लगता है कि आपका इशारा सही रास्ते पर ले जा सकता है। im एक समाधान भी (आपके संकेत के बाद)। मुझे लगता है कि विश्लेषण में एक चाल है जिससे यह जाना जाता हैO(n).. मुझे लगता है कि चाल ज्ञान है A 1 से जाता है:nकेवल।
एजे

2
यह कागज भी ए O(nlogn)कलन विधि। क्या आप सुनिश्चित हैं कि वहां मौजूद हैO(n)इसके लिए एल्गोरिथ्म?
Realz Slaw

जवाबों:


1

निर्धारित करने के लिए भोली एल्गोरिथ्म B से A:

के लिये k=1,,nका मान निर्धारित करें B(k) प्रत्येक की तुलना करके A(i) सेवा A(k) के लिये i=1,,k और उन लोगों की गिनती करना जो संतुष्ट हैं A(i)<A(k)

यह एल्गोरिथम तुलना करता है A(1) अन्य सभी को (n1 बार), A(2) सेवा n2 दूसरों, आदि की तुलना की कुल संख्या है (n1)(n2)2। लेकिन यह सबसे अच्छा नहीं है जो हम कर सकते हैं। उदाहरण के लिए, देख रहे हैंB(n), हमें कोई तुलना नहीं करनी है! B(n)=A(n)1क्योंकि यह पहला है n प्राकृतिक संख्याएं, और इसकी गारंटी है (परमीशन की परवाह किए बिना) कि n1कम प्राकृतिक संख्याएँ होंगी। व्हाट अबाउटB(n1)? बजाय जाँच केA(1) के माध्यम से A(n2), हम सिर्फ जाँच कर सकते हैं A(n)। अर्थात्:

के लिये k=1,,n2, ऊपर एल्गोरिथ्म का उपयोग करें; के लिये k=n2,,n रिवर्स एल्गोरिथ्म का उपयोग करें: निर्धारित करें B(k) शुरू में इसे सेट करके A(n)1 और फिर घटाना 1 प्रत्येक प्रविष्टि के लिए A(i) के लिये i=k+1,,n से कम है A(k)

यह ले जाएगा 2×(n21)(n22)2=(n2)(n4)4 कदम, जो अभी भी है O(n2)। निर्माण में भी ध्यान देंA से B, अगर B(n)=A(n)1 फिर A(n)=B(n)+1

लेकिन अब और अधिक चालाकी के लिए। यदि हमें कुछ अतिरिक्त स्थान या सॉर्ट करने की अनुमति है, तो हम संख्याओं को सॉर्ट कर सकते हैं, क्योंकि हम उनकी तुलना कर रहे हैं। उदाहरण के लिए:

|A843172965S987432165B0000316|

उन सभी की जांच करने के बजाय (या उन्हें क्रम में जांचना), हम प्रत्येक को निर्धारित करने के लिए द्विआधारी खोज का उपयोग कर सकते हैं B(k)। हालाँकि, अभी भी छँटाई में समय लगता हैO(nlogn)


यह सिर्फ मेरा पहला विचार था; हालांकि मुझे एहसास है कि समस्या मूल रूप से मैंने इसे श्रेय दिया था, की तुलना में अधिक दिलचस्प है। और मुझे अभी तक Realz Slaw के निष्कर्षों को पढ़ने का अवसर नहीं मिला है, इसलिए एल्गोरिथ्म बंद हो सकता है।
मेर

0

प्रत्येक को निर्धारित करने के बजाय B(k) एक समय में, हम आगे देख सकते हैं और केवल प्रत्येक संख्या के माध्यम से जा सकते हैं A एक बार ! लेकिन हम उपयोग करेंगेn अंतरिक्ष:

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

We could save even more time by not updating those that have already been determined (that is, there is no point in updating 8 after the first step), but in the worst case, we still have to update (n)(n+2)2 times


0

both I and II are solvable using #next_greater_element that i explained here. but its a little harder than just the problem but before solution you need to learn next greater element:

  1. consider we have a vector for every element of A name it Si for element i. now once run the next greater algorithm starting from right to left but except setting element i in A its next greater element index , push in Si the elements that i is their next greater element.then iterate over the array left to right and then B[i]=j=0x(Si[j]+1) where x is the size of vector Si.and its Θ(n) because each the next greater algorithm is Θ(n) and also iterating is Θ(n)

second part is also similar noting that we can get the value of the rightest element in O(1) EDIT:my solution is wrong it seems that it dont have anyo(n) solution

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