প্রির্ডার, পোস্টর্ডার এবং ইনর্ডার বাইনারি অনুসন্ধান ট্রি ট্রভারসাল কৌশলগুলি কখন ব্যবহার করবেন


100

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

এটি উপলব্ধি করার পরে, আমি আমার কিছু পুরানো ডেটা-কাঠামো পাঠ্যপুস্তকগুলি টেনে এনেছি এবং প্রাক-অর্ডার এবং পোস্ট-অর্ডার ট্র্যাভারসালগুলির কার্যকারিতার পিছনে যুক্তির সন্ধান করেছি - যদিও তারা খুব বেশি কিছু বলেনি।

প্রাক-অর্ডার / পোস্টর্ডার ব্যবহারিকভাবে ব্যবহার করার জন্য কয়েকটি উদাহরণ কী? কখন এটি অর্ডারের চেয়ে বেশি অর্থবোধ করে?

উত্তর:


138

প্রি-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার ট্র্যাভারসাল কৌশল কখন ব্যবহার করবেন

কোন পরিস্থিতিতে বাইনারি গাছের জন্য প্রাক-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার কী পরিস্থিতিতে ব্যবহার করতে হবে তা বোঝার আগে আপনাকে প্রতিটি ট্র্যাভারসাল কৌশল কীভাবে কাজ করে তা ঠিক বুঝতে হবে। উদাহরণস্বরূপ নিম্নলিখিত গাছটি ব্যবহার করুন।

গাছের মূল 7 , বাম সর্বাধিক নোড 0 , ডান সর্বাধিক নোড 10

এখানে চিত্র বর্ণনা লিখুন

প্রাক-অর্ডার ট্র্যাভারসাল :

সংক্ষিপ্তসার: মূলটিতে শুরু হয় ( 7 ), ডান-সর্বাধিক নোড ( 10 ) এ শেষ হয়

ট্র্যাভার্সাল ক্রম: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10

অর্ডার ট্র্যাভারসাল :

সংক্ষিপ্তসার: বাম-সর্বাধিক নোড ( 0 ) এ শুরু হয়, ডানদিকের নোডে শেষ হবে ( 10 )

ট্র্যাভার্সাল সিকোয়েন্স: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

পোস্ট-অর্ডার ট্র্যাভারসাল :

সংক্ষিপ্তসার: বাম-সর্বাধিক নোড ( 0 ) দিয়ে শুরু হয়, মূল দিয়ে শেষ হয় ( 7 )

ট্র্যাভার্সাল ক্রম: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7

প্রি-অর্ডার, অর্ডার বা পোস্ট-অর্ডার কখন ব্যবহার করবেন?

প্রোগ্রামারটি যে ট্র্যাভারসাল কৌশলটি নির্বাচন করে তা ডিজাইন করা অ্যালগরিদমের নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে। লক্ষ্যটি গতি, সুতরাং কৌশলটি চয়ন করুন যা আপনাকে দ্রুত প্রয়োজন এমন নোডগুলি নিয়ে আসে।

  1. যদি আপনি জানেন যে কোনও পাতা পরিদর্শন করার আগে আপনার শিকড়গুলি অন্বেষণ করা দরকার, আপনি প্রাক-অর্ডার বেছে নিন কারণ আপনি সমস্ত পাতার আগে সমস্ত শিকড়ের মুখোমুখি হবেন।

  2. যদি আপনি জানেন যে কোনও নোডের আগে আপনাকে সমস্ত পাতা সন্ধান করতে হবে, আপনি পোস্ট-অর্ডার নির্বাচন করুন কারণ আপনি পাতার অনুসন্ধানে শিকড়গুলি পরিদর্শন করতে কোনও সময় নষ্ট করবেন না।

  3. যদি আপনি জানেন যে গাছের নোডগুলিতে একটি অন্তর্নিহিত ক্রম রয়েছে এবং কোনও অর্ডারে ট্র্যাভারসাল ব্যবহার করা না থেকে আপনি গাছটিকে তার মূল অনুক্রমের দিকে ফিরে সমতল করতে চান । গাছটি তৈরি করা হয়েছিল ঠিক একইভাবে চ্যাপ্টা হবে। প্রাক-অর্ডার বা পোস্ট-অর্ডার ট্র্যাভারসাল গাছটিকে এটি তৈরির জন্য ব্যবহৃত ক্রম অনুসারে পুনরায় উন্মুক্ত করতে পারে না।

প্রি-অর্ডার, ইন-অর্ডার এবং পোস্ট-অর্ডার (সি ++) এর জন্য রিকারসিভ অ্যালগোরিদম:

struct Node{
    int data;
    Node *left, *right;
};
void preOrderPrint(Node *root)
{
  print(root->name);                                  //record root
  if (root->left != NULL) preOrderPrint(root->left);  //traverse left if exists
  if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}

void inOrderPrint(Node *root)
{
  if (root.left != NULL) inOrderPrint(root->left);   //traverse left if exists
  print(root->name);                                 //record root
  if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}

void postOrderPrint(Node *root)
{
  if (root->left != NULL) postOrderPrint(root->left);  //traverse left if exists
  if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
  print(root->name);                                   //record root
}

4
পুনরাবৃত্তিযোগ্য ট্র্যাভারসালগুলি সম্পর্কে কী? আমার কাছে মনে হয়েছে যে কোনও গাছটিকে অ-অর্ডার / পোস্ট-অর্ডারের তুলনায় প্রাক-অর্ডারে অ-পুনরাবৃত্তভাবে অতিক্রম করা খুব সহজ, যেহেতু এটি পূর্ববর্তী নোডগুলিতে ফিরে আসার প্রয়োজন হয় না।
bluenote10

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

@ জোশুয়া টেইলর: হ্যাঁ, এগুলি সমস্ত একই জটিলতার শ্রেণি, তবে আপনি যদি সাধারণ বাস্তবায়নগুলি লক্ষ্য করেন তবে পোস্ট-অর্ডার সম্ভবত কিছুটা জটিল y
bluenote10

4
প্রাক-অর্ডার ট্র্যাসভারস সন্নিবেশের ক্রমে নোড মান দেয়। আপনি যদি গাছের একটি অনুলিপি তৈরি করতে চান তবে আপনার উত্স ট্রিটিকে এভাবেই অতিক্রম করতে হবে। ক্রমযুক্ত ক্রমটি সাজানো নোডের মান দেয়। পোস্ট-অর্ডার ট্র্যাভার্স হিসাবে আপনি পুরো গাছটিকে মুছতে এই পদ্ধতিটি ব্যবহার করতে পারেন কারণ এটি প্রথমে পাতার নোডগুলিতে পরিদর্শন করে।
আলবিন

আমি মনে করি গাছটিকে সঠিক অর্ডার না দেওয়া সত্ত্বেও এটি সত্য, আমি ক্রমটি প্রথমে ক্রমটি বাছাই না করা থাকলে ক্রম অনুসারে বাছাই করা ক্রমটি দেয় না mean
কোডইগি

31

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

অর্ডার:: একটি বিএসটি-তে ক্রমহ্রাসমান ক্রমে নোডের মান পেতে ব্যবহৃত হয়।

পোস্ট-অর্ডার:: পাতা থেকে শিকড় পর্যন্ত একটি গাছ মুছতে ব্যবহৃত হয়


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

7
ক্রমানুসারে: "অ-হ্রাসকারী" ক্রমে নোডের মান পেতে - "ক্রমবর্ধমান" নয়
rahil008

26

আমি যদি কেবল লিনিয়ার বিন্যাসে গাছের শ্রেণিবিন্যাসের বিন্যাসটি প্রিন্ট করতে চাইতাম তবে আমি সম্ভবত প্রাক অর্ডার ট্রভারসাল ব্যবহার করব। উদাহরণ স্বরূপ:

- ROOT
    - A
         - B
         - C
    - D
         - E
         - F
             - G

4
বা TreeViewএকটি জিইউআই অ্যাপ্লিকেশনটিতে কোনও উপাদান রয়েছে।
সুইভ

4

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

আরও লক্ষ করুন যে প্রাক এবং উত্তর-পরবর্তী ক্রমগুলি একসাথে গাছটিকে সম্পূর্ণরূপে নির্দিষ্ট করে, কমপ্যাক্ট এনকোডিং দেয় (কমপক্ষে বিরল গাছগুলির জন্য)।


4
আমি মনে করি আপনি গুরুত্বপূর্ণ কিছু বলার চেষ্টা করছেন আপনি কি প্রথমার্ধটি ব্যাখ্যা করতে পারেন?
কোডইগি

@ কোডডোগী আপনার বিশেষভাবে কী ব্যাখ্যা করা দরকার?
রাফেল

4
"প্রাক এবং পোস্ট-অর্ডার টপ-ডাউন এবং নীচের অংশে পুনরাবৃত্ত আলগোরিদিমগুলির সাথে সম্পর্কিত" আমার মনে হয় আপনি বলতে চান যে প্রথম ক্ষেত্রে নোড প্রক্রিয়া করা হয় পূর্বে কোনওটিতে পুনরাবৃত্ত পদ্ধতি এবং তদ্বিপরীত কল করার আগে right ?
কোডইগি

@ কোডেগি হ্যাঁ, মূলত
রাফেল

2

আপনি এই পার্থক্যটি দেখতে আসছেন এমন অনেকগুলি জায়গা রয়েছে যা একটি বাস্তব ভূমিকা পালন করে।

আমি উল্লেখ করব একটি দুর্দান্ত একটি একটি সংকলকের কোড প্রজন্মের মধ্যে। বিবৃতি বিবেচনা করুন:

x := y + 32

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

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

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