के लिए संरचना मैं, जिसमें कारों के साथ एक मैट्रिक्स (1 = BlueCar, 2 = रेडकार, 0 = खाली) संग्रहीत किया जाता है एक फ़ाइल को पढ़ने के लिए।कुशल (समय और स्थान जटिलता) डेटा घने और विरल मैट्रिक्स
मैं करने की जरूरत है कि रास्ते में मैट्रिक्स की कारों स्थानांतरित करने के लिए एक एल्गोरिथ्म लिखें:
- नीले ले जाने नीचे;
- लाल वालों को दाएं पर ले जाएं;
- एक बारी जिसमें सभी नीले ले जाएँ और सभी लाल लोगों को स्थानांतरित करने के लिए एक बारी है।
से पहले फ़ाइल पढ़ा है मैं मैट्रिक्स आकार को जानते हैं और अगर यह घने या विरल है नहीं है, इसलिए मैं दो डाटा संरचनाओं (घना के लिए और एक विरल के लिए) और दो एल्गोरिथम को लागू करना है।
मैं सबसे अच्छा समय और स्थान जटिलता संभव तक पहुँचने के लिए की जरूरत है।
अज्ञात मैट्रिक्स आकार के कारण, मुझे लगता है कि ढेर पर डेटा स्टोर करना है।
मैट्रिक्स घने है, तो मैं की तरह कुछ का उपयोग करने के बारे में सोच: इस संरचना के साथ
short int** M = new short int*[m];
short int* M_data = new short int[m*n];
for(int i=0; i< m; ++i)
{
M[i] = M_data + i * n;
}
मैं स्मृति का एक सन्निहित अंतरिक्ष आवंटित कर सकते हैं और यह भी M[i][j]
के साथ पहुँचा जा करने के लिए सरल है।
अब समस्या संरचना विरल मामले के लिए चयन करने के लिए है, और मैं यह भी विचार करने के लिए कैसे मैं सबसे आसान तरीका में एल्गोरिथ्म के माध्यम से कारों स्थानांतरित कर सकते हैं है: उदाहरण के लिए जब मैं एक कार का मूल्यांकन, मैं करने की जरूरत है अगर अगली स्थिति (नीचे या दाएं) में आसानी से मिल जाए तो एक और कार है या यदि यह खाली है।
शुरू में मैं BlueCar और रेडकार वस्तुओं है कि आम कार वस्तु से विरासत को परिभाषित करने के बारे में सोचा। इस वस्तुओं में मैं मैट्रिक्स निर्देशांक बचा सकता है और फिर उन्हें में डाल दिया:
vector< tuple< row, column, value >> sparseMatrix
लेकिन खोजने क्या में अगले स्थिति अभी भी बना हुआ है की समस्या:
std::vector<BluCar> sparseBlu;
std::vector<RedCar> sparseRed;
अन्यथा मैं की तरह कुछ कर सकते हैं।
शायद यह यह करने के लिए सबसे अच्छा तरीका नहीं है, इसलिए मैं एक कुशल तरीके से विरल मामला कैसे लागू कर सकते हैं? (यह भी विरल के लिए एक अनूठा संरचना का उपयोग)
मैं बस आगे डाल करने के लिए std :: नक्शा, मूल्य> चाहते हैं। –
user2672165
यह प्रश्न वास्तव में एक्सेस गति (और कम कैश मिस) रखने के लिए एक भारी शोध क्षेत्र है लेकिन स्मृति को नीचे रखें। यहां विभिन्न [स्पैस स्टोरेज स्कीम] देखें (https://en.wikipedia.org/wiki/Sparse_matrix#Storing_a_sparse_matrix)। यह वास्तव में आपके मैट्रिक्स पर निर्भर करता है। क्या यह सममित है?बैंड-चौड़ाई क्या है? क्या आप इसे पुन: व्यवस्थित कर सकते हैं? आदि कोड के लिए सरल होने के कारण अधिक लोकप्रिय में से एक लेकिन बहुत ही प्रदर्शनकर्ता [येल स्टोरेज स्कीम] है (https://en.wikipedia.org/wiki/Sparse_matrix#Yale) उर्फ "वास्तव में स्पैस स्टोरेज स्कीम" – CoryKramer
@ CoryKramer तत्व एक कार की स्थिति का प्रतिनिधित्व करने लगते हैं। कारें स्थानांतरित कर सकती हैं। समरूपता की प्रतीत नहीं होती है .... – user2672165