একটি গাছ / গ্রাফ ট্র্যাভার করার সময় প্রথম প্রথম এবং গভীরতার মধ্যে পার্থক্য কী? যে কোনও কোডিং বা সিউডোকোড উদাহরণ দুর্দান্ত হবে।
একটি গাছ / গ্রাফ ট্র্যাভার করার সময় প্রথম প্রথম এবং গভীরতার মধ্যে পার্থক্য কী? যে কোনও কোডিং বা সিউডোকোড উদাহরণ দুর্দান্ত হবে।
উত্তর:
এই দুটি পদ একটি গাছ হাঁটার দুটি পৃথক পদ্ধতির মধ্যে পার্থক্য করে।
পার্থক্যটি প্রদর্শন করা সম্ভবত এটি সবচেয়ে সহজ। গাছটি বিবেচনা করুন:
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
যা গভীরতা-প্রথমে একটি প্রকরণ, যেখানে আমি গাছের উপরে হাঁটা পর্যন্ত প্রতিটি নোডে কাজ করি না। যাইহোক আমি তাদের বাচ্চাদের সন্ধানের জন্য নীচের পথে উচ্চ নোডগুলি পরিদর্শন করেছি ।
পুনরাবৃত্তিমূলক প্রয়োগে এই ট্র্যাভারসাল মোটামুটি প্রাকৃতিক (প্রথম "ওয়ার্ক" লাইনের পরিবর্তে উপরের "বিকল্প সময়" লাইনটি ব্যবহার করুন), এবং আপনি যদি একটি স্পষ্ট স্ট্যাক ব্যবহার করেন তবে খুব বেশি কঠিন নয় , তবে আমি এটিকে অনুশীলন হিসাবে ছেড়ে দেব।
A, B, D, C, E, F
- প্রথমটি উপস্থাপিত), ইনফিক্স ( D, B, A, E, C, F
- বাছাইয়ের জন্য ব্যবহৃত: একটি এভিএল ট্রি হিসাবে যুক্ত করুন তারপর ইনফিক্স পড়ুন) বা পোস্টফিক্স ( D, B, E, F, C, A
বিকল্প উপস্থাপিত) ট্র্যাভারসাল পেতে আপনি গভীরতা-প্রথম সংস্করণটি সংশোধন করতে পারেন । নামগুলি সেই অবস্থান দ্বারা দেওয়া হয় যেখানে আপনি রুটটি প্রক্রিয়া করেন। এটি লক্ষ করা উচিত যে ইনফিক্স কেবল বাইনারি গাছগুলির জন্য সত্যই উপলব্ধি করে। @ বাতব্রত এই নামগুলি ... আপনার জিজ্ঞাসার পর থেকে আপনি সম্ভবত ইতিমধ্যে জানেন।
এই চিত্রটি আপনাকে যে প্রসঙ্গে প্রস্থ এবং গভীরতা শব্দ ব্যবহার করা হয়েছে সে সম্পর্কে ধারণা দেওয়া উচিত ।
গভীরতা-প্রথম অনুসন্ধান অ্যালগরিদম এমনভাবে কাজ করে যা এটি যত তাড়াতাড়ি সম্ভব প্রারম্ভিক অবস্থান থেকে দূরে যেতে চায়।
এটি সাধারণত একটি Stack
স্মরণে ব্যবহার করে যে এটি কখন শেষ হবে যখন এটি কোনও শেষ প্রান্তে পৌঁছায়।
নিয়ম অনুসরণ করতে হবে: প্রথম প্রান্তিক এ টিপুন Stack
জাভা কোড:
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
।জাভা কোড:
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 আপনি যদি প্রারম্ভিক প্রান্ত থেকে একটি প্রদত্ত প্রান্তের সবচেয়ে ছোটতম পথটি খুঁজতে চেষ্টা করেন তবে এটি কার্যকর।
আশা করি এটি প্রশস্ত-প্রথম এবং গভীরতা-প্রথম অনুসন্ধানগুলি বোঝার জন্য যথেষ্ট। আরও পড়ার জন্য আমি রবার্ট ল্যাফোনের একটি দুর্দান্ত ডেটা স্ট্রাকচার বইয়ের গ্রাফ অধ্যায়টি সুপারিশ করব।
এই বাইনারি গাছ দেওয়া:
প্রস্থের প্রথম ট্র্যাভারসাল:
বাম থেকে ডানে প্রতিটি স্তর পেরিয়ে।
"আমি জি, আমার বাচ্চারা ডি এবং আমি, আমার পিতামহী হ'ল বি, ই, এইচ এবং কে, তাদের নাতিরা হ'ল এ, সি, এফ"
- 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
আমি মনে করি উভয়কে এমনভাবে লিখতে আগ্রহী হবে যে কেবলমাত্র কোডের কয়েকটি লাইন পরিবর্তন করে আপনাকে একটি অ্যালগোরিদম বা অন্যটি উপহার দেয়, যাতে আপনি দেখতে পাবেন যে আপনার ডিলিমাটি এতটা শক্তিশালী নয় যা দেখে মনে হচ্ছে এটি প্রথমে রয়েছে ।
আমি ব্যক্তিগতভাবে বিএফএসের ব্যাখ্যাটিকে একটি প্রাকৃতিক দৃশ্যকে বন্যারূপে পছন্দ করি: নিম্ন উচ্চতা অঞ্চলগুলি প্রথমে প্লাবিত হবে এবং তারপরেই উচ্চ উচ্চতা অঞ্চলগুলি অনুসরণ করবে। আপনি যদি ভূগোলের বইগুলিতে দেখেন যে ভূদৃশ্যগুলির উচ্চতা আইসোলিনগুলির মতো রয়েছে তবে এটি সহজেই বোঝা যায় যে বিএফএস একই সময়ে একই আইসোলিনের অধীনে সমস্ত অঞ্চল পূরণ করে, ঠিক যেমন এটি পদার্থবিদ্যার সাথে থাকবে। সুতরাং, উচ্চতাকে দূরত্ব বা ছোট আকারের ব্যয় হিসাবে ব্যাখ্যা করা অ্যালগরিদমের একটি সুন্দর স্বজ্ঞাত ধারণা দেয়।
এটি মনে রেখে আপনি নূন্যতম বিস্তৃত গাছটি সহজেই, সংক্ষিপ্ততম পথ এবং আরও অনেকগুলি মিনিমাইজেশন অ্যালগরিদমগুলি সন্ধান করতে প্রস্থের প্রথম অনুসন্ধানের পিছনে ধারণাটি সহজেই খাপ খাইয়ে নিতে পারেন।
আমি ডিএফএসের কোনও স্বজ্ঞাত ব্যাখ্যা এখনও দেখতে পাইনি (গোলকধাঁধা সম্পর্কে কেবল প্রমিত একটি, তবে এটি বিএফএস এক এবং বন্যার মতো শক্তিশালী নয়), সুতরাং আমার কাছে মনে হয় যে বিএফএস শারীরিক ঘটনার সাথে উপরের বর্ণনার সাথে আরও ভাল সম্পর্ক স্থাপন করেছে বলে মনে হচ্ছে, ডিএফএস যুক্তিসঙ্গত সিস্টেমে পছন্দসই ডিলিমার সাথে আরও ভাল সম্পর্কযুক্ত (যেমন মানুষ বা কম্পিউটার সিদ্ধান্ত নেয় যে কোন দাবা খেলা তৈরি করতে বা কোন গোলকধাঁধার বাইরে চলে যেতে পারে)।
সুতরাং, আমার জন্য প্রাকৃতিক ঘটনাটি সত্যিকারের জীবনের প্রচারের মডেলটির সাথে (ট্রান্সভার্সিং) সবচেয়ে ভাল মেলে এমন মিথ্যার মধ্যে পার্থক্য।