অপরিবর্তনীয় রাজ্যগুলির সাথে দক্ষতার সাথে অবজেক্ট-গ্রাফের রূপান্তর উপস্থাপন করা কি সম্ভব?


12

আমি সি ++ তে অপরিবর্তনীয় বস্তুর ব্যবহার অনুশীলন করছি। আমার ব্যক্তিগত লক্ষ্যটি অপরিবর্তনীয় গ্রাফের ক্রম সহ জেনেরিক অবজেক্ট গ্রাফকে (হিপগুলিতে) উপস্থাপন করছে।

মাল্টি-ভার্সন গ্রাফ নিজে তৈরি করা তেমন শক্ত নয়। সমস্যা হল পারফরম্যান্স। ব্রুট-ফোর্স সংস্করণটির গ্রাফের সম্পূর্ণ অনুলিপি প্রয়োজন এবং এটি গ্রহণযোগ্য ছিল না।

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

যতদূর আমি কল্পনা করতে পারি, অপরিবর্তনীয় রাজ্যগুলির সাথে অবজেক্ট গ্রাফের রূপান্তর উপস্থাপনের জন্য কোনও কার্যকরী উপায় নেই। তাই আমি এই সম্পর্কে কিছু ধারণা জিজ্ঞাসা করছি।

অপরিবর্তনীয় রাষ্ট্রের সাথে কী দক্ষতার সাথে অবজেক্ট গ্রাফের রূপান্তর উপস্থাপন করা সম্ভব?


1
এটি কেবলমাত্র জটিল কারণ আপনি নোডগুলিতে প্রান্তগুলি রাখছেন। আপনি যদি বহিরাগতভাবে প্রান্তগুলি কোনও অপরিবর্তনীয় সংগ্রহে সংরক্ষণ করেন তবে এটি সহজ হবে।
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ আমি যদি সংলগ্ন তালিকা ব্যবহার করি তবে আমাকে প্রতিটি বারের জন্য প্রতিটি প্রান্ত অনুসন্ধান করতে হবে। সুতরাং আমি মনে করি এটি পড়ার এবং লেখার পারফরম্যান্সের মধ্যে বাণিজ্য off
ইনিল

1
এটি তালিকা হতে হবে না।
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ আপনি বি গাছের মতো কিছু বলতে চান?
ইনিল

2
বি-গাছের মতো বিস্তৃত গাছগুলি ব্যবহারের ঝোঁক থাকে যখন স্টোরেজের মাধ্যমটিতে বিলম্ব হয়। এই ক্ষেত্রে, আপনি সংকীর্ণ কিছু সহকারে ভাল হতে পারেন, তবে হ্যাঁ, এক ধরণের সুষম অনুসন্ধান গাছ একটি ভাল ধারণা হবে।
ড্যান_ ওয়াটারওয়ার্থ

উত্তর:


11

আপনি যা খুঁজছেন তাকে পার্সেন্ট্যান্ট ডেটা স্ট্রাকচার বলে। ক্রমাগত ডাটা স্ট্রাকচার জন্য ক্যানোনিকাল রিসোর্স ক্রিস Okasaki বই হয় বিশুদ্ধরূপে ক্রিয়াগত ডেটা কাঠামো । ক্লোজ্যুর এবং স্কালায় জনপ্রিয় হওয়ার কারণে অবিচ্ছিন্ন ডেটা স্ট্রাকচারগুলি সাম্প্রতিক সময়ে আগ্রহগুলি সংগ্রহ করেছে।

যাইহোক, কিছু অদ্ভুত কারণে, প্যাসিস্ট্যান্ট গ্রাফগুলি বেশিরভাগ উপেক্ষা করা হবে বলে মনে হয়। আমাদের কাছে তালিকাগুলি, বিভিন্ন ধরণের গাছ, অ্যারে, অগ্রাধিকারের সারি, মানচিত্র রয়েছে তবে গ্রাফ নেই।

আমি সত্যিই কেবল একটি কাগজ পেয়েছি: সম্পূর্ণরূপে ক্রমাগত গ্রাফ - কোনটি চয়ন করবেন?


4

যদি আপনি বস্তুগুলির মধ্যে সংযোগগুলি আপনার সংস্করণিত সংস্থার অংশ হিসাবে বিবেচনা না করেন (এবং আপনি সম্ভবত - যা ক্ষেত্রে নিম্নলিখিতটি সম্ভবত খুব বেশি সহায়তা করে না), আপনি আপনার বস্তুগুলিকে এমন অংশে বিভক্ত করার বিষয়টি বিবেচনা করতে পারেন যা সংযোগ অংশের প্রতিনিধিত্ব করে অবজেক্ট এবং এমন একটি অংশ যা অপরিবর্তনীয় অবস্থার প্রতিনিধিত্ব করে।

তারপরে আপনার প্রতিটি সংযোগের সাব-অবজেক্টে সংস্করণযুক্ত রাজ্যের ভেক্টর থাকতে পারে। এইভাবে আপনি উপযুক্ত অপরিবর্তনীয় অবস্থার অ্যাক্সেসের জন্য কোনও গ্রাফ সংস্করণ নম্বর দিয়ে পরিচালনা করতে পারেন।

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

যদি বস্তুর মধ্যে সংযোগটি আপনার সংস্করণযুক্ত রাজ্যের অংশ হয়, তবে পূর্বোক্ত কাজ করে না। তবে আপনি এটি নিম্নলিখিত হিসাবে প্রসারিত করতে পারেন:

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

উপরে বর্ণিত একই যুক্তি হ্যান্ডলগুলির মধ্যে সংস্করণগুলি আপডেট করার জন্য প্রযোজ্য - যা অলস, স্থানীয়করণের আপডেটগুলি অনুমতি দেয়।


3

খুব ভাল মোড়িত সময় জটিলতার সাথে এই সমস্যার একটি প্রকাশিত সমাধান রয়েছে, তবে কখন কী সন্ধান করবেন ঠিক তা আপনি জানেন না তখন এটি খুঁজে পাওয়া শক্ত। আপনি এই লেকচার নোটগুলিতে একটি দুর্দান্ত সংক্ষিপ্তসার খুঁজে পেতে পারেন (বিভাগ 2.2.3 দেখুন) বা ডেটা স্ট্রাকচার মজবুত করে মূল কাগজটি পড়তে পারেন । যদি আপনার অবজেক্ট গ্রাফের সীমাবদ্ধ সংযোগ থাকে (যেমন গাছের মতো কাঠামো) তবে আপনি অপরিবর্তনীয় গ্রাফটি পড়া এবং আপডেট করার জন্য উভয়ই মোড়কানো ও (1) জটিলতায় পৌঁছতে পারেন, যা চিত্তাকর্ষক।

ধারণাটি হ'ল প্রতিটি বস্তু, তার বর্তমান অপরিবর্তনীয় অবস্থা সংরক্ষণ করার পাশাপাশি রেকর্ডিং পরিবর্তনের জন্য স্থান সংরক্ষণ করে। আপনি যখন পরিবর্তনগুলি প্রয়োগ করে কোনও বিদ্যমান থেকে নতুন অপরিবর্তনীয় গ্রাফ তৈরি করতে চান তখন আপনাকে দুটি ক্ষেত্রে বিবেচনা করতে হবে:

  • আপনি যে অবজেক্টটি পরিবর্তন করতে চান তাতে পরিবর্তনের জন্য এখনও স্থান রয়েছে। আপনি পরিবর্তনগুলি সরাসরি অবজেক্টে সঞ্চয় করতে পারেন।

  • পরিবর্তনের জন্য অবজেক্টটির আর কোনও স্থান নেই। আপনি বর্তমান মান এবং খালি পরিবর্তন রেকর্ডের উপর ভিত্তি করে নতুন উদাহরণ তৈরি করেন। এখন আপনাকে নতুন অবজেক্টটি উল্লেখ করতে পুরানো অবজেক্টটি উল্লেখ করে পুনঃবিবেচিতভাবে সমস্ত বস্তু আপডেট করতে হবে।

    যদি রেফারেন্সিং অবজেক্টে নিজেই পরিবর্তনের জন্য স্থান থাকে তবে আপনি পরিবর্তনটি সরাসরি রেফারেন্সে সঞ্চয় করতে পারেন, অন্যথায় এটি পুনরুক্তিভাবে ক্যাসকেড করে।

যদিও এই স্কিমটি নতুন প্রজন্মের অপরিবর্তনীয় অবজেক্ট গ্রাফগুলির দক্ষ তৈরির পক্ষে সমর্থন করে যা এটি থেকে পড়া জটিল করে তোলে, কারণ এখন অপরিবর্তনীয় কোনও বস্তু থেকে ডেটা পড়ার সময় আপনি কোন "সংস্করণ" অ্যাক্সেস করতে চান তা নির্দিষ্ট করতে হবে। এটি কারণ সঞ্চিত পরিবর্তন রেকর্ডের কারণে অপরিবর্তনীয় বস্তুর একাধিক সংস্করণের তথ্য থাকতে পারে, তাই আপনি কোন সংস্করণটি দেখতে চান তা নির্দিষ্ট করতে হবে।

এটি বাস্তবায়ন করার সময় আমি এপিআইতে এই জটিলতাগুলি আড়াল করার চেষ্টা করি। বাইরে থেকে অপরিবর্তনীয় গ্রাফের মধ্যে কিছু উল্লেখ করার সময়, আমি সরাসরি উল্লেখগুলির পরিবর্তে উত্পন্ন স্টাব ব্যবহার করি, তাই কলকারীদের ম্যানুয়ালি আশেপাশে পছন্দসই সংস্করণটি পাস করার প্রয়োজন হয় না। এটি রেফারেন্সগুলি সরাসরি পয়েন্টারের চেয়ে কিছুটা বেশি ব্যয়বহুল করে তোলে তবে আমি এটি সুবিধার জন্য খুঁজে পাই।

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