গাছগুলি কি "ফার্স্টচাইল্ড, নেেক্সটসিলিং" কাঠামোর দ্বারা সংগঠিত হয়? তা না হলে কেন?


12

সাধারণত, ট্রি ডেটা স্ট্রাকচারগুলি এমনভাবে সংগঠিত করা হয় যে প্রতিটি নোডের সমস্ত শিশুকে পয়েন্টার থাকে contains

       +-----------------------------------------+
       |        root                             | 
       | child1            child2         child3 |
       +--+------------------+----------------+--+
          |                  |                |
+---------------+    +---------------+    +---------------+
|    node1      |    |     node2     |    |     node3     |
| child1 child2 |    | child1 child2 |    | child1 child2 |
+--+---------+--+    +--+---------+--+    +--+---------+--+
   |         |          |         |          |         |

এটি প্রাকৃতিক বলে মনে হচ্ছে তবে এটি কিছু সমস্যা নিয়ে আসে। উদাহরণস্বরূপ, যখন শিশু নোডের সংখ্যা পৃথক হয়, আপনার বাচ্চাদের পরিচালনা করতে অ্যারে বা তালিকার মতো কিছু দরকার।

পরিবর্তে কেবলমাত্র (প্রথম) শিশু এবং (পরবর্তী) ভাইবোন পয়েন্টার ব্যবহার করে আমরা এমন কিছু পাই যা দেখতে দেখতে দেখতে:

       +-------------------+
       |        root       |
       | child    sibling  +--->NULL
       +--+----------------+
          |             
+----------------+    +----------------+    +----------------+
|    node1       |    |     node2      |    |     node3      |
| child  sibling +--->| child  sibling +--->| child  sibling +--->NULL
+--+-------------+    +--+-------------+    +--+-------------+
   |                     |                     |

অবশ্যই, এই ধরণের কাঠামো গাছগুলিকে পাশাপাশি উপস্থাপন করতে পারে তবে এটি কিছু সুবিধাও দেয়। সবচেয়ে গুরুত্বপূর্ণটি হ'ল আমাদের আর শিশু নোডের সংখ্যা নিয়ে চিন্তা করতে হবে না। যখন কোনও পার্স গাছের জন্য ব্যবহার করা হয়, তখন এটি গভীর গাছ না হয়ে "a + b + c + d + e" এর মতো শব্দটির জন্য একটি প্রাকৃতিক উপস্থাপনা দেয়।

সংগ্রহ গ্রন্থাগারগুলি কি গাছের কাঠামোগুলির মতো প্রস্তাব দেয়? পার্সাররা কি এমন কাঠামো ব্যবহার করে? তা না হলে কারণ কী?


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

4
কোনও লিঙ্কযুক্ত তালিকায় আইটেম স্থাপন করা O(n)অ্যালগরিদমের একটি উপাদানকে পরিচয় করিয়ে দেয়।

এবং মূল থেকে নোড 3 পাওয়ার জন্য আপনাকে মূলের সিডিডার নিতে হবে ...
টাকরোয়

ট্যাক্রয়: সঠিক, রুটে ফিরে পাওয়া ঠিক সহজ নয়, তবে আমার যদি সত্যিই এটির প্রয়োজন হয় তবে একটি ব্যাক পয়েন্টার অপরিবর্তিত হবে (যদিও এটি চিত্রটি নষ্ট করে দেবে ;-)
ইউজার 281377

উত্তর:


7

তালিকার মতো গাছগুলি হ'ল "বিমূর্ত তথ্য প্রকার" যা বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে। প্রতিটি উপায়ে এর সুবিধা এবং অসুবিধা রয়েছে।

প্রথম উদাহরণে, এই কাঠামোর মূল সুবিধা হ'ল আপনি ও (1) এর যে কোনও শিশুকে অ্যাক্সেস করতে পারবেন। অসুবিধাটি হ'ল অ্যারেটি প্রসারিত করতে গেলে কখনও কখনও কোনও শিশুকে যুক্ত করা কিছুটা ব্যয়বহুল হয়। যদিও এই ব্যয় তুলনামূলকভাবে কম। এটি সাধারণ বাস্তবায়নগুলির মধ্যে একটি।

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

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


1
উদাহরণস্বরূপ: একটি বি + ট্রি কখনই এই "ফার্স্টচাইল্ড, নেক্সটসিবলিং" কাঠামোটি ব্যবহার করবে না। এটি ডিস্ক-ভিত্তিক গাছের জন্য অযৌক্তিকতার বিন্দুতে অকার্যকর এবং মেমরি-ভিত্তিক গাছের জন্য এখনও খুব অদক্ষ। একটি স্মৃতিবিহীন আর-ট্রি এই কাঠামোটিকে সহ্য করতে পারে তবে এটি আরও অনেক বেশি ক্যাশে-মিস বোঝায়। আমি এমন পরিস্থিতি নিয়ে ভাবতে কঠোরভাবে চাপছি যেখানে "ফার্স্টচিল্ড, নেক্সত্সবিলিং" আরও উন্নত হবে। ভাল, হ্যাঁ, এটি একটি সিনট্যাক্স গাছের জন্য কাজ করতে পারে যেমন এমএমকিউ উল্লিখিত হয়েছে। আর কিছু?
কিওয়ারটি

3
"আপনি সর্বদা ও (1) এ একটি শিশুকে যুক্ত করুন" - আমি মনে করি আপনি সর্বদা ও (1) এর সূচক 0 এ একটি শিশুকে সন্নিবেশ করতে পারেন, তবে একটি শিশু সংযোজন স্পষ্টভাবে O (n) বলে মনে হয়।
স্কট হুইটলক

একক অ্যারে পুরো গাছ সংরক্ষণ করা গাদা জন্য সাধারণ for
ব্রায়ান

1
@ স্কট: ঠিক আছে, আমি ধরে নিয়েছি যে লিঙ্কযুক্ত তালিকায় সর্বশেষ আইটেমটির সাথে একটি পয়েন্টার / রেফারেন্সও রয়েছে, যা এটি প্রথম (শেষ)
পোস্টের

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

2

প্রায় প্রতিটি প্রকল্পে কিছু সম্পাদনযোগ্য মডেল বা দস্তাবেজ রয়েছে এটির একটি শ্রেণিবদ্ধ কাঠামো। এটি বিভিন্ন সত্তার বেস-ক্লাস হিসাবে 'শ্রেণিবদ্ধ নোড' বাস্তবায়নের কাজে আসতে পারে। প্রায়শই সংযুক্ত-তালিকা (শিশু ভাইবোন, ২ য় মডেল) হ'ল প্রাকৃতিক উপায়ে অনেক শ্রেণীর গ্রন্থাগার বৃদ্ধি পায় তবে শিশুরা বিভিন্ন ধরণের হতে পারে এবং সাধারণত "গাছের মডেল " সাধারণত গাছ সম্পর্কে কথা বলার সময় আমরা বিবেচনা করি না।

আপনার প্রথম মডেলের একটি গাছের (নোড) আমার প্রিয় বাস্তবায়ন হ'ল একটি লাইন (সি # তে):

public class node : List<node> { /* props go here */ }

আপনার নিজস্ব ধরণের জেনেরিক তালিকা থেকে উত্তরাধিকারী (বা অন্য কোনও জেনেরিক সংগ্রহ-যা আপনার নিজস্ব-টাইপের উত্তরাধিকারী)। এক দিকে হাঁটা সম্ভব: নীচের দিকে মূলটি গঠন করুন (আইটেমগুলি তাদের পিতামাতাকে জানেন না)।

পিতামাতা কেবল গাছের

আপনি যে মডেলটির কথা উল্লেখ করেন নি, তা হ'ল এক যেখানে প্রতিটি সন্তানের পিতামাতার সাথে উল্লেখ রয়েছে:

               null
                 |
       +---------+---------------------------------+
       |       parent                              |
       | root                                      |
       +-------------------------------------------+
          |                   |                |
+---------+------+    +-------+--------+    +--+-------------+
|     parent     |    |     parent     |    |     parent     |
|     node 1     |    |     node 2     |    |     node 3     |
+----------------+    +----------------+    +----------------+

এই গাছের হাঁটাচলা কেবল অন্যভাবেই সম্ভব, সাধারণত এই সমস্ত নোডগুলি একটি সংগ্রহে সংরক্ষণ করা হবে (অ্যারে, হ্যাশটেবল, অভিধান ইত্যাদি) and এবং নোডটি হায়ারারিকাল অবস্থান ব্যতীত অন্যান্য মানদণ্ডে সংগ্রহগুলি অনুসন্ধান করে সন্ধান করা হবে the গাছ যা সাধারণত গুরুত্ব দেয় না।

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

দ্বি নির্দেশমূলক নাব্য গাছ

তবে বেশিরভাগ ব্যবহারিক ক্ষেত্রে, উভয় বিশ্বের সেরা থাকা সুবিধাজনক। নোডগুলিতে বাচ্চাদের একটি তালিকা রয়েছে এবং অতিরিক্ত তাদের পিতামাতাকেও জানেন: দ্বিপাক্ষিক নেভিগেশন গাছ।

                          null
                            |
       +--------------------+--------------------+
       |                  parent                 |
       |        root                             | 
       | child1            child2         child3 |
       +--+------------------+----------------+--+
          |                  |                |
+---------+-----+    +-------+-------+    +---+-----------+
|      parent   |    |     parent    |    |  parent       |
|    node1      |    |     node2     |    |     node3     |
| child1 child2 |    | child1 child2 |    | child1 child2 |
+--+---------+--+    +--+---------+--+    +--+---------+--+
   |         |          |         |          |         |

এটি বিবেচনা করার জন্য আরও অনেক দিক বয়ে আনে:

  • পিতামাতার সংযোগ স্থাপন এবং লিঙ্কমুক্ত করতে কোথায়?
    • ব্যবসায়ের যুক্তি যত্ন নিতে দিন এবং দিকটি নোডের বাইরে ছেড়ে দিন (তারা ভুলে যাবে!)
    • নোডের বাচ্চাদের তৈরির জন্য পদ্ধতি রয়েছে (পুনরায় অর্ডার দেওয়ার অনুমতি দেয় না) (তাদের সিস্টেমে মাইক্রোসফ্টস পছন্দ ml
    • নোডগুলি তাদের কনস্ট্রাক্টারে একটি পিতামাতাকে নিয়ে যায় (পুনরায় অর্ডার দেওয়ার অনুমতি দেয় না)
    • সমস্ত যোগে (), সন্নিবেশ () সন্নিবেশ করুন () পদ্ধতি এবং তাদের নোডগুলির ওভারলোডগুলি (সাধারণত আমার পছন্দ)
  • Persistance
    • কীভাবে অবিচল অবস্থায় গাছটি চলতে হবে (উদাহরণস্বরূপ পিতামাতার লিঙ্কগুলি ছেড়ে দিন)
    • ডি-সিরিয়ালাইজেশনের পরে দ্বি-মুখী সংযোগটি কীভাবে পুনর্নির্মাণ করবেন (সমস্ত পিতামাতাকে পুনরায় ডিসরিয়ালাইজেশন পরবর্তী ক্রিয়াকলাপ হিসাবে সেট করে)
  • বিজ্ঞপ্তিগুলি
    • স্ট্যাটিক মেকানিজম (ইসডার্টি ফ্ল্যাগ), বৈশিষ্ট্যগুলিতে পুনরাবৃত্তভাবে পরিচালনা করে?
    • ইভেন্টগুলি, পিতামাতার মাধ্যমে বাচ্চাদের মাধ্যমে বা উভয় উপায়ে বুদবুদ করুন (উদাহরণস্বরূপ উইন্ডোজ বার্তা পাম্প বিবেচনা করুন)।

এখন প্রশ্নের উত্তর দেওয়ার জন্য , দ্বিপাক্ষিক নাব্য গাছগুলি (আমার ক্যারিয়ার এবং এখনও পর্যন্ত আমার ক্ষেত্রে) সর্বাধিক ব্যবহৃত হয়। উদাহরণস্বরূপ System.Windows. Forms.Control এর মাইক্রোসফটস বাস্তবায়ন, বা। নেট ফ্রেমওয়ার্কে System.Web.UI.Control, তবে প্রতিটি ডিওএম (ডকুমেন্ট অবজেক্ট মডেল) প্রয়োগে নোড থাকবে যা তাদের পিতামাতার পাশাপাশি একটি গণনাও জানে তাদের সন্তানদের। কারণ: বাস্তবায়নের স্বাচ্ছন্দ্যের উপর ব্যবহারের সহজতা। এছাড়াও, এগুলি সাধারণত আরও নির্দিষ্ট ক্লাসের জন্য বেস ক্লাস হয় (এক্সএমএমলনড ট্যাগ, বৈশিষ্ট্য এবং পাঠ্য ক্লাসের ভিত্তি হতে পারে) এবং এই বেস শ্রেণিগুলি জেনেরিক সিরিয়ালাইজেশন এবং ইভেন্ট-হ্যান্ডলিং আর্কিটেকচারগুলি রাখার প্রাকৃতিক জায়গা।

অনেকগুলি স্থাপত্যের কেন্দ্রবিন্দুতে গাছটি রয়েছে এবং অবাধে নেভিগেট করতে সক্ষম হওয়া মানে সমাধানগুলি দ্রুত কার্যকর করতে সক্ষম হওয়া।


1

আমি এমন কোনও ধারক গ্রন্থাগার সম্পর্কে জানি না যা সরাসরি আপনার দ্বিতীয় ক্ষেত্রে সমর্থন করে তবে বেশিরভাগ ধারক লাইব্রেরি সহজেই সেই দৃশ্যটিকে সমর্থন করতে পারে। উদাহরণস্বরূপ, সি ++ এ আপনি থাকতে পারেন:

class Node;  // forward reference to satisfy the compiler
typedef std::list<Node*> NodeList;
class Node : public NodeList { /* . . . */ };  // a node is also a list

Node* n = new Node;
n->push_back(new Node);
Node* tree = new Node;
tree->push_back(new Node);
tree->push_back(n);

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


1

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

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

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