एक सममित वास्तविक मैट्रिक्स को देखते हुए , क्या एक एल्गोरिथम है जो योग गणना करता है सभी 1 \ leq i <j <k \ leq n समय-जटिलता के साथ O (n ^ 3) से बेहतर है ?
एक सममित वास्तविक मैट्रिक्स को देखते हुए , क्या एक एल्गोरिथम है जो योग गणना करता है सभी 1 \ leq i <j <k \ leq n समय-जटिलता के साथ O (n ^ 3) से बेहतर है ?
जवाबों:
समय में काम करने वाले काफी व्यावहारिक दृष्टिकोण मौजूद है , जहां प्रोसेसर शब्द में बिट्स की संख्या है। मुख्य विचार यह है कि आप मैट्रिक्स के तत्वों पर बढ़ते क्रम में एक-एक करके पुनरावृत्ति करते हैं (मनमाने ढंग से संबंध तोड़ते हैं) और "उन्हें स्विच करें"। उस क्षण पर विचार करें जब कुछ ट्रिपल का सबसे बड़ा तत्व चालू है। सरलता के लिए, मान हैं कि उक्त तत्व । जब अंतिम तत्व स्विच किया जाता है, तो उत्तर में ट्रिपल के मूल्य को जोड़ना स्वाभाविक है। इसलिए हमें संभावित की संख्या को गिनना होगा जैसे औरपहले से ही चालू हैं (जो कि की संख्या होगी, यहां सबसे बड़ा तत्व है, इसलिए उन्हें अभी-अभी पूरी तरह से स्विच किया गया था)। यहां हम बिट ऑप्टिमाइज़ेशन का उपयोग करके भोले कार्यान्वयन को गति दे सकते हैं ।
अधिक जानकारी के लिए आप C ++ 11 निम्नलिखित कार्यान्वयन कि लिए काम करना चाहिए का उल्लेख कर सकते , (यह बहुत अनुकूलित नहीं है; हालांकि, यह अभी भी लिए बड़े अंतर से कम से कम मेरी मशीन पर बड़े अंतर से धड़कता है )।
// code is not very elegant,
// but should be understandable
// here the matrix a has dimensions n x n
// a has to be symmetric!
int64_t solve (int n, const vector<vector<int32_t>> &a)
{
std::vector<boost::dynamic_bitset<int64_t>> mat
(n, boost::dynamic_bitset<int64_t>(n));
vector<pair<int, int>> order;
for (int j = 1; j < n; j++)
for (int i = 0; i < j; i++)
order.emplace_back(i, j);
sort(order.begin(), order.end(),
[&] (const pair<int, int> &l, const pair<int, int> &r)
{return a[l.first][l.second] < a[r.first][r.second];});
int64_t ans = 0;
for (const auto &position : order)
{
int i, j;
tie (i, j) = position;
mat[i][j] = mat[j][i] = 1;
// here it is important that conditions
// mat[i][i] = 0 and mat[j][j] = 0 always hold
ans += (mat[i] & mat[j]).count() * int64_t(a[i][j]);
}
return ans;
}
यदि आप बिट ऑप्टिमाइज़ेशन धोखा का उपयोग करने पर विचार करते हैं, तो आप एक ही परिणाम के लिए चार रूसी विधि का उपयोग कर सकते हैं, एक एल्गोरिथ्म, जो कम व्यावहारिक होना चाहिए (क्योंकि अधिकांश आधुनिक हार्डवेयर पर बहुत बड़ा है) लेकिन सैद्धांतिक रूप से बेहतर है। वास्तव में, हम चुनते हैं और मैट्रिक्स की प्रत्येक पंक्ति को पूर्णांक से से , जहाँ -th संख्या है सरणी पंक्ति के बिट्स से मेल खाती है जिसमें समावेशी से लेकर में अनन्य है-indexation। हम समय में इस तरह के हर दो ब्लॉक के अदिश उत्पादों को पहले से तैयार कर सकते हैं । मैट्रिक्स में एक स्थिति अपडेट करना तेज़ है क्योंकि हम केवल एक पूर्णांक बदल रहे हैं। पंक्तियों के अनुरूप और पंक्तियों के स्केलर उत्पाद को खोजने के लिए, उस पंक्तियों के अनुरूप सरणियों पर तालिका में संबंधित ब्लॉकों के स्केलर उत्पादों को देखें और प्राप्त उत्पादों को योग करें।
उपरोक्त अनुच्छेद पूर्णांकों के साथ कि आपरेशन मान लिया गया है ले समय। यह काफी आम धारणा है , क्योंकि यह आमतौर पर एल्गोरिदम की तुलनात्मक गति को नहीं बदलता है (उदाहरण के लिए, यदि हम उस धारणा का उपयोग नहीं करते हैं, तो ब्रूट बल विधि वास्तव में समय में काम करती है (यहाँ हम बिट संचालन में समय को मापते हैं) यदि पूर्ण मान के साथ पूर्णांक मानों को कम से कम कुछ निरंतर (और अन्यथा हम साथ समस्या को हल कर सकते हैं मैट्रिक्स गुणन वैसे भी); हालाँकि उपरोक्त चार रूसी पद्धति का उपयोग करता है उस स्थिति में आकार संख्या के साथ संचालन ; इसलिए यह बिट ऑपरेशंस बनाता है , जो मॉडल के परिवर्तन के बावजूद जानवर बल से बेहतर है)।
अस्तित्व के बारे में प्रश्न अभी भी दिलचस्प है, हालांकि।
इस उत्तर में प्रस्तुत तकनीक (बिट ऑप्टिमाइज़ेशन और चार रूसी विधि) मूल माध्यम से नहीं हैं और प्रदर्शनी की पूर्णता के लिए यहां प्रस्तुत हैं। हालांकि, उन्हें लागू करने का एक तरीका खोजना तुच्छ नहीं था।
mat[i]
mat[j]
mat
जो महत्वपूर्ण प्रतीत होता है। मैं समझता हूं कि इसे कैसे परिभाषित किया जा सकता है, लेकिन मुझे आश्चर्य है कि अगर (mat[i] & mat[j]).count()
यह किसी एसटीएल कंटेनर के साथ वांछित होगा।
mat
- मुझे लगता है कि हमें इसका उपयोग करना चाहिए std::vector<boost::dynamic_bitset<int64_t>>
।
mat
: हाँ, मेरे पास वास्तव में मानक बिटसेट था, लेकिन boost::dynamic_bitset
इस मामले में और भी बेहतर है, क्योंकि इसके आकार को संकलन-समय स्थिर नहीं होना है। इस विवरण को जोड़ने और चार रूसी दृष्टिकोण को स्पष्ट करने के लिए उत्तर को संपादित करेंगे।