डेटा संरचना की कल्पना करें, जो कुछ संगत कंटेनर में हेरफेर करता है, और इस सरणी के भीतर सूचकांक की संगत श्रेणियों की त्वरित पुनर्प्राप्ति की अनुमति देता है, जिसमें डेटा (और शायद मुफ्त श्रेणियां भी होती हैं) शामिल हैं। आइए इस श्रेणी को "ब्लॉक" कहते हैं। प्रत्येक खंड अपने सिर और पूंछ सूचकांक जानता है: जब हम सरणी से छेड़छाड़तेजी से संगत श्रेणियों के साथ डेटा संरचना पुनर्प्राप्ति
struct Block
{
size_t begin;
size_t end;
}
, हमारे डेटा संरचना अपडेट ब्लॉक:
array view blocks [begin, end]
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 [0, 9]
pop 2 block 1 splitted
0 1 _ 3 4 5 6 7 8 9 [0, 1] [3, 9]
pop 7, 8 block 2 splitted
0 1 _ 3 4 5 6 _ _ 9 [0, 1] [3, 6] [9, 9]
push 7 changed end of block 3
0 1 _ 3 4 5 6 7 _ 9 [0, 1] [3, 7] [9, 9]
push 5 error: already in
0 1 _ 3 4 5 6 7 _ 9 [0, 1] [3, 7] [9, 9]
push 2 blocks 1, 2 merged
0 1 2 3 4 5 6 7 _ 9 [0, 7] [9, 9]
भी रूपरेखा से पहले, हम जानते हैं कि ब्लॉक पुनर्प्राप्ति गति आवेदन प्रदर्शन की आधारशिला हो जाएगा । मूल रूप से उपयोग है:
- बहुत बार सन्निहित ब्लॉक की बहाली
- सबसे अधिक समय हम ब्लॉक की संख्या कम से कम हो (विखंडन को रोकने)
हम क्या करना चाहते हैं पहले से ही करने की कोशिश की:
std::vector<bool>
+std::list<Block*>
। प्रत्येक परिवर्तन पर:vector
पर सही/गलत लिखें, फिर इसे लूप के लिए पार करें औरlist
पुन: उत्पन्न करें। ब्लॉक की हर क्वेरी परlist
लौटाता है। हम चाहते थे से धीमे।std::list<Block*>
अद्यतन सूची सीधे, इसलिए कोई ट्रैवर्सिंग नहीं। वापसी सूची। डीबग/परीक्षण करने के लिए बहुत कोड।
सवाल:
- है कि डेटा संरचना कुछ सामान्य नाम है?
- क्या पहले से ही ऐसे डेटा संरचनाएं लागू की गई हैं (डीबग और परीक्षण)?
- यदि नहीं, तो आप इस तरह की डेटा संरचना के तेज़ और मजबूत कार्यान्वयन पर क्या सलाह दे सकते हैं?
क्षमा करें अगर मेरी व्याख्या बिल्कुल स्पष्ट नहीं है।
संपादित
इस कंटेनर के लिए विशिष्ट आवेदन प्रबंध बफ़र्स है: या तो सिस्टम या GPU स्मृति। जीपीयू के मामले में हम एकल वर्टेक्स बफर में बड़ी मात्रा में डेटा स्टोर कर सकते हैं, और फिर कुछ क्षेत्रों को अपडेट/अमान्य कर सकते हैं। प्रत्येक ड्रॉ कॉल पर हमें बफर में प्रत्येक वैध ब्लॉक की पहली और आखिरी अनुक्रमणिका को पता होना चाहिए (अक्सर, दसवीं से सैकड़ों बार प्रति सेकंड) और कभी-कभी (एक बार एक बार) हमें डेटा के ब्लॉक को सम्मिलित/हटा देना होगा।
एक और एप्लिकेशन एक कस्टम "ब्लॉक मेमोरी आवंटक" है। उस उद्देश्य के लिए, घुसपैठ लिंक्ड सूची के माध्यम से "अलेक्जेंड्रेस्कू ए - मॉडर्न सी ++ डिज़ाइन" पुस्तक में लागू समान डेटा संरचना। मैं बेहतर विकल्पों की तलाश में हूं।
मैंने अक्सर पेड़ या वेक्टर के आधार पर ऐसी "अलग सीमा" प्रकार विकसित करने के बावजूद किया है, लेकिन फिर सुना है कि ऐसी चीज पहले ही बढ़ रही है। –
क्या आपके कंटेनर में श्रेणियां हैं, या इसमें इंडेक्स की अलग-अलग श्रेणियों में डेटा शामिल है? –
हमारे आवेदन में, यह एक साधारण बफर (गतिशील सरणी) पर किसी प्रकार का रैपर होना चाहिए। मैंने GPU बफर उपयोग-केस के साथ संपादन जोड़ा है। सादगी के लिए हम मान सकते हैं कि अंतर्निहित कंटेनर एक 'std :: वेक्टर ' है।बफर इंटरफेस (पढ़ना/लिखना/अपडेट/मार्क फ्री) लागू करना मुश्किल नहीं है, लेकिन हम इस "ब्लॉक" पर फंस गए हैं। – Drop