রূপান্তর শ্রেণিবিন্যাস উপস্থাপনের জন্য দক্ষ কাঠামো


9

ম্যাট্রিকের গাছের উপস্থাপনের জন্য কি কোনও স্মৃতি দক্ষ উপায় প্রস্তাব করতে পারে, উদাহরণস্বরূপ একটি শ্রেণিবিন্যাসের মডেলটিতে?

আমি বিশেষভাবে ডেটা লোকেশন সংরক্ষণ করতে আগ্রহী এবং আমার সন্দেহ হয় যে কাঠামোর অফ অ্যারে (ম্যাট্রিক এবং ম্যাট্রিক্সের সূচকগুলি) টাইপ পদ্ধতির উপযোগী হতে পারে।

পাশাপাশি অনেক শৃঙ্খলিত ম্যাট্রিক্স গণনা, এই কাঠামোটি সম্ভবত মেমরির ক্ষেত্রে একটি মোটামুটি অনুলিপি করা হবে, সুতরাং অবিচ্ছিন্ন স্টোরেজ থাকা একটি বড় বোনাস হবে।

উত্তর:


6

গাছের মতো অ্যারে আমার কাছে বিজয়ের মতো শোনাচ্ছে। আপনার শ্রেণিবিন্যাসের কেবল গভীরতার প্রথম ট্রভারসাল করুন এবং একটি অ্যারে পূরণ করুন; পুনরাবৃত্তির মধ্য দিয়ে রিওয়াইন্ডিং করার সময় আপনি হয় সন্তানের কাছে পরম সূচক সহ পিতামাতাকে আপডেট করতে পারেন বা কেবল ব-দ্বীপ-থেকে-আমাকে করতে পারেন, এবং বাচ্চারা পিতা-মাতার সূচকগুলি যে কোনওভাবে সংরক্ষণ করতে পারে। প্রকৃতপক্ষে, আপনি যদি আপেক্ষিক অফসেট ব্যবহার করেন তবে আপনার চারপাশের মূল ঠিকানাটি বহন করার দরকার নেই। আমি মনে করি কাঠামোটি সম্ভবত এর মতো কিছু হবে

struct Transform
{
   Matrix m; // whatever you like
   int parent;   // index or offset, you choose!
   int sibling;
   int firstchild;
};

... সুতরাং আপনার কীভাবে ভাইবোনদের কাছে যেতে হবে তা জানতে নোডের দরকার আপনার যেহেতু (সহজেই) পরিবর্তনশীল আকারের কাঠামো থাকতে পারে না। যদিও আমি অনুমান করি আপনি যদি ট্রান্সফর্ম অফসেটের পরিবর্তে বাইট অফসেট ব্যবহার করেন তবে আপনার প্রতি রূপান্তর প্রতি শিশুদের পরিবর্তনশীল সংখ্যা থাকতে পারে:

struct Transform
{
   Matrix m; // whatever you like
   int parent;  // negative byte offest
   int numchildren;
   int child[0]; // can't remember if you put a 0 there or leave it empty;
                 // but it's an array of positive byte offsets
};

... তারপরে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি ক্রমাগত ট্রান্সফর্মগুলি সঠিক জায়গায় রেখেছেন।

এম্বেড থাকা শিশু "পয়েন্টার" দিয়ে আপনি কীভাবে একটি সম্পূর্ণ স্ব-অন্তর্ভুক্ত গাছ তৈরি করবেন তা এখানে।

int BuildTransforms(Entity* e, OutputStream& os, int parentLocation)
{
    int currentLocation = os.Tell();

    os.Write(e->localMatrix);
    os.Write(parentLocation);
    int numChildren = e->GetNumChildren();
    os.Write(numChildren);

    int childArray = os.Tell();
    os.Skip(numChildren * sizeof(int));
    os.AlignAsNecessary();  // if you need to align transforms

    childLocation = os.Tell();
    for (int i = 0; i < numChildren; ++i) {
        os.Seek(childArray + (i * sizeof(int)));
        os.Write(childLocation);
        os.Seek(childLocation);
        childLocation = BuildTransforms(e->GetChild(i), os, currentLocation);
    }

    return os.Tell();
}

void BuildTransforms(Entity* root)
{
    OutputStream os;
    BuildTransforms(root, os, -1, 0);
}

(আপনি যদি আপেক্ষিক অবস্থানগুলি সঞ্চয় করতে চান - currentLocationতবে দুটি "অবস্থান" লেখায় কেবল যুক্ত করুন ))


আমরা যদি সি ++ এর সাথে কথা বলি তবে আপনার সন্তানের অ্যারের জন্য আপনাকে একটি আকার নির্দিষ্ট করতে হবে বা রানটাইম এ মেমরি বরাদ্দ দিয়ে এটি তৈরি করতে হবে।
দশ

সরকারী C99- অনুমোদিত উপায় হ'ল অ্যারের আকারের বিশদটি খালি ছেড়ে দেওয়া।

@ টেনপেন- ধারণাটি হ'ল আপনার একটি উদ্দেশ্য নির্মিত বাফার রয়েছে। পুরো বিষয়টি অতিরিক্ত বরাদ্দ এড়ানো ; আপনি অ্যারের আকারটি নির্দিষ্ট করতে পারবেন না কারণ আপনি জানেন না যে এটি কতটা বড় হবে। আপনি নাম্বার শিশুদের লেখার পরে, আপনার সন্তানের অ্যারেতে লিখুন, তবে তারপরে পরবর্তী ট্রান্সফর্মটি শিশু অ্যারে শেষ হওয়ার পরে শুরু হয়। (এই কারণেই আপনাকে এই কাঠামোর জন্য বাইট অফসেটগুলি ব্যবহার করতে হবে এবং সূচকগুলি ব্যবহার করার প্রয়োজন নেই; আপনি জানেন না যে প্রতিটি এন্ট্রি কতটা বড়, তবে এটি এখনও পেরোনোর ​​পক্ষে দক্ষ এবং এটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত যাতে এটি ইউনিট হিসাবে চলতে পারে))
ড্যাশ -টম-ব্যাং

1
একে বলা হয় "স্ট্রাক হ্যাক"। আরও দেখুন: informit.com/guides/content.aspx?g=cplusplus&seqNum=288
Neverender

1
@tenpn একা পরিবর্তনশীল দৈর্ঘ্যের স্ট্রোকগুলি। যথাযথভাবে ব্যবহার করা হলে তারা গাদা বরাদ্দের সংখ্যা অর্ধেক করতে পারে।

1

ম্যাট্রিকের অ্যারেতে সূচকগুলি সম্ভবত সবচেয়ে সোজা ফরোয়ার্ড, মেমরির দক্ষ পদ্ধতির হতে পারে।

লাইফের মধ্যে পয়েন্টার বা পূর্ণসংখ্যা বা অন্যান্য ছোট কাঠামোর সিরিজ হিসাবে ম্যাট্রিক্স অ্যারেতে রূপান্তরগুলির একটি শৃঙ্খলা অনুষ্ঠিত হতে পারে। এটি অপ্রয়োজনীয় ম্যাট্রিকগুলি সঞ্চয় করতে এবং ডেটা অ্যাক্সেসর কোড থেকে ডেটা স্টোরেজ কোড পৃথক করতে সহায়তা করবে।

আপনার ট্রান্সফর্ম চেইনটি সংরক্ষণ বা ফিরে খেলতে শেষ পর্যন্ত আপনি কেবল LIFO থেকে সূচক মানগুলিকে চাপুন এবং পপ করবেন।

আপনি যদি নিজের ম্যাট্রিক্স স্ট্রাকচারে ট্রান্সফর্ম টাইপ ... রোটেশন, ট্রান্সলেশন ইত্যাদি ধারণ করতে পারেন তবে আপনি সামান্য স্মৃতিও সঞ্চয় করতে সক্ষম হবেন অন্যথায় এই টাইপটি আরও সম্ভাব্য সদৃশতার ফলে সূচীতে সংরক্ষণ করা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.