جستجوی باینری یک راه سریع برای یافتن یک آیتم در یک لیست مرتب شده است. این کار با تقسیم لیست به نصف کار می کند تا زمانی که مکان های ممکن را محدود کنید. در آموزش مقدماتی از جستجوی باینری برای حل بازی حدس زدن استفاده شده است.
جستجوی دودویی را می توان جستجوی لگاریتمی یا نیم بازه ای نیز نامید. به عنوان یک برنامه نویس، می توانید دانش کافی در مورد جستجوی باینری و همچنین پیچیدگی زمان درخت باینری به دست آورید و با انتخاب دوره برنامه نویسی پیشرفته از طریق KnowledgeHut می توانید راهنمایی های متخصص را دریافت کنید.
الگوریتم جستجوی باینری چیست؟
یک الگوریتم جستجوی دودویی، یکی از محبوب ترین تکنیک های جستجو، استفاده می شود. از این الگوریتم می توان برای مرتب سازی آرایه ها استفاده کرد. این تکنیک جستجو بر اساس استراتژی «تفرقه بینداز و غلبه کن» است. در هر تکرار، فضای جستجو به نصف کاهش می یابد. الگوریتم های جستجوی باینری یک مقدار خاص را در یک آرایه مرتب شده قرار می دهند. این الگوریتم جستجو از اصل تفرقه بیانداز و حکومت کن استفاده می کند. با این حال، بسیار سریع است و نیاز به مرتب سازی داده ها دارد. جستجو از وسط یک آرایه شروع می شود و سپس به سمت پایین یا نیمه بالایی دنباله حرکت می کند. اگر مقدار میانه کمتر از مقدار هدف باشد، جستجو باید بالاتر رود. اگر نه، باید روی قسمت نزولی آرایه تمرکز کند.
الگوریتم جستجوی دودویی می تواند یک روش بسیار کارآمد برای جستجو باشد، اما به ترتیبی نیاز دارد که کدام قسمت از آرایه ظاهر شود.
کاربردهای جستجوی باینری
- این الگوریتم می تواند عناصر را در یک آرایه مرتب شده به طور موثرتر جستجو کند.
- همچنین می توانید از آن برای انجام چند عملیات اضافی مانند یافتن کوچکترین یا بزرگترین عنصر آرایه استفاده کنید.
مزایای الگوریتم جستجوی باینری
- از تکنیک حذف نیمی از عناصر آرایه پیروی می کند و بنابراین کارآمدتر از جستجوی خطی برای مقادیر زیاد داده است.
- پیچیدگی زمان کمتر، به این معنی که زمان کمتری برای کامپایل نیاز دارد.
- این گزینه بهتر از جستجوی خطی است زیرا به جای پیمایش متوالی در هر عنصر، آرایه را به نصف تقسیم می کند.
محدودیت های الگوریتم های جستجوی باینری
- الگوریتم جستجوی دودویی را فقط می توان برای یک آرایه مرتب شده اعمال کرد.
- مرتب سازی و جستجوی عنصر مورد نظر در آرایه های کوچک مرتب نشده زمان بر خواهد بود. جستجوی باینری در این موارد توصیه نمی شود.
- این الگوریتم کمتر از یک الگوریتم جستجوی خطی برای جستجوهای درون حافظه در فواصل زمانی کوتاه محلی سازی شده است.
جستجوی باینری چگونه کار می کند؟
جستجوی دودویی یک راه سریع برای جستجوی لیست مرتب شده است.
برای پیاده سازی یک الگوریتم با استفاده از یک زبان برنامه نویسی، درک کامل الگوریتم ضروری است. ورودی ها چیست؟خروجی ها چیست؟کدام متغیرها باید ایجاد شوند و چه مقادیر اولیه؟برای محاسبه مقادیر دیگر و در نهایت محاسبه خروجی چه مراحل میانی باید انجام دهید؟اگر بتوان آنها را با استفاده از یک حلقه ساده کرد، این مراحل نباید تکرار شوند.
هدف اصلی جستجوی باینری ردیابی محدوده حدس های منطقی است.
جستجوی باینری به این صورت است:
- شمارنده را در وسط لیست قرار دهید.
- اگر مقدار یافت شده مطابقت داشته باشد، جستجو به پایان می رسد.
- اگر مقدار در نقطه میانی آن کمتر از مقداری باشد که یافت می شود، لیست به نصف تقسیم می شود. جستجو تا نیمه بالای لیست ادامه می یابد و نیمه پایینی را نادیده می گیرد.
- اگر مقدار در نقطه میانی بزرگتر از چیزی باشد که پیدا می شود، جستجو تا نیمه پایین ادامه خواهد یافت.
- جستجو تا وسط همه موارد باقی مانده ادامه دارد. مراحل 2 تا 4 را ادامه دهید.
نمونه هایی از جستجوهای باینری
الگوریتم های جستجوی دودویی اغلب "الگوریتمی که زندگی روزمره است" نامیده می شود. تقریباً خودکار است! اینها تنها چند نمونه از جستجوهای باینری هستند که ممکن است روزانه با آنها روبرو شوید.
1. لغت نامه ها
شما به طور ناگهانی دسترسی به اینترنت ندارید و نیاز به جستجوی آنلاین تعریف "wombat" دارید. این بدان معنی است که شما باید مانند اجداد اولیه خود رفتار کنید و به یک فرهنگ لغت فیزیکی برسید. می توانید با شروع از کلمات "A" و کار کردن در فرهنگ لغت برای رسیدن به "waldo" یک جستجوی خطی انجام دهید.
اما بیشتر مردم باهوشتر از آن هستند و به طور غریزی از روش جستجوی دودویی استفاده میکنند. ما به لیست های "W" مراجعه می کنیم و به بخش میانی می رویم. اگر "waldo" به ترتیب حروف الفبا کوچکتر از کلمه در صفحه وسط باشد، هر صفحه سمت راست را نادیده می گیریم. اگر "waldo" بزرگتر از کلمه در آن صفحه وسط باشد، صفحات سمت راست را نادیده می گیریم. سپس، ما به راه خود ادامه می دهیم تا آن را پیدا کنیم.
2. رفتن به کتابخانه
استفاده دیگر شامل عدم دسترسی به اینترنت است. برای یافتن کتابی به نام «عادات اتمی»، می توانید به کتابخانه محلی خود مراجعه کنید. اگر به صورت خطی در قفسه ها جستجو کنید، برای همیشه در آنجا خواهید ماند. در عوض، از حروف الفبا یا سیستم کد مانند سیستم اعشاری دیویی برای جستجوی دقیق تر استفاده کنید.
3. زمان استفاده از جستجوی باینری
از کشف اینکه جستجوهای دودویی همیشه در زندگی روزمره ما اتفاق می افتد شگفت زده خواهید شد. استفاده از جستجوهای باینری در زندگی روزمره طبیعی و مکرر است.
شما می توانید از الگوریتم های جستجوی دودویی برای یافتن یک عنصر در یک دنباله مرتب شده استفاده کنید. اگرچه آنها اهداف اضافی زیادی دارند. به عنوان مثال، یک نتیجه را می توان تحت یک جستجوی دودویی قرار داد.
تصور کنید که باید حداقل فضای مورد نیاز برای قرار دادن همه کارمندان در یک دفتر را پیدا کنید. سپس می توانید یک جستجوی دودویی برای یافتن اندازه پیشنهادی به جای مرور هر بعد به صورت متوالی انجام دهید. شما معمولاً اندازه حداکثر و حداقل را برای جستجوی باینری تخمین می زنید. سپس، یک مقدار وسط را بررسی کنید تا ببینید آیا میتوانید فاصله را به نصف کاهش دهید تا زمانی که پاسخ خود را پیدا کنید. این باعث صرفه جویی در زمان می شود و به ویژه هنگام در نظر گرفتن تغییرات احتمالی فضای اداری در هر فوت مربع مفید است.
همچنین میتوانید نمونههای مفید دیگری مانند تست کد و امتحانات، مصاحبه برای کارکنان فنی، چالشهای کد و وظایف را در کتابخانه بیابید.
4. پیاده سازی جستجوی باینری
دو نوع وجود دارد: پیاده سازی جستجوی باینری تکراری یا بازگشتی. روش های بازگشتی و تکراری O(logN) دارند، در حالی که روش تکراری از O(1) استفاده می کند. در حالی که پیاده سازی رویکرد بازگشتی آسان تر است، روش تکراری کارآمدتر است.
یک الگوریتم تکرار شونده همان عبارت تنظیم شده را چند بار تکرار می کند. این الگوریتم را می توان برای تکرار چندین بار مراحل مشابه با استفاده از عبارات حلقه (به عنوان مثال، حلقه، حلقه while، یا حلقه do-while) استفاده کرد.
از سوی دیگر، الگوریتمهای بازگشتی به تابعی بستگی دارند که به طور مکرر خود را فراخوانی میکند تا به شرایط پایه خود برسد (که شرط توقف نیز نامیده میشود).
پیچیدگی زمان و مکان جستجوی باینری
هر جسم فیزیکی در کیهان با فضا و زمان تعریف می شود. پیچیدگی فضا و زمان نیز می تواند اثربخشی یک الگوریتم را تعیین کند. اگرچه همه ما می دانیم که راه های زیادی برای حل یک مشکل برنامه نویسی وجود دارد، مهم است که بدانیم چگونه یک الگوریتم برای بهبود تجربه برنامه نویسی به خوبی کار می کند. دانستن چگونگی ارزیابی برنامه/الگوریتم با استفاده از پیچیدگی فضا و زمان، راهی عالی برای تعیین اثربخشی آن است. این به برنامه نویسان اجازه می دهد تا کارایی بیشتری داشته باشند.
میتوانید پیچیدگی الگوریتمهای جستجوی دودویی را در آینده از طریق دوره آنلاین KnowledgeHut Python کشف کنید. اجازه دهید به جای آن بر پیچیدگی زمانی تمرکز کنیم. وقت طلاست! ایده مختصری از پیچیدگی زمانی در جستجوی باینری و نحوه ارزیابی برنامه ای که بر اساس پیچیدگی زمانی است.
پیچیدگی زمانی چیست؟
پیچیدگی زمانی جستجوی دودویی زمانی است که برای اجرا به عنوان تابعی از طول ورودی طول می کشد. مدت زمان اجرای هر دستور کد را در یک الگوریتم اندازه گیری می کند. کل زمان اجرای یک الگوریتم را بررسی نمی کند. در عوض اطلاعاتی در مورد تغییرات (افزایش یا کاهش) در زمان اجرا به عنوان تابعی از عدد (افزایش) یا کاهش در یک الگوریتم ارائه میکند. طول ورودی تنها عامل تعیین کننده مدت زمان تکمیل کار است.
پیچیدگی فضا چیست؟
این عبارت، پیچیدگی فضایی جستجوی دودویی، راهی برای صحبت در مورد پیچیدگی زمانی است. به فضای ذخیره سازی یا فضای کاری که یک الگوریتم نیاز دارد اشاره دارد. نسبت مستقیمی با مقدار ورودی دریافتی الگوریتم دارد. پیچیدگی فضا را می توان به سادگی با محاسبه مقدار فضای استفاده شده توسط متغیرها در یک الگوریتم محاسبه کرد. اگر فضای کمتری وجود داشته باشد، الگوریتم سریعتر اجرا می شود. یادآوری این نکته مهم است که پیچیدگی فضا و زمان ارتباطی با هم ندارند.
مبانی جستجوی باینری
الگوریتم جستجوی دودویی یک عنصر خاص را در یک لیست با O (log n پیچیدگی) پیدا می کند، که در آن _n تعداد کل عناصر موجود در آن لیست را نشان می دهد. جستجوی باینری را نمی توان در لیست مرتب شده استفاده کرد. جستجوی باینری تنها زمانی قابل استفاده است که عناصر به ترتیب خاصی چیده شده باشند. جستجوی باینری نمی تواند با عناصری که به ترتیب متناوب یا تصادفی چیده شده اند کار کند.
جستجو با مقایسه نتایج جستجو با عنصر میانی در لیست شروع می شود. اگر عنصر جستجو مطابقت داشته باشد، نتیجه جستجو "عنصر یافت شده" نامیده می شود. اگر عنصر جستجو مطابقت داشته باشد، نتیجه "عنصر یافت شده" خواهد بود. اگر عنصر جستجو کوچکتر از عنصر میانی باشد، فرآیند را با فهرست فرعی در سمت چپ آن ادامه می دهیم. اگر عنصر جستجو بزرگ باشد، روند را برای لیست سمت راست عناصر میانی ادامه خواهیم داد. این روند تا زمانی ادامه می یابد که عنصر جستجوی مورد نظر در لیست پیدا شود یا تا زمانی که هیچ عنصر دیگری وجود نداشته باشد. اگر عنصر با عنصر جستجو مطابقت نداشته باشد، "عنصر در لیست یافت نشد" را برمی گرداند.
از این مراحل می توان برای پیاده سازی جستجوهای باینری استفاده کرد:
- مرحله اول: عنصر جستجو باید از کاربر حذف شود.
- مرحله دوم: عنصر میانی را در لیست مرتب شده پیدا کنید.
- مرحله سوم: عنصر جستجو را با عنصر میانی فهرست مرتب شده مقایسه کنید.
- مرحله چهارم: اگر هر دو عنصر مطابقت دارند، "Given element واقع شده است. "." را نمایش دهید. عملکرد را متوقف کنید.
- مرحله V: اگر عناصر مطابقت ندارند ، تأیید کنید که عنصر جستجو مورد نظر کوچکتر یا بزرگتر از وسط است.
- مرحله ششم: اگر عنصر جستجو از وسط کوچکتر است ، مراحل II ، III ، IV و V را برای زیرمجموعه سمت چپ عناصر میانی تکرار کنید.
- مرحله VII: برای یافتن صحیح Sublist برای عناصر میانی ، اگر عنصر جستجو از وسط بزرگتر باشد ، می توانید مراحل II ، IV و V را تکرار کنید.
- مرحله VIII: این روند را ادامه دهید تا زمانی که عنصر جستجو را در لیست قرار دهید یا تا زمانی که Sublist شما فقط یک عنصر را داشته باشد.
- مرحله IX: نمایش "عنصر یافت نشد" در.". لیست عناصر با عنصر جستجو مطابقت ندارد. عملکرد را متوقف کنید.
الگوریتم جستجوی باینری بازگشتی و تکراری
جستجوی باینری در دو نسخه ارائه می شود. نسخه بازگشتی جستجوی باینری o (log n) است و نسخه تکراری o (1) است. جستجوی باینری متفاوت است زیرا پیچیدگی فضایی متفاوتی دارد. نسخه تکراری جستجوی باینری کارآمدتر است ، حتی اگر اجرای آن ساده تر باشد.
جستجوی باینری یک تکنیک جستجو است که مقدار یک هدف یا کلید را در یک آرایه پیدا می کند. جستجوی باینری عناصر میانی و هدف یک آرایه را مقایسه می کند. اگر متفاوت باشد ، هدف از نتایج جستجو حذف می شود.
این الگوریتم جستجو مبتنی بر اصل تقسیم و فاتح است. جستجوی باینری به طور مشابه با تمام الگوریتم ها کار می کند ، که تقسیم و تسخیر می شوند. ابتدا آرایه بزرگ را به قسمتهای کوچکتر تقسیم می کند و سپس آن را به صورت بازگشتی یا تکراری حل می کند. بهترین الگوریتم برای این کار در صورتی است که داده ها در قالب مرتب شده قرار دارند. جستجوی باینری آرایه های بزرگ را به زیر مجموعه های کوچکتر تقسیم می کند. سپس به طور تکراری مشکل یا بازگشتی را حل می کند.
جستجوی باینری را می توان با استفاده از الگوریتم های تکراری و بازگشتی انجام داد. هر دو روش ممکن است برای همان کار استفاده شوند.
رویکرد تکراری
تجزیه و تحلیل بهترین پیچیدگی زمان جستجوی باینری
جستجوی باینری در بهترین حالت است:
- وسط لیست جایی است که باید عنصر را جستجو کنید.
- این امر به این دلیل است که این عنصر در مرحله اول قرار دارد و شامل 1 مقایسه است.
- بنابراین ، جستجوی باینری دارای O (1) به عنوان بهترین پیچیدگی زمان مورد است.
تجزیه و تحلیل میانگین پیچیدگی زمان مورد در جستجوی باینری
بگذارید تعداد مشخصی وجود داشته باشد: A1 ، A2 ،. A (n-1) ،
ما باید عنصر P. را پیدا کنیم
دو مورد امکان پذیر است:
- مورد 1: عنصر P را می توان در شاخص های مجزا یافت ، از 0 تا 1.
- مورد 2: در برخی موارد ، عنصر P ممکن است در لیست نباشد.
در موارد 1 و N موارد 2 وجود دارد. در کل موارد N+1 وجود دارد که باید در نظر گرفته شود.
اگر عنصر P در فهرست K یافت شود ، جستجوی باینری مقایسه K+1 را انجام می دهد.
عنصر در شاخص N/2 را می توان در 1 مقایسه با شروع جستجوی باینری از وسط یافت.
به طور مشابه ، در مقایسه 2 ، عناصر در شاخص N/4 و 3N/4 بر اساس نتیجه مقایسه 1 مقایسه می شوند.
در این خط ، در مقایسه 3 ، عناصر در فهرست N/8 ، 3N/8 ، 5N/8 و 7N/8 بر اساس نتیجه مقایسه 2 مقایسه می شوند.
بر این اساس ، ما می دانیم که:
- عناصر نیاز به 1 مقایسه: 1
- عناصر نیاز به 2 مقایسه: 2
- عناصر نیاز به 3 مقایسه: 4
بنابراین ، عناصری که به مقایسه I نیاز دارند: 2^(I-1)
حداکثر تعداد مقایسه = تعداد بار n به 2 تقسیم می شود به طوری که نتیجه 1 = مقایسه برای رسیدن به عنصر 1 = مقایسه ورود به سیستم است
من می توانم از 0 تا ورود به سیستم متفاوت باشم
- تعداد کل مقایسه ها = 1 * (عناصر نیاز به 1 مقایسه) + 2 * (عناصر نیاز به 2 مقایسه) +.+ logn * (عناصری که نیاز به مقایسه ورود به سیستم دارند)
- تعداد کل مقایسه ها = 1 * (1) + 2 * (2) + 3 * (4) +.+ logn * (2^(logn-1))
- تعداد کل مقایسه ها = 1 + 4 + 12 + 32 +.= 2^logn * (logn - 1) + 1
- تعداد کل مقایسه ها = n * (logn - 1) + 1
- تعداد کل موارد = n+1
- بنابراین ، میانگین تعداد مقایسه ها = (n * (logn - 1) + 1) / (n + 1)
- تعداد متوسط مقایسه = n * logn/(n+1) - n/(n+1)+1/(n+1)
- اصطلاح غالب n * logn / (n+1) است که تقریباً ورود به سیستم است. بنابراین ، میانگین پیچیدگی زمان مورد جستجوی باینری O (logn) است.
تجزیه و تحلیل پیچیدگی زمان بدترین حالت جستجوی باینری
پیچیدگی بدترین مورد جستجوی باینری در نظر گرفته می شود:
- عنصری را که به دنبال آن هستید در اولین یا آخرین فهرست جستجو کنید
- در این مثال ، تعداد مقایسه های مورد نیاز ورود به سیستم است.
- جستجوی باینری دارای O (logn) به عنوان بدترین پیچیدگی زمان است.
تجزیه و تحلیل پیچیدگی فضایی جستجوی باینری
- جستجوی باینری یک O (مجتمع فضایی ورود به سیستم در یک اجرای بازگشتی خواهد بود.
- جستجوی باینری به طور تکراری انجام می شود تا پیچیدگی فضا o (1) باشد.
- برای پیگیری تعداد عناصری که باید بررسی شوند ، دو متغیر لازم است. داده های اضافی لازم نیست.
- در بدترین حالت، مقدار logN از تماس های بازگشتی وجود خواهد داشت، و همه این تماس ها در حافظه ذخیره می شوند. در صورت وجود هرگونه مقایسه، تماس های بازگشتی در حافظه ذخیره می شوند. تجزیه و تحلیل پیچیدگی مورد متوسط ما نشان می دهد که O(logN) که حافظه متوسط است، به همین ترتیب در حافظه انباشته می شود.
فواید
الگوریتم جستجوی دودویی مزایای زیادی دارد:
- استفاده از هر مقایسه نیمی از لیستی را که برای جستجوهای بیشتر لازم نیست حذف می کند.
- این نشان می دهد که آیا عنصر مورد جستجو قبل یا بعد از موقعیت فعلی در لیست قرار دارد.
- از این اطلاعات می توان برای محدود کردن جستجوی شما استفاده کرد.
- این بسیار بهتر از جستجوهای خطی برای مجموعه داده های بزرگ عمل می کند.
نتیجه
الگوریتم های جستجوی دودویی بر برنامه نویسی غالب هستند. اگر به یادگیری ماشین و علم داده علاقه دارید، مطالعه الگوریتم های جستجوی باینری، بهترین و بدترین حالت جستجوی باینری و سایر موضوعات مرتبط ایده خوبی است. همچنین، می توانید از طریق KnowledgeHut دوره های علوم داده را به صورت آنلاین یاد بگیرید. این موضوع به دانش عملی و همچنین دانش نظری نیاز دارد. ما مفاهیم پیچیدگی زمانی جستجوی باینری را در این وبلاگ معرفی کردهایم و توضیح دادهایم که چرا باید در هر الگوریتمی که ایجاد میکنیم گنجانده شود. ما همچنین در مورد انواع مختلف پیچیدگی زمانی مورد استفاده برای انواع مختلف توابع آشنا شدیم.
در نهایت، ما یاد گرفتیم که چگونه ترتیبی را که در آن یک الگوریتم بر اساس تابع هزینه و تعداد عباراتی که باید اجرا شود، مشخص کنیم. دانستن پیچیدگی زمانی یک الگوریتم برای اندازه ورودی معین می تواند به ما در برنامه ریزی منابع و پردازش کارآمد نتایج کمک کند. دانستن پیچیدگی زمانی و پیچیدگی درخت جستجوی باینری الگوریتم شما می تواند به شما در انجام این کار کمک کند و شما را به برنامه نویس موثرتری برای مقابله با هر نوع پیچیدگی الگوریتم جستجوی باینری تبدیل کند.
سوالات متداول (سؤالات متداول)
1. پیچیدگی زمانی جستجو چقدر است؟
الگوریتم های جستجوی باینری از نظر پیچیدگی زمانی O(log n) هستند. O(1) زمانی که شاخص مرکزی با مقدار مورد نظر مطابقت داشته باشد، بهترین پیچیدگی خواهد بود.
2. بهترین پیچیدگی زمانی کدام است؟
O(n) بهترین پیچیدگی برای انواع درج است. پیچیدگی O(n) اغلب به عنوان پیچیدگی خطی شناخته می شود.
3. پیچیدگی زمانی در ساختار داده چیست؟
پیچیدگی زمانی به پیچیدگی محاسباتی یک الگوریتم اشاره دارد. این نشان می دهد که چقدر طول می کشد تا یک الگوریتم اجرا شود. پیچیدگی زمانی زمان صرف شده برای اجرای هر عبارت است. بنابراین، به شدت به اندازه داده ها بستگی دارد.
4. چرا جستجوی باینری بهتر از خطی است؟
جستجوی باینری یک مزیت عمده دارد: همه عناصر موجود در لیست را اسکن نمی کند. همه عناصر را اسکن نمی کند، بلکه فقط نیمه اول لیست را اسکن می کند. جستجوی دودویی سریعتر از جستجوی خطی است.