Ngoaho91 এর উত্তর পরিপূরক।
এই সমস্যাটি সমাধানের সর্বোত্তম উপায় হ'ল সেগমেন্ট ট্রি ডেটা স্ট্রাকচার using এটি আপনাকে ও (লগ (এন)) এ এই জাতীয় প্রশ্নের উত্তর দেওয়ার অনুমতি দেয়, এর অর্থ আপনার অ্যালগোরিদমের মোট জটিলতা হবে ও (কিউ লগন) যেখানে প্রশ্নাবলীর সংখ্যা। আপনি যদি নিষ্পাপ অ্যালগরিদম ব্যবহার করেন তবে মোট জটিলতা হবেন O (Q n) যা স্পষ্টতই ধীর।
সেগমেন্ট গাছের ব্যবহারের ক্ষেত্রে একটি অপূর্ণতা রয়েছে। এটি প্রচুর স্মৃতি গ্রহণ করে তবে আপনি গতির চেয়ে স্মৃতি সম্পর্কে কম সময় যত্নশীল হন।
আমি এই ডিএস দ্বারা ব্যবহৃত অ্যালগরিদম সংক্ষেপে বর্ণনা করব:
সেগমেন্ট ট্রিটি বাইনারি অনুসন্ধান গাছের কেবল একটি বিশেষ কেস, যেখানে প্রতিটি নোড এটি নির্ধারিত রেঞ্জের মান ধারণ করে। মূল নোড, [0, n] এর সীমা নির্ধারিত হয়। বাম সন্তানের জন্য [0, (0 + n) / 2] এবং ডান সন্তান [(0 + n) / 2 + 1, n] সীমা নির্ধারণ করা হয়েছে। এভাবে গাছ তৈরি হবে।
গাছ তৈরি করুন :
/*
A[] -> array of original values
tree[] -> Segment Tree Data Structure.
node -> the node we are actually in: remember left child is 2*node, right child is 2*node+1
a, b -> The limits of the actual array. This is used because we are dealing
with a recursive function.
*/
int tree[SIZE];
void build_tree(vector<int> A, int node, int a, int b) {
if (a == b) { // We get to a simple element
tree[node] = A[a]; // This node stores the only value
}
else {
int leftChild, rightChild, middle;
leftChild = 2*node;
rightChild = 2*node+1; // Or leftChild+1
middle = (a+b) / 2;
build_tree(A, leftChild, a, middle); // Recursively build the tree in the left child
build_tree(A, rightChild, middle+1, b); // Recursively build the tree in the right child
tree[node] = max(tree[leftChild], tree[rightChild]); // The Value of the actual node,
//is the max of both of the children.
}
}
প্রশ্ন গাছ
int query(int node, int a, int b, int p, int q) {
if (b < p || a > q) // The actual range is outside this range
return -INF; // Return a negative big number. Can you figure out why?
else if (p >= a && b >= q) // Query inside the range
return tree[node];
int l, r, m;
l = 2*node;
r = l+1;
m = (a+b) / 2;
return max(query(l, a, m, p, q), query(r, m+1, b, p, q)); // Return the max of querying both children.
}
আপনার যদি আরও ব্যাখ্যা দরকার হয় তবে আমাকে জানান।
বিটিডাব্লু, সেগমেন্ট ট্রি একটি একক উপাদান বা ও (লগ এন) এ উপাদানগুলির একটি ব্যাপ্তির আপডেটও সমর্থন করে