मूल रूप से, डीएफएस और BFS के बीच अंतर यह है कि एक डीएफएस के साथ आप एक ढेर पर वर्तमान नोड के बच्चों को धक्का है, तो वे पॉप और कार्रवाई की जाएगी से पहले, जबकि बीएफएस के लिए आप बच्चों को कतार के अंत में धक्का देते हैं, इसलिए उन्हें सब कुछ के बाद पॉप किया जाएगा और संसाधित किया जाएगा।
डीएफएस पुनरावर्ती रूप से कार्यान्वित करना आसान है क्योंकि आप कॉल स्टैक को ढेर के रूप में उपयोग कर सकते हैं। आप बीएफएस के साथ ऐसा नहीं कर सकते, क्योंकि आपको कतार की आवश्यकता है। बस समानता स्पष्ट करना, चलो पहले एक सतत कार्यान्वयन करने के लिए अपने डीएफएस कन्वर्ट:
//DFS
Tree.prototype.traverse = function (callback) {
var stack=[this];
var n;
while(stack.length>0) {
n = stack.pop();
callback(n.value);
if (!n.children) {
continue;
}
for (var i = n.children.length-1; i>=0; i--) {
stack.push(n.children[i]);
}
}
};
और अब बीएफ
//BFS
Tree.prototype.traverse = function (callback) {
var queue=[this];
var n;
while(queue.length>0) {
n = queue.shift();
callback(n.value);
if (!n.children) {
continue;
}
for (var i = 0; i< n.children.length; i++) {
queue.push(n.children[i]);
}
}
};
स्रोत
2015-11-14 03:07:28
आप 'साथ ढेर = stack.concat के लिए जगह ले सकता है (n.children) ' –
@AndrasSzell जो ओ (| वी | + | ई |) से ओ (| वी |^2 + | ई |) से एल्गोरिदम की जटिलता को बदल देगा, क्योंकि concat() एक नई सरणी आवंटित करता है। –
जेएस में ऐरे मूल रूप से एक हैशटेबल है, इसलिए कॉन्सट और पुश के बीच जटिलता में कोई अंतर नहीं है। –