मैं हाल ही में अजगर में कुछ कार्य हल करने की कोशिश कर रहा था और मैं समाधान हे की जटिलता के लिए लगता है कि मिल गया है (एन एन लॉग इन करें) गिनती है, लेकिन मैं इस पर विश्वास कुछ इनपुट के लिए बहुत अक्षम है (जैसे पहला पैरामीटर 0
और pairs
शून्य की बहुत लंबी सूची होने के कारण)।नेस्टेड छोरों सपाट/घटते जटिलता - पूरक जोड़े एल्गोरिथ्म
इसमें for
लूप के तीन स्तर भी हैं। मेरा मानना है कि यह अनुकूलित किया जा सकता है, लेकिन इस समय मैं इसे और अधिक अनुकूलित नहीं कर सकते, मैं शायद अभी-अभी कुछ स्पष्ट याद आ रही है;)
तो, मूल रूप से, समस्या इस प्रकार है:
पूर्णांक को देखते हुए सूची (
values
), समारोह अनुक्रमित 'जोड़े निम्नलिखित शर्त पूरी करने की संख्या वापस जाने के लिए की जरूरत है:
- , मान लें एक सूचकांक जोड़ी
तो(index1, index2)
की तरह एक टपल है की सुविधा देता हैvalues[index1] == complementary_diff - values[index2]
मैं सच है,उदाहरण: हैं
[1, 3, -4, 0, -3, 5]
values
के रूप में और1
complementary_diff
के रूप में की तरह एक सूची दी, समारोह4
लौटना चाहिए (जो अनुक्रमित 'जोड़े की निम्न सूची की लंबाई है:[(0, 3), (2, 5), (3, 0), (5, 2)]
)। जैसा कि मैंने कहा - - कुछ मामलों में यह इसकी जटिलता के सन्निकटन O (n लॉग ऑन n के बावजूद बहुत धीरे धीरे चला सकते हैं,
यह वही है मैं अब तक है, यह पूरी तरह से समय की सबसे काम करना चाहिए, लेकिन है) (ऐसा लगता है कि निराशावादी जटिलता ओ (एन^2)) है।
def complementary_pairs_number (complementary_diff, values):
value_key = {} # dictionary storing indexes indexed by values
for index, item in enumerate(values):
try:
value_key[item].append(index)
except (KeyError,): # the item has not been found in value_key's keys
value_key[item] = [index]
key_pairs = set() # key pairs are unique by nature
for pos_value in value_key: # iterate through keys of value_key dictionary
sym_value = complementary_diff - pos_value
if sym_value in value_key: # checks if the symmetric value has been found
for i1 in value_key[pos_value]: # iterate through pos_values' indexes
for i2 in value_key[sym_value]: # as above, through sym_values
# add indexes' pairs or ignore if already added to the set
key_pairs.add((i1, i2))
key_pairs.add((i2, i1))
return len(key_pairs)
दिया उदाहरण के लिए यह है कि तरह बर्ताव करता है:
>>> complementary_pairs_number(1, [1, 3, -4, 0, -3, 5])
4
आप देखते हैं कि कैसे कोड "चपटा" किया जा सकता है या "सरल", मुझे पता है करें।
मुझे यकीन नहीं है कि सिर्फ complementary_diff == 0
आदि की जांच करना सबसे अच्छा तरीका है - यदि आपको लगता है कि कृपया मुझे बताएं।
संपादित करें: मैंने उदाहरण को सही किया है (धन्यवाद, unutbu!)।
अगर कुछ पर्याप्त स्पष्ट नहीं है या यदि आपके कुछ प्रश्न हैं, तो कृपया उनसे पूछें - शायद मैं अपना प्रश्न सुधार सकता हूं :) – Tadeck
मुझे लगता है कि आपके उदाहरण में 'key_pairs'' सेट है ([(3, 0), (0 , 3), (5, 2), (2, 5)]) '(5 नोट, 4 नहीं)। हाँ? – unutbu
@unutbu: आप सही हैं, धन्यवाद! मैंने सवाल संपादित किया है। – Tadeck