প্রস্থ প্রথম বনাম গভীরতা প্রথম


171

একটি গাছ / গ্রাফ ট্র্যাভার করার সময় প্রথম প্রথম এবং গভীরতার মধ্যে পার্থক্য কী? যে কোনও কোডিং বা সিউডোকোড উদাহরণ দুর্দান্ত হবে।


6
আপনি উইকিপিডিয়া পরীক্ষা করেছেন ( গভীরতা প্রথম , প্রস্থ প্রথম )? সেই পৃষ্ঠাগুলিতে প্রচুর সুন্দর ছবি সহ কোডের উদাহরণ রয়েছে।
rmeador

আমি যে চিন্তা ছিল, কিন্তু তারপর দেওয়া উদাহরণ উইকিপিডিয়া পাওয়া তুলনায় সামান্য সুন্দর হয় ....
jonnybazookatone

উত্তর:


291

এই দুটি পদ একটি গাছ হাঁটার দুটি পৃথক পদ্ধতির মধ্যে পার্থক্য করে।

পার্থক্যটি প্রদর্শন করা সম্ভবত এটি সবচেয়ে সহজ। গাছটি বিবেচনা করুন:

    A
   / \
  B   C
 /   / \
D   E   F

একটি গভীরতার প্রথম ট্র্যাভারসাল এই ক্রমে নোডগুলি পরিদর্শন করবে

A, B, D, C, E, F

লক্ষ্য করুন যে আপনি সমস্ত পথে চলেছেন যাওয়ার আগে এক পা দিয়ে চলে যান।

একটি প্রস্থের প্রথম ট্র্যাভারসাল এই ক্রমে নোডটি দেখতে পাবে

A, B, C, D, E, F

এখানে আমরা পুরোপুরি কাজ করি নীচে যাবার আগে প্রতিটি স্তর জুড়ে

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


উভয় ধরণের ট্র্যাভারসাল সিউডোকোড দিয়ে অর্জন করা যেতে পারে:

Store the root node in Container
While (there are nodes in Container)
   N = Get the "next" node from Container
   Store all the children of N in Container
   Do some work on N

পছন্দমত মধ্যে মধ্যে দুই ট্র্যাভেরসাল আদেশ মিথ্যা পার্থক্য Container

  • জন্য গভীরতা প্রথম একটি স্ট্যাক ব্যবহার করুন। (পুনরাবৃত্তির প্রয়োগটি কল-স্ট্যাক ব্যবহার করে ...)
  • জন্য পানা প্রথম সারিতে ব্যবহার করুন।

পুনরাবৃত্তির বাস্তবায়ন দেখে মনে হচ্ছে

ProcessNode(Node)
   Work on the payload Node
   Foreach child of Node
      ProcessNode(child)
   /* Alternate time to work on the payload Node (see below) */

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


এই মুহুর্তে, আমি এখনও কিছুটা প্রতারণা করেছি। কিছুটা চৌকসতার সাথে আপনি এই ক্রমে নোডগুলিও কাজ করতে পারেন :

D, B, E, F, C, A

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

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


@ ডিএমকেকে ধন্যবাদ! আমি বিশ্বাস করি আপনি "নোডে পে-লোডে কাজ করুন" বুঝিয়েছেন?
ব্যাটব্র্যাট

4
এটি লক্ষণীয় যে আপনি উপসর্গ ( A, B, D, C, E, F- প্রথমটি উপস্থাপিত), ইনফিক্স ( D, B, A, E, C, F- বাছাইয়ের জন্য ব্যবহৃত: একটি এভিএল ট্রি হিসাবে যুক্ত করুন তারপর ইনফিক্স পড়ুন) বা পোস্টফিক্স ( D, B, E, F, C, Aবিকল্প উপস্থাপিত) ট্র্যাভারসাল পেতে আপনি গভীরতা-প্রথম সংস্করণটি সংশোধন করতে পারেন । নামগুলি সেই অবস্থান দ্বারা দেওয়া হয় যেখানে আপনি রুটটি প্রক্রিয়া করেন। এটি লক্ষ করা উচিত যে ইনফিক্স কেবল বাইনারি গাছগুলির জন্য সত্যই উপলব্ধি করে। @ বাতব্রত এই নামগুলি ... আপনার জিজ্ঞাসার পর থেকে আপনি সম্ভবত ইতিমধ্যে জানেন।
থেরোট

এটি যোগ করার জন্য @ থেরোট ধন্যবাদ! হ্যাঁ, আমি এই ধরণের ট্র্যাভারসালগুলি এবং কেন ইনফিক্স কেবল বাইনারি গাছগুলির জন্য অর্থবোধ করে তা সম্পর্কে আমি জানি।
ব্যাটব্র্যাট

কোন সমাধানের আরও ভাল জায়গা বা সময়ের জটিলতা আছে তা কীভাবে সিদ্ধান্ত নেবেন?
ইগোরগানাপলস্কি

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

95

শর্তাবলী বোঝা:

এই চিত্রটি আপনাকে যে প্রসঙ্গে প্রস্থ এবং গভীরতা শব্দ ব্যবহার করা হয়েছে সে সম্পর্কে ধারণা দেওয়া উচিত ।

প্রস্থ এবং গভীরতা বোঝা


গভীরতা-প্রথম অনুসন্ধান:

গভীরতা-প্রথম অনুসন্ধান

  • গভীরতা-প্রথম অনুসন্ধান অ্যালগরিদম এমনভাবে কাজ করে যা এটি যত তাড়াতাড়ি সম্ভব প্রারম্ভিক অবস্থান থেকে দূরে যেতে চায়।

  • এটি সাধারণত একটি Stackস্মরণে ব্যবহার করে যে এটি কখন শেষ হবে যখন এটি কোনও শেষ প্রান্তে পৌঁছায়।

  • নিয়ম অনুসরণ করতে হবে: প্রথম প্রান্তিক এ টিপুন Stack

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

    public void searchDepthFirst() {
        // Begin at vertex 0 (A)
        vertexList[0].wasVisited = true;
        displayVertex(0);
        stack.push(0);
        while (!stack.isEmpty()) {
            int adjacentVertex = getAdjacentUnvisitedVertex(stack.peek());
            // If no such vertex
            if (adjacentVertex == -1) {
                stack.pop();
            } else {
                vertexList[adjacentVertex].wasVisited = true;
                // Do something
                stack.push(adjacentVertex);
            }
        }
        // Stack is empty, so we're done, reset flags
        for (int j = 0; j < nVerts; j++)
            vertexList[j].wasVisited = false;
    }
    
  • অ্যাপ্লিকেশন : গভীরতার প্রথম অনুসন্ধানগুলি প্রায়শই গেমগুলির সিমুলেশনগুলিতে ব্যবহৃত হয় (এবং আসল বিশ্বে গেমের মতো পরিস্থিতি)। একটি সাধারণ খেলায় আপনি বেশ কয়েকটি সম্ভাব্য ক্রিয়াগুলির মধ্যে একটি চয়ন করতে পারেন। প্রতিটি পছন্দ আরও পছন্দ বাড়ে, যার মধ্যে প্রতিটি আরও পছন্দ বাড়ে এবং সম্ভাবনার একটি বর্ধমান গাছ-আকারের গ্রাফের দিকে নিয়ে যায়।


প্রস্থ-প্রথম অনুসন্ধান:

প্রস্থ-প্রথম অনুসন্ধান

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

    public void searchBreadthFirst() {
        vertexList[0].wasVisited = true;
        displayVertex(0);
        queue.insert(0);
        int v2;
        while (!queue.isEmpty()) {
            int v1 = queue.remove();
            // Until it has no unvisited neighbors, get one
            while ((v2 = getAdjUnvisitedVertex(v1)) != -1) {
                vertexList[v2].wasVisited = true;
                // Do something
                queue.insert(v2);
            }
        }
        // Queue is empty, so we're done, reset flags
        for (int j = 0; j < nVerts; j++) 
            vertexList[j].wasVisited = false;
    }
    
  • অ্যাপ্লিকেশন : প্রস্থ-প্রথম অনুসন্ধানে প্রথমে সমস্ত সূচি খুঁজে পাওয়া যায় যা প্রারম্ভিক বিন্দু থেকে এক প্রান্ত দূরে থাকে, তারপরে সমস্ত প্রান্ত যে দুটি প্রান্ত দূরে থাকে, ইত্যাদি finds আপনি যদি প্রারম্ভিক প্রান্ত থেকে একটি প্রদত্ত প্রান্তের সবচেয়ে ছোটতম পথটি খুঁজতে চেষ্টা করেন তবে এটি কার্যকর।

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


6
আমি যদি ঠিক আরও দশটি ভোটগ্রহণ করতাম তবে আমি তা করতাম।
snr

@ এসএনআর আপনি একটি অনুগ্রহ অর্জন করতে পারেন;)
তুষারপাত

@ আপনি যদি এর নির্দেশনাগুলি জানান তবে আমি তা করতে পারি। কীভাবে করব জানি না।
স্নার

আপনাকে @ এসএনআর ধন্যবাদ, আমি আমার প্রথম অনুগ্রহ পেয়ে খুশি। আমি অনেক প্রশংসা করি।
যোগেশ উমেশ ভৈতি

1
ধন্যবাদ @ স্নো, আমি আপনাকে সন্তুষ্ট করে আমার উত্তরটি দরকারী বলে খুঁজে পেয়েছি।
যোগেশ উমেশ ভৈতি

4

এই বাইনারি গাছ দেওয়া:

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

প্রস্থের প্রথম ট্র্যাভারসাল:
বাম থেকে ডানে প্রতিটি স্তর পেরিয়ে।

"আমি জি, আমার বাচ্চারা ডি এবং আমি, আমার পিতামহী হ'ল বি, ই, এইচ এবং কে, তাদের নাতিরা হ'ল এ, সি, এফ"

- Level 1: G 
- Level 2: D, I 
- Level 3: B, E, H, K 
- Level 4: A, C, F

Order Searched: G, D, I, B, E, H, K, A, C, F

গভীরতা প্রথম ট্র্যাভারসাল:
ট্র্যাভারসাল একসাথে পুরো স্তরে ACROSS করা হয় না। পরিবর্তে, ট্র্যাভার্সাল ডাইপগুলি প্রথমে গাছের ডিপথ (মূল থেকে পাতায়)। তবে এটি কেবল উপরে এবং নীচের চেয়ে কিছুটা জটিল।

তিনটি পদ্ধতি রয়েছে:

1) PREORDER: ROOT, LEFT, RIGHT.
You need to think of this as a recursive process:  
Grab the Root. (G)  
Then Check the Left. (It's a tree)  
Grab the Root of the Left. (D)  
Then Check the Left of D. (It's a tree)  
Grab the Root of the Left (B)  
Then Check the Left of B. (A)  
Check the Right of B. (C, and it's a leaf node. Finish B tree. Continue D tree)  
Check the Right of D. (It's a tree)  
Grab the Root. (E)  
Check the Left of E. (Nothing)  
Check the Right of E. (F, Finish D Tree. Move back to G Tree)  
Check the Right of G. (It's a tree)  
Grab the Root of I Tree. (I)  
Check the Left. (H, it's a leaf.)  
Check the Right. (K, it's a leaf. Finish G tree)  
DONE: G, D, B, A, C, E, F, I, H, K  

2) INORDER: LEFT, ROOT, RIGHT
Where the root is "in" or between the left and right child node.  
Check the Left of the G Tree. (It's a D Tree)  
Check the Left of the D Tree. (It's a B Tree)  
Check the Left of the B Tree. (A)  
Check the Root of the B Tree (B)  
Check the Right of the B Tree (C, finished B Tree!)  
Check the Right of the D Tree (It's a E Tree)  
Check the Left of the E Tree. (Nothing)  
Check the Right of the E Tree. (F, it's a leaf. Finish E Tree. Finish D Tree)...  
Onwards until...   
DONE: A, B, C, D, E, F, G, H, I, K  

3) POSTORDER: 
LEFT, RIGHT, ROOT  
DONE: A, C, B, F, E, D, H, K, I, G

ব্যবহার (ওরফে, কেন আমরা যত্ন করি):
গভীরতা প্রথম ট্র্যাভারসাল পদ্ধতিগুলির কীভাবে এবং কীভাবে তারা সাধারণত ব্যবহৃত হয় সেগুলির সহজ কোরা ব্যাখ্যাটি আমি সত্যিই উপভোগ করেছি:
"ইন-অর্ডার ট্র্যাভারসাল মানগুলি [বিএসটি (বাইনারি অনুসন্ধান ট্রি) এর জন্য] প্রিন্ট করবে] "
" [বাইনারি অনুসন্ধান ট্রি] এর একটি অনুলিপি তৈরি করতে প্রাক-অর্ডার ট্র্যাভারসাল ব্যবহার করা হয়। "
"পোস্টারর্ডার ট্রভারসালাল [বাইনারি অনুসন্ধান ট্রি] মুছতে ব্যবহৃত হয়।"
https://www.quora.com/What-is-the-use-of-pre-order-and-post-order-traversal-of-binary-trees-in-computing


2

আমি মনে করি উভয়কে এমনভাবে লিখতে আগ্রহী হবে যে কেবলমাত্র কোডের কয়েকটি লাইন পরিবর্তন করে আপনাকে একটি অ্যালগোরিদম বা অন্যটি উপহার দেয়, যাতে আপনি দেখতে পাবেন যে আপনার ডিলিমাটি এতটা শক্তিশালী নয় যা দেখে মনে হচ্ছে এটি প্রথমে রয়েছে ।

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

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

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

সুতরাং, আমার জন্য প্রাকৃতিক ঘটনাটি সত্যিকারের জীবনের প্রচারের মডেলটির সাথে (ট্রান্সভার্সিং) সবচেয়ে ভাল মেলে এমন মিথ্যার মধ্যে পার্থক্য।


1
আপনি এগুলি একই ধরণের অ্যালগোরিদম দিয়ে প্রয়োগ করতে পারেন, কেবল ডিএফএসের জন্য স্ট্যাক এবং বিএফএসের জন্য সারি ব্যবহার করুন। বিএফএসের সমস্যাটি হ'ল আপনাকে এ পর্যন্ত দেখা সমস্ত নোডের ট্র্যাক রাখা দরকার। পদার্থবিজ্ঞানে ডিএফএস .. আমি বিকল্প মহাবিশ্বগুলি কল্পনা করেছিলাম এবং আপনি জীবনের সাথে একটি চান, মূলের সমস্ত বাচ্চারা বিভিন্ন বিগ-বিংস এবং আপনি মহাবিশ্বের মৃত্যুর পথে চলে যান, জীবন নেই? আপনি সর্বশেষ দ্বিখণ্ডনে ফিরে যান এবং অন্যটি ঘুরে দেখার চেষ্টা করুন, যতক্ষণ না সমস্ত ক্লান্ত হয়ে যায় এবং আপনি পরবর্তী মহা-বিস্ফোরণে না গিয়ে নতুন মহাবিশ্বের জন্য নতুন শারীরিক আইন স্থাপন করেন। সুপার স্বজ্ঞাত। দাবা বোর্ডে ঘোড়াটির সাথে উপায় খুঁজে পাওয়া একটি ভাল সমস্যা।
juanmf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.