বাইনারি ট্রি একটি অনুসন্ধান গাছ কিনা এবং সম্পূর্ণ শাখাগুলি গণনা করে কিনা তা পরীক্ষা করার জন্য অ্যালগরিদম


10

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

এখনও পর্যন্ত

void BST(tree T) {
   if (T == null) return
   if ( T.left and T.right) {
      if (T.left.data < T.data or T.right.data > T.data) {
        count = count + 1
        BST(T.left)
        BST(T.right)
      }
   }
}

তবে আমি সত্যিই এটিকে বের করতে পারি না। আমি জানি যে এই অ্যালগরিদম সমস্যার সমাধান করবে না কারণ বিবৃতিটি সত্য না হলে দ্বিতীয়টি গণনা শূন্য হবে।

এই কেউ আমাকে সাহায্য করতে পারে?


তুলনামূলক অপারেটরটি <নোডগুলিতে কীভাবে সংজ্ঞায়িত করা হয়?
জো

এটি বাইনারি অনুসন্ধানের গাছ না হলেও আপনি কি গণনাটি গণনা করতে চান?
জো

1
আপনার অ্যালগরিদম কি কিছু ফেরত দেওয়ার কথা, যেমন trueবা false?
জো

2
হতে পারে আপনার প্রথমে দুটি পৃথক ফাংশন সংজ্ঞায়িত করার চেষ্টা করা উচিত: একটি এটি বিএসটি কিনা তা যাচাই করার জন্য এবং একটি সম্পূর্ণ শাখা গণনা করার জন্য। এটি আরও পরিচালনাযোগ্য হওয়া উচিত।
sepp2k

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

উত্তর:


10

অন্যরা ইতিমধ্যে মন্তব্যে ইঙ্গিত করে বলেছে, আপনার এখানে দুটি অসম্পৃক্ত ফাংশন রয়েছে: গাছটি অনুসন্ধান গাছ কিনা তা পরীক্ষা করে নিখুঁত শাখা গণনা করা counting যদি অ্যাসাইনমেন্টটি বিশেষভাবে এটির জন্য কল না করে, আমি দুটি পৃথক ফাংশন লিখব।

আসুন প্রথমে সম্পূর্ণ শাখাগুলি গণনা করা দেখি। এর অর্থ একটি বাম শিশু এবং ডান সন্তান উভয়ই নোডগুলি গণনা করা। তারপর আপনি পাল্টা (বাড়ায় প্রয়োজন count = count + 1) যখন উভয় T.leftএবং T.rightঅ নাল হয় (না T.left.dataএবং T.right.data: ডেটা এই কাজের জন্য কোন ব্যাপার না)।

if (T.left and T.right) {
    count = count + 1

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

গাছটি অনুসন্ধান গাছ কিনা তা পরীক্ষা করার জন্য আপনাকে ডেটা মানগুলি পরীক্ষা করতে হবে। আপনি ইতিমধ্যে সঠিক তুলনা কাছাকাছি কিছু পেয়েছেন; একদম ঠিক না বিভিন্ন আকারের (খুব বড় নয়, 2 থেকে 5 নোড) কয়েকটি উদাহরণ লিখুন এবং কী ঘটে তা দেখতে আপনার অ্যালগরিদমটি তাদের উপর চালান।

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

অবশেষে, একবার আপনি উভয় ফাংশন পৃথকভাবে লিখতে পরিচালিত হয়ে গেলে এবং কয়েকটি পরীক্ষার জন্য আপনি সেগুলি পরীক্ষা করে নিলেন, সাবধানে একসাথে রাখুন (অ্যাসাইনমেন্টের প্রয়োজন হলে)।


ধন্যবাদ, আমি প্রশ্নটি আবার পড়েছি এবং এটি পৃথক পদ্ধতিতে অনুমান করা হয়েছিল।
ওঘমাওসিরিস

7

এই জাতীয় জিনিসগুলিতে, পিছনের দিকে চিন্তা করা প্রায়শই সহজ, তাই প্রথমে আপনার কী প্রয়োজন তা বিবেচনা করুন। আপনার বিবরণ থেকে, আসুন তাদের তালিকা দিন:

  • recursion
  • বৈধতা
  • সম্পূর্ণ নোডের গণনা

ঠিক আছে, এটি মোটামুটি সংক্ষিপ্ত তালিকা, এটি পরিচালনাযোগ্য হওয়া উচিত। আসুন একটি খালি পদ্ধতি দিয়ে শুরু করুন এবং আমি কী ঘটতে হবে তার বিবরণ যুক্ত করব।

valid_bst () {
}

এখন বৈধতা। আপনি কিভাবে বৈধতা পরীক্ষা করবেন? আড্ডায় আপনি বলেছিলেন যে একটি গাছ "যদি ... সমস্ত বাম শিশু পিতামাতার চেয়ে কম হয় এবং ডান সন্তানেরা পিতামাতার চেয়ে বড় হয়" " আমি নিশ্চিত যে আপনিও সাম্যকে মঞ্জুর করতে চেয়েছিলেন। হবে t.left.value <= t.value <= t.right.value

valid_bst () {
    This node is valid if t.left.value <= t.value <= t.right.value
}

তবে যদি বাচ্চাদের একজন নিখোঁজ হয়? আপনি যা বলেছেন তা থেকে, আমি বিশ্বাস করি যে আপনি জানেন যে নোডটি এখনও কার্যকর (যদি উভয়ই নিখোঁজ থাকে) missing আসুন এটি যোগ করুন, সামান্য পুনর্গঠন:

valid_bst () {
    This node is valid to the left if 
        there is no left child or 
        it is no greater than the current node.
    This node is valid to the right if 
        there is no right child or 
        it is no less than the current node.
    This node is valid overall if it is valid to the left and right.
}

ঠিক আছে, আমরা এখন জানি যে এই নোডটি বৈধ কিনা। পুরো গাছটি বৈধ কিনা তা আমরা কীভাবে পরীক্ষা করব? এটি কোনও অ্যারেতে নেই, সুতরাং আমরা সম্ভবত রৈখিকভাবে এটি লুপ করতে / চাই না। আপনার নিয়োগটি উত্তর দেয়: পুনরাবৃত্তি। কিন্তু আমরা কীভাবে পুনরাবৃত্তি ব্যবহার করে উত্তর জোগ করব? আমাদের কাছে এই নোডটি বৈধ কিনা, এবং বাম এবং ডান নোডগুলি বৈধ কিনা তা জিজ্ঞাসা করে ফলাফলগুলির তিনটি টুকরো অ্যাক্সেস রয়েছে। স্পষ্টতই গাছটি কেবলমাত্র বৈধ যদি সেগুলির তিনটিই সত্য।

valid_bst () {
    This node is valid to the left if 
        there is no left child or 
        it is no greater than the current node.
    This node is valid to the right if 
        there is no right child or 
        it is no less than the current node.
    This node is valid overall if it is valid to the left and right.
    Is the left child valid?
    Is the right child valid?
    This tree is only valid if this node and both its children are.
}

আপনি যদি মনোযোগ দিচ্ছেন তবে এটি আমাদের ফাংশনটি কী ফিরিয়ে নিতে হবে তা আমাদের জানায়।

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

এবং অবশ্যই আমি পুনরাবৃত্তি থামার শর্ত এবং নাল জন্য চেকের মতো কিছু বিবরণ রেখেছি left


6

উপরে আমার তিনটি মন্তব্য আপনার কোড নিয়ে সমস্যাগুলির জন্য তিনটি ইঙ্গিত।

  1. তুলনা অপারেটরটি কীভাবে নোড ডেটা টাইপ পরিচালনা করতে হবে তা আপনি ইতিমধ্যে নির্দিষ্ট করে না দিয়ে থাকেন, সম্ভবত দুটি নোডের সাথে সরাসরি তুলনা করলে যা চান তা তা করবে না। আপনি সম্ভবত যা বোঝাতে চেয়েছিলেন তা হ'ল নোডগুলিতে সঞ্চিত ক্ষেত্রগুলির তুলনা করাnode1.value < node2.value
  2. এই মুহুর্তে, আপনি কেবল গণনাতে যুক্ত করছেন যদি তৃতীয়টি ifসত্য হয়, আপনি কি নিশ্চিত যে এটিই করছিলেন ? যাইহোক, আপনি ডাবল চেক করতে চাইতে পারেন যে যদি বিবৃতি আপনি যা চান তা করে।
  3. আমি ধরে নিয়েছি যে গাছটি যদি বৈধ বিএসটি এবং অন্যথায় মিথ্যা হয় তবে আপনি সত্যটিতে ফিরে যেতে চান। যার অর্থ আপনি একটি বেস ক্ষেত্রে সর্বদা সত্য বা মিথ্যা ফিরে আসতে হবে এবং আপনার পুনরাবৃত্ত কলগুলির ফলাফলগুলিও আপনাকে ফিরিয়ে আনতে হবে।

প্রথম পয়েন্ট সম্পর্কে: এটি সিউডো কোড, তাই না? যতক্ষণ না উদ্দেশ্যটি পাঠকের কাছে জানানো হয় ততক্ষণ স্টাফগুলি সংজ্ঞায়িত করার কোনও কারণ নেই।
sepp2k

@ sepp2k এটি সত্য, এবং আমার মন্তব্য সম্ভবত সিউডো কোডের জন্য কিছুটা নিট-পিক। আমার অনুমান আমার বক্তব্যটি হ'ল দুটি নোডের তুলনা করার অর্থ কী তা আমাদের বুঝতে হবে। আপনার বক্তব্যটি হ'ল আমাদের ইতিমধ্যে এটি নিখুঁতভাবে বুঝতে হবে।
জো

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