[Powered by Google Translate] [বাইনারি খোঁজো] [প্যাট্রিক Schmid - হার্ভার্ড বিশ্ববিদ্যালয়] [এটি CS50. - CS50.TV] যদি আমি দিয়েছেন বর্ণানুসারে ডিজনি অক্ষর নামের একটি তালিকা আপনি এবং আপনি Mickey মাউস খুঁজে জিজ্ঞাসা, কিভাবে আপনি এই কাজ করার চেষ্টা করা হবে? এক সুস্পষ্ট উপায় শুরুতে তালিকা থেকে স্ক্যান করা হবে এবং যদি এটা দেখতে Mickey প্রতি নাম চেক. কিন্তু হিসাবে আপনি Aladdin, এলিস, Ariel, পড়া এবং তাই ঘোষণা, আপনি তাড়াতাড়ি বুঝতে পারবেন যে তালিকা সামনে থেকে শুরু হওয়া বাঞ্ছনীয় ছিল না. হয়তো ঠিক আছে, আপনি তালিকার শেষে থেকে পিছন দিকে কাজ শুরু করা উচিত. এখন আপনি টারজান, সেলাই, স্নো হোয়াইট, এবং তাই ঘোষণা পড়া. এখনও, এই ভাল উপায় এটি সম্পর্কে যেতে ভালো বলে মনে হচ্ছে না. আচ্ছা, অন্য উপায় যে আপনি এই কাজ সম্পর্কে যেতে পারে যাও যাও নিচে সংকীর্ণ চেষ্টা হয় নামাবলী যে আপনি তাকান আছে. যেহেতু আপনি কি জানেন যে তারা অদ্যাক্ষর অনুক্রমে সাজানো হয়, আপনি শুধু নামের তালিকা মাঝখানে হত এবং যদি Mickey মাউস আগে বা পরে এই নামটি চেক. দ্বিতীয় কলামের নামের শেষ সময়ে খুঁজছি আপনি যে Mickey জন্য এম Jasmine জন্য J অবস্থার পর আসে বুঝতে চাই, যাতে আপনি শুধু তালিকার প্রথম অর্ধেক উপেক্ষা চাই. তারপর আপনি সম্ভবত শেষ কলামের উপরে তাকান চাই এবং এটা দেখতে যে Rapunzel শুরু. Mickey Rapunzel আগে আসে; দেখে মনে হচ্ছে আমরা শেষ কলাম উপেক্ষা হিসাবে ভাল করতে পারেন. অনুসন্ধান অব্যাহত কৌশল, দ্রুত আপনি দেখতে পাবেন যে Mickey নামের অবশিষ্ট তালিকার প্রথম অর্ধেক হয় এবং পরিশেষে Mickey Merlin এবং Minnie মধ্যে গোপন খুঁজে. আপনি ঠিক কি কি ছিল মূলত বাইনারি অনুসন্ধান. হিসাবে এই নামের বোঝা যায়, এটি একটি বাইনারি বিষয়ে তার অনুসন্ধানের কৌশল সঞ্চালিত হবে. এর মানে কি? সাজানো আইটেম তালিকা দেওয়া ভাল,, বাইনারি অনুসন্ধান অ্যালগোরিদম একটি বাইনারি সিদ্ধান্ত নেন - বাম বা ডান, এর চেয়ে বড় বা কম বর্ণানুক্রমে, আগে বা পরে - এ প্রতিটি বিন্দু. এখন যে আমরা একটি নাম যে এই অনুসন্ধান অ্যালগোরিদম সঙ্গে বরাবর যায় আছে, এর আরেকটি উদাহরণ যাক, কিন্তু এই সময়ের সঙ্গে সঙ্গে নম্বর অনুসারে সাজানো একটি তালিকা. বলুন, আমরা সাজানো সংখ্যার এই তালিকায় 144 নম্বর খুঁজছি হয়. ঠিক আগের মতই, আমরা সংখ্যা মাঝখানে যে খুঁজে - যা এই ক্ষেত্রে 13 - এবং যদি 144 থেকে বড় বা 13 এর কম দেখুন. যেহেতু এটা 13 পরিষ্কারভাবে তুলনায় বেশী, আমরা যা হয় 13 বা কম উপেক্ষা করতে পারেন এবং মাত্র অবশিষ্ট অর্ধেক মনোযোগ দিয়ে থাকি. যেহেতু এখন আমরা একটি এমনকি আইটেম সংখ্যা অবশিষ্ট আছে, আমরা শুধু একটি সংখ্যা যে পাসে মধ্যম নির্বাচন করুন. এই ক্ষেত্রে আমরা 55 নির্বাচন করুন. আমরা শুধু হিসাবে 89 সহজে পারে চয়ন. ঠিক আছে. আবার, 144 55 হয় তার চেয়ে অনেক বেশী, তাই আমরা ডানে যান. সৌভাগ্যবশত আমাদের জন্য, পরের মধ্যম নম্বর হল 144, আমরা এক খুঁজছেন. তাই আদেশ 144 একটি বাইনারি সার্চ ব্যবহার করে খুঁজে, আমরা কেবল 3 পদক্ষেপে সেটা খুঁজে পেতে সক্ষম. যদি আমরা এখানে রৈখিক অনুসন্ধান ব্যবহার করে, এটি গৃহীত পদক্ষেপসমূহ 12 হবে আমাদের. বস্তুত হিসাবে, যেহেতু এই অনুসন্ধানের পদ্ধতি আইটেম সংখ্যা অর্ধেক এটা প্রতিটি ধাপ তাকান আছে, এটি আইটেমটি অনুসন্ধানের পাবেন এ সম্পর্কে তালিকার আইটেম সংখ্যা লগ. এখন যে আমরা 2 উদাহরণ দেখা করেছি, যাক এর কটাক্ষপাত করা একটি recursive ফাংশন যে বাইনারি অনুসন্ধান কার্যকরী জন্য কিছু pseudocode. উপরের শুরু করে, আমরা দেখতে যে আমরা একটি ফাংশন আর্গুমেন্ট লাগে যে 4 খুঁজে আছে: কী, অ্যারে, কমপক্ষে, এবং সর্বোচ্চ. কি যে আমরা, জন্য পূর্ববর্তী উদাহরণে, তাই 144 খুঁজছেন. এরে হয় সংখ্যার তালিকা যে আমরা খঁুজতে হয়. ন্যূনতম এবং সবের্াচ্চ হয় সর্বনিম্ন এবং সর্বোচ্চ অবস্থানের সূচকগুলি আমরা বর্তমানে যে সময়ে হচ্ছে. সুতরাং যখন আমরা আরম্ভ, এবং কমপক্ষে শূন্য হতে সর্বোচ্চ অ্যারের সর্বোচ্চ সূচক হবে. হিসাবে আমরা নিচে অনুসন্ধান সীমিত করা, আমরা কমপক্ষে এবং সবের্াচ্চ আপডেট করা শুধু পরিসীমা যে আমরা এখনও সাইন ইন খুঁজছেন করা যাক আকর্ষণীয় অংশ প্রথমে এর লাফালাফি করা. প্রথম জিনিস আমরা না হয় মিডপয়েন্ট খুঁজে, সূচক halfway অ্যারের যে আমরা এখনও বিবেচনা করা হয় এবং কমপক্ষে সবের্াচ্চ মধ্যে যে হয়. তারপর অ্যারের মান এ আমরা যে মিডপয়েন্ট অবস্থান তাকান এবং যদি নম্বর যে আমরা খুঁজছেন সেটা যে কি কম দেখুন. যদি যে স্থান এ সংখ্যা কম, তাহলে অর্থ কি যে স্থান বাঁদিকে সব সংখ্যার চেয়ে বড়. সুতরাং আমরা বাইনারি অনুসন্ধান ফাংশন আবার কল করতে পারেন, কিন্তু এই সময় মাত্র অর্ধেক পড়া কমপক্ষে এবং সবের্াচ্চ পরামিতি আপডেট যে বড় কম বা তার সমান মূল্য আমরা শুধু দিকে তাকিয়ে যাও. অন্য দিকে, যদি চাবি অ্যারের বর্তমান মিডপয়েন্ট এ সংখ্যার চেয়ে কম, আমরা বাম যাও এবং যান সংখ্যা যা বৃহত্তর উপেক্ষা করতে চান. আবার, আমরা কমপক্ষে আপডেট এবং সর্বোচ্চ সীমার সঙ্গে বাইনারি অনুসন্ধান কিন্তু এই সময় কল শুধু নিচের অর্ধেক অন্তর্ভুক্ত. যদি অ্যারের মধ্যে বর্তমান সময়ে মিডপয়েন্ট মান তন্ন তন্ন বৃহত্তর না কী চেয়ে ছোট, তাহলে এটি কি সমান হতে হবে. সুতরাং, আমরা কেবল বর্তমান মিডপয়েন্ট সূচক, ফিরে যাবে এবং আমরা কাজ সম্পন্ন হয়. অবশেষে, এই জন্য এখানে চেক কেস হল যে সংখ্যা সে আসলে আমরা সংখ্যা অ্যারের মধ্যে অনুসন্ধান করা হয় না. যদি পরিসীমা সর্বোচ্চ সূচক যে আমরা খুঁজছি হয় হয় সর্বনিম্ন তুলনায় কম, মানে যে আমরা খুব বেশী দূরে চলে গেছে করেছি. যেহেতু সংখ্যা ইনপুট অ্যারের মধ্যে ছিল না, আমরা ফিরে -1 যাও যে কিছুই ইঙ্গিত পাওয়া যায় নি. আপনি লক্ষ্য করেছি যে জন্য এই অ্যালগরিদম কাজ থাকতে পারে, সংখ্যার তালিকা করা হয়েছে সাজানো যাও. অন্য কথায়, আমরা শুধুমাত্র 144 বাইনারি সার্চ ব্যবহার করে খুঁজে পেতে পারেন যদি সব সংখ্যার সর্বোচ্চ থেকে সর্বনিম্ন যাও আদেশ হয়. যদি এই কেস ছিল না, আমরা প্রতিটি পদক্ষেপ এ সংখ্যার অর্ধেক অগ্রাহ্য করতে পারব না. সুতরাং আমরা 2 অপশন আছে. হয় আমরা একটি পাঁচমিশালী তালিকা নিতে বাইনারি অনুসন্ধান ব্যবহার করার আগে এবং তা বাছাই করতে পারেন, অথবা আমরা নিশ্চিত যে সংখ্যার তালিকা হিসাবে আমরা তা যুক্ত সংখ্যা অনুসারে সাজানো হয় করতে পারেন. সুতরাং, পরিবর্তে বাছাই যখন আমরা অনুসন্ধান আছে, কেন তালিকা সব সময়ে সাজানো রাখা না? এক উপায় সংখ্যার একটি তালিকা রাখা সাজানো যখন একযোগে অনুমতি এক যুক্ত বা এই তালিকা থেকে সরানো সংখ্যা কিছু নামক একটি বাইনারি অনুসন্ধান বৃক্ষ দ্বারা ব্যবহার হয়. একটি বাইনারি অনুসন্ধান বৃক্ষ একটি ডেটা স্ট্রাকচার 3 বৈশিষ্ট্য আছে. প্রথমত, কোনো নোডের মধ্যে বাম subtree শুধুমাত্র মান কম বেশী রয়েছে সমান বা নোড এর মান. দ্বিতীয়ত, শুধুমাত্র ডান একটি নোডের মধ্যে subtree মান যে চেয়ে রয়েছে সমান বা নোড এর মান. এবং অবশেষে, উভয় সমস্ত নোড বাম এবং ডান subtrees এছাড়াও বাইনারি অনুসন্ধান বৃক্ষ. এর আগে আমরা একই নম্বর ব্যবহৃত একটি উদাহরণ যাক. জন্য আপনাদের মধ্যে যারা একটি কম্পিউটার বিজ্ঞান ট্রি আগে দেখেননি, আমাকে আপনি যে একটি কম্পিউটার বিজ্ঞান গাছ কৃত বৃদ্ধি দ্বারা আরম্ভ. হ্যাঁ, অসদৃশ গাছ আপনি অভ্যস্ত হয়, একটি কম্পিউটার বিজ্ঞান ট্রি রুট শীর্ষে, এবং পাতার নীচের অংশে হয়. প্রতিটি নোডের মধ্যে সামান্য বাক্স বলা হয়, এবং প্রতিটি নোডের অন্য প্রান্ত দ্বারা সংযুক্ত করা হয়. তাই এই ট্রি রুট একটি মান 13 সঙ্গে নোড মান, যা মান 2 5 34 এবং শিশুদের নোড আছে. একটি subtree হয় যে শুধু গাছ পুরো ট্রি একটি উপধারা এ খুঁজছেন দ্বারা গঠিত হয়. উদাহরণস্বরূপ, নোড 3 বাম subtree হয় গাছ নোড 0, 1, এবং 2 দ্বারা নির্মিত. সুতরাং, যদি আমরা একটি বাইনারি অনুসন্ধান বৃক্ষ বৈশিষ্ট্য ফিরে যান, আমরা দেখতে যে গাছ প্রতিটি নোডের মধ্যে সমস্ত 3 বৈশিষ্ট্য যেমন, কে কনর্ফাম করে, বাম subtree শুধুমাত্র মান যা কম বা সমান নোড এর মান উপস্থিত রয়েছে; ডান সমস্ত নোড এর subtree শুধুমাত্র মান যা অধিক কম বা তার সমান নোড এর মান উপস্থিত রয়েছে; এবং সমস্ত নোড উভয় বাম এবং ডান subtrees এছাড়াও বাইনারি অনুসন্ধান বৃক্ষ. যদিও এই গাছ দেখায় ভিন্ন, এই একটি বৈধ বাইনারি অনুসন্ধান বৃক্ষ সংখ্যার জন্য একই সেট. বস্তুত হিসাবে, অনেক সম্ভাব্য উপায় যা আপনি তৈরি করতে পারে একটি বৈধ এই সংখ্যা থেকে বাইনারি অনুসন্ধান বৃক্ষ. ওয়েল, আমি কি ফেরত প্রথম আমরা তৈরি যান. আমরা তাই এই গাছ দিয়ে কি করতে পারি? ভাল, আমরা সর্বনিম্ন এবং সর্বোচ্চ মান খুব সহজভাবে পেতে পারেন. সর্বনিম্ন মান বাম সর্বদা যাচ্ছে দ্বারা পাওয়া যেতে পারে পর্যন্ত কোনো নোড করা আছে. বিপরীতভাবে, সর্বোচ্চ এক খুঁজে সহজভাবে সঠিক যায় প্রতিটি সময় ডাউন. অন্য যে কোন নম্বর খোঁজা যে সর্বনিম্ন বা সর্বোচ্চ নয় শুধুমাত্র হিসাবে সহজ. বলুন, আমরা সংখ্যা 89 খুঁজছেন. আমরা কেবল প্রতিটি নোডের মান এবং চেক বাম বা ডান যান, এটা নির্ভর করবে নোড এর মান কম বা তার চেয়ে বড় আমরা এক খুঁজছেন. এ 13 রুট শুরু, তাই, আমরা দেখতে যে 89 এর থেকে বড়, এবং তাই আমরা ডান যান. তারপর আমরা 34 নোডের জন্য, দেখুন এবং আবার আমরা ডানে যান. 89 এখনও 55 তুলনায়, তাই এ মুহূর্তে আমরা যাব চালিয়ে যেতে. আমরা তখন 144 মান একটি নোডের সাথে আসা এবং বাম যান. দেখ দেখ এবং দেখ দেখ, 89 এই মুহুর্তে আছে. আরেকটি বিষয় যে আমরা কি করতে পারি একটি inorder ট্র্যাভেরসাল সম্পাদন দ্বারা মুদ্রণ সংখ্যা আউট. একটি inorder ট্র্যাভেরসাল সবকিছু মুদ্রণ বাম subtree আউট অর্থ মুদ্রণ নিজেই নোড দ্বারা অনুসরণ এবং তারপর মুদ্রণ ডান subtree সবকিছুই আউট দ্বারা অনুসৃত. উদাহরণস্বরূপ, আসুন আমাদের প্রিয় বাইনারি অনুসন্ধান বৃক্ষ গ্রহণ এবং সাজানো ক্রম সংখ্যা প্রিন্ট আউট. আমরা 13 root-এ শুরু, কিন্তু আমরা আউট মুদ্রণ মুদ্রণ 13 আগে আছে বাম subtree সবকিছুই. সুতরাং আমরা 5 যান. আমরা এখনও গাছ মধ্যে গভীর নামা পর্যন্ত আমরা বাম সবচেয়ে খুঁজে নোড আছে, যা হয় শূন্য. মুদ্রণ শূন্য পরে, আমরা আপ 1 ফিরে যান এবং যে আউট প্রিন্ট করা হবে. তারপর ডান subtree, যা 2 যাও আমরা যান এবং যে আউট প্রিন্ট করা হবে. এখন যে আমরা যে subtree সঙ্গে সম্পন্ন হলে, আমরা ফিরে যান 3 আপ এবং এটি মুদ্রণ করতে পারেন. অব্যাহত ব্যাক আপ, আমরা 5 মুদ্রণ এবং তারপর 8. এখন যে আমরা সমগ্র সম্পন্ন ছেড়ে subtree, আমরা 13 প্রদর্শন এবং ডান subtree কাজ শুরু করতে পারেন. আমরা 34 থেকে প্রস্থান করে, কিন্তু আমরা তার বাম subtree প্রিন্ট আউট মুদ্রণ 34 আগে আছে. তাই আমরা 21 মুদ্রণ আউট; তারপর আমরা 34 মুদ্রণ আউট এবং তার ডান subtree ভিজিট. যেহেতু 55 কোন বাম subtree আছে, আমরা এটি প্রিন্ট করবে এবং তার ডান subtree উপর অবিরত. 144 একটি বাম subtree আছে, এবং তাই আমরা প্রিন্ট আউট 89, 144 অনুসরণ, এবং পরিশেষে 233 ডানদিকে সবচেয়ে নোড. এখন পর্যন্ত আপনি এটি আছে; সব সংখ্যার সর্বোচ্চ থেকে সর্বনিম্ন করার প্রিন্ট আউট. গাছ কিছু যোগ করার পদ্ধতি তুলনামূলকভাবে যন্ত্রণাহীন হয় ভাল হিসাবে. সমস্ত আমরা কি নিশ্চিত যে আমরা 3 বাইনারি অনুসন্ধান বৃক্ষ বৈশিষ্ট্য অনুসরণ করা হয় না এবং তারপর মান যেখানে স্থান আছে সন্নিবেশ করুন. চলুন শুরু করা যাক বলতে আমরা 7 মান সন্নিবেশ করতে চান. যেহেতু 7 কম 13, আমরা বাম যান. কিন্তু 5 তার চেয়ে অনেক বেশী, তাই আমরা অধিকার তর্ক. যেহেতু এটি কম 8 এবং 8 পাতার একটি নোড, আমরা 8 বাম সন্তানকে 7 যোগ করুন. Voila! আমরা আমাদের বাইনারি অনুসন্ধান বৃক্ষ করেছি একটি সংখ্যা যোগ করা. যদি আমরা জিনিস যোগ করতে পারেন, আমরা ভাল জিনিষ হিসাবে ভালোভাবে মুছে দিতে সক্ষম হবেন. কিন্তু দুর্ভাগ্যবসত এর জন্য আমাদের, মুছে ফেলা হয় একটি সামান্য বিট আরো জটিল - , কিন্তু অনেক না অল্পমাত্র বিট. 3 বিভিন্ন পরিস্থিতিতে যে আমরা বিবেচনা আছে যখন বাইনারি অনুসন্ধান গাছ থেকে উপাদানগুলি মুছে ফেলা হচ্ছে. প্রথম, সহজে ক্ষেত্রে যে উপাদান একটি পাত নোড. এই ক্ষেত্রে, কেবল আমরা তা মুছে দিন এবং আমাদের ব্যবসার সঙ্গে যান. বলুন, আমরা 7 যে আমরা যোগ মুছে ফেলতে চান. ওয়েল, কেবলমাত্র আমরা সেটা খুঁজে, এটি, অপসারণ এবং যে এটি. পরবর্তী ক্ষেত্রে যদি নোড শুধুমাত্র 1 শিশু আছে. এখানে আমরা নোড মুছে দিন, কিন্তু আমরা প্রথম নিশ্চিত করতে পারেন যাও subtree যে এখন হয় মাতাপিতৃহীন বাকি সংযোগ নোডের মধ্যে ঊর্ধ্বতন শুধু আমরা মোছা. বলুন, আমরা আমাদের গাছ থেকে 3 মুছে ফেলতে চান. আমরা যে নোডের চাইল্ড উপাদান এবং গ্রহণ করা নোডের অভিভাবক তা জোড়া. এই ক্ষেত্রে, এখন আমরা 5 করছি 1 সংযুক্ত. এই একটি সমস্যা ছাড়াই কাজ করে, কারণ আমরা জানি, যাও বাইনারি অনুসন্ধান বৃক্ষ সম্পত্তি অনুযায়ী, 3 বাম subtree যে সবকিছু ছিল কম 5. এখন যে 3 এর subtree যত্ন নেওয়া হয়, আমরা এটি মুছে দিতে পারেন. তৃতীয় এবং চূড়ান্ত ক্ষেত্রে সবচেয়ে জটিল. এই পরিস্থিতিতে যখন নোড আমরা মুছে ফেলতে চান 2 সন্তান রয়েছে. এই যাও না, আমরা প্রথম নোডের যে পরবর্তী বৃহত্তম মান আছে খুঁজে আছে, দুই, swap এবং তারপর প্রশ্ন নোড মুছে দিন. নোড আছে যে পরবর্তী বৃহত্তম মান নিজেই আছে 2 শিশুদের না পারেন বিজ্ঞপ্তি যেহেতু তার বাম সন্তানের পরবর্তী বৃহত্তম জন্য ভাল প্রার্থী হবে. অতএব, 2 নোডের মধ্যে সোয়াপিং যাও 2 শিশুদের সঙ্গে একটি নোড মোছার পরিমাণ, এবং তারপর মুছে ফেলা 2 উপরোক্ত নিয়ম 1 দ্বারা পরিচালিত হয়. উদাহরণস্বরূপ, এর যাক বলতে আমরা রুট নোড, 13 মুছে ফেলতে চান. প্রথম জিনিস আমরা না হয় আমরা গাছ পরবর্তী বৃহত্তম মান খুঁজতে এই ক্ষেত্রে যা হয়, 21. আমরা তখন 2 নোড, swap 13 এবং 21 পাতার একটি কেন্দ্রিয় গ্রুপ নোড তৈরীর. এখন আমরা শুধু 13 মুছে দিতে পারেন. পূর্ববর্তী হিসাবে উল্লিখিত, অনেক সম্ভাব্য উপায় একটি বৈধ বাইনারি সার্চ ট্রি করা আছে. দুর্ভাগ্যবশত আমাদের জন্য, কিছু অন্যদের চেয়ে খারাপ. উদাহরণস্বরূপ, কি হবে যখন আমরা একটি বাইনারি সার্চ ট্রি নির্মাণ থেকে একটি সংখ্যা অনুসারে সাজানো তালিকা? সমস্ত সঠিক সংখ্যা ঠিক হয় প্রতিটি পদক্ষেপে এ যোগ করা. যখন আমরা একটি নম্বর জন্য অনুসন্ধান করতে চান, আমরা কোন উপায় নেই কিন্তু শুধুমাত্র সঠিক সময়ে প্রতিটি পদক্ষেপ তাকান. এই রৈখিক অনুসন্ধান সব চেয়ে ভাল হয় না. যদিও আমরা এখানে তাদের আবরণ হবে না, অন্যান্য, আরো জটিল আছে, ডাটা স্ট্রাকচার যে নিশ্চিত হয়ে নেবেন যে এই না ঘটবে না. যাইহোক, এক সহজ যে কাজটা করাতে এই সমস্যা এড়ানোর করা সম্ভব হয় শুধু এলোমেলোভাবে ইনপুট মান রাখা. এটা অত্যন্ত অসম্ভাব্য যে র্যান্ডম সুযোগ দ্বারা একটি সংখ্যার shuffled তালিকা অনুসারে বাছাই করা হয়. এই যদি হয় কেস, ক্যাসিনো ব্যবসা থাকার জন্য দীর্ঘ হবে না. এখন পর্যন্ত আপনি এটি আছে. আপনি এখন বাইনারি অনুসন্ধান এবং বাইনারি অনুসন্ধান গাছ সম্পর্কে জানেন. আমি প্যাট্রিক Schmid, এবং এই CS50. [CS50.TV] এক সুস্পষ্ট উপায় তালিকা থেকে স্ক্যান করা হবে ... [হুইসেল] ... আইটেম সংখ্যা ... হাঁ [Laughs] ... 234 ... augh নোডের মধ্যে পোষ্ট. >> ইয়ে! যে ছিল -