Web - Amazon

We provide Linux to the World


We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
חיפוש בינארי - ויקיפדיה

חיפוש בינארי

מתוך ויקיפדיה, האנציקלופדיה החופשית

חיפוש בינארי הוא אלגוריתם רקורסיבי למציאת מקומו של איבר במערך ממוין. לעיתים נקרא אלגוריתם זה גם אריה במדבר.

תוכן עניינים

[עריכה] מוטיבציה

ברשותינו מערך ממויין בגודל \ n שאיבריו ממוינים. ברצונינו למצוא את מקומו של איבר מסוים תוך ניצול מיון המערך. במעבר על כל אחד האיברים נמצא את מיקום האיבר בסיבוכיות \ O(n). מציאת האיבר ביעילות גדולה יותר פירושו מציאתו בדרך בעלת סיבוכיות קטנה יותר. מסתבר שבעזרת שיטת החיפוש הבינארי נוכל למצוא את מיקום האיבר בסיבוכיות של \ O(log(n)).

[עריכה] תיאור האלגוריתם

[עריכה] עקרון

נסתכל על המערך שברשותינו. נלך אל האיבר האמצעי. אם איבר זה הוא האיבר המבוקש הרי שמצאנו את מה שחיפשנו ונסיים כאן. אם לא, נבדוק מה היחס בין האיברים. אם האיבר המבוקש קטן יותר מאיבר זה, נביט בחציו השמאלי של המערך. אם האיבר המבוקש גדול יותר, נביט בחציו הימני של המערך. זאת בהנחה שהאיבר השמאלי ביותר במערך הוא הקטן ביותר ולו הימני ביותר הוא הגדול ביותר. כעת נחזור על כל מה שעשינו עם תת-המערך שברשותינו. במקרה הגרוע ביותר בו באף אחד מהמקרים לא היה האיבר האמצעי האיבר אותו אנו מבקשים, נגיע לתת-מערך בעל איבר אחד ואיבר זה חייב להיות האיבר שלנו. מובן, שניתן להפעיל גם את האלגוריתם עבור מקרה בו אנו מחפשים מיקומו של איבר שלא בהכרח קיים במערך, אז נבדוק אם גודל המערך 1 ואם אכן זהו גודלו ואינו מכיל את האיבר אזי נחזיר כי האיבר אינו במערך.

[עריכה] מימוש מילולי

הנחות והבהרות: המערך ממוין כך שאיבר השמאלי ביותר הוא הקטן ביותר. האיבר המבוקש נמצא במערך. גישה למקום מסוים במערך תתבצע כך: מערך[מקום_מסוים]. השמת ערך במשתנה תתבצע על ידי הסימן <- (חץ) ולו בדיקת שוויון תתבצע על ידי הסימן = (שווה).

חיפוש_בינארי(תחילת_מערך, סוף_מערך, ערך_מבוקש)

  1. אמצע <- 2 / (תחילת_מערך + סוף_מערך)
  2. אם מערך[אמצע] = ערך_מבוקש
    1. החזר אמצע
  3. אחרת,
    1. אם מערך[אמצע] < ערך_מבוקש
      1. חיפוש_בינארי( אמצע, סוף_מערך, ערך_מבוקש)
    2. אחרת,
      1. חיפוש_בינארי(תחילת_מערך,אמצע, ערך_מבוקש)

[עריכה] חישוב הסיבוכיות

בידינו מערך בגודל \ n כלומר יש בו \ n איברים. בכל איטרציה (הפעלת האלגוריתם) אנו מצמצמים את המערך פי 2, שכן אנו בטוחים שהאיבר אינו בחצי המערך השני ולכן אין אנו בודקים אותו יותר. לאחר איטרציה אחת יהיה גודל המערך \frac{n}{2}, לאחר שתי איטרציות יהיה גודלו \frac{n}{2^2}, לאחר שלוש איטרציות יהיה גודל המערך \frac{n}{2^3} וכן הלאה. התהליך ייגמר במקרה הגרוע ביותר כאשר גודל המערך הינו 1. אם התהליך כולו יימשך \ k איטרציות, יהיה גודל המערך \frac{n}{2^k}. אנו דורשים שגודל זה יהיה 1 ולכן נדרוש \frac{n}{2^k} = 1. נוציא \ log משני אגפי המשוואה ונקבל כי \ k = log(n).

קיבלנו כי סיבוכיות התהליך הינה \ O(log(n)). כלומר מספר הפעולות שאנו עושים קטן משמעותית (לוגריתמית) ממספר איברי המערך!

[עריכה] דוגמת הרצה

נסתכל על מערך המספרים: 1,1,2,3,5,8,13,21,34,55. סדרה זו ידועה בשם סדרת פיבונאצ'י, אך לצורך העניין כל שמעניין אותנו הוא עובדת היותם של מספרים אלה מסודרים בסדר עולה. כעת נסתכל על מערך שמכיל סדרה זו.

1 2 3 4 5 6 7 8 9 10
1 1 2 3 5 8 13 21 34 55

שים לב שהערכים בשורה העליונה הם המקומות במערך ולו הערכים בשורה התחתונה הינם הנתונים הנשמרים במערך. לדוגמה במקום השלישי במערך שמור הערך 2.

ננסה לחפש כעת, באמצעות אלגוריתם אריה במדבר, האם המספר 2 מופיע במערך. במערך עשרה איברים ולכן \ n=10.


1. אמצע <- 2 / (תחילת_מערך + סוף_מערך)

תחילת_מערך הינו מספורו של התא הראשון ובמקרה זה 1 ולו סוף_מערך הוא מיספורו של התא האחרון, במקרה זה 10. 10+1=11 ואם נחלק ב-2 נקבל 5 (במידה ואנו מעגלים כלפי מטה). אמצע כעת יהיה שקול למספר 5.

2. אם מערך[אמצע] = ערך_מבוקש

ערכו של המערך במקום החמישי הוא 5 וזה לא שווה לערך המבוקש, 2. לכן נדלג על שלב זה ונמשיך מיד לכיוון ה"אחרת".

3. אחרת,

3.1 אם מערך[אמצע] < ערך_מבוקש
5 אינו קטן מ-2 ולכן נמשיך אל עבר ה"אחרת" של תנאי זה.
3.2 אחרת,
3.2.1 חיפוש_בינארי(תחילת_מערך,אמצע, ערך_מבוקש)
משמע יש לשחזר את התהליך כולו אך הפעם סוף_מערך יהיה 5 ולא 10.


1. אמצע <- 2 / (תחילת_מערך + סוף_מערך)

תחילת_מערך הינו מספורו של התא הראשון ובמקרה זה 1 ולו סוף_מערך הוא מיספורו של התא האחרון, במקרה זה 5. 5+1=6 ואם נחלק ב-2 נקבל 3.

2. אם מערך[אמצע] = ערך_מבוקש ערכו של המערך במקום השלישי הוא 2 וזהו בדיוק הערך שבקשנו ולכן נכנס לתנאי זה ונמלא אחר ההוראות שם.

2.1 החזר אמצע
אנו מחזירים את המספר 3.


האלגוריתם החזיר 3, משמע שהמספר 2 קיים במערך והוא נמצא בתא מספר 3 ואכן זה נכון.

[עריכה] מקורות השמות

אלגוריתם זה דומה מאוד לשיטת חיפוש איבר בעץ חיפוש בינארי וכנראה שמכאן השם "חיפוש בינארי". מקור השם "אריה במדבר" כנראה נובע מדימוי הדרך בה מחפש מתמטיקאי אריה במדבר. המתמטיקאי מסתכל על המדבר, מחלקו לשני חלקים ובודק היכן האריה. כעת הוא ניגש לחלק המתאים וחוזר על פעולתיו עד אשר מגיע לאריה (כמובן ששיטה זו איננה מומלצת לחיפוש מעשי של אריה במדבר).

Our "Network":

Project Gutenberg
https://gutenberg.classicistranieri.com

Encyclopaedia Britannica 1911
https://encyclopaediabritannica.classicistranieri.com

Librivox Audiobooks
https://librivox.classicistranieri.com

Linux Distributions
https://old.classicistranieri.com

Magnatune (MP3 Music)
https://magnatune.classicistranieri.com

Static Wikipedia (June 2008)
https://wikipedia.classicistranieri.com

Static Wikipedia (March 2008)
https://wikipedia2007.classicistranieri.com/mar2008/

Static Wikipedia (2007)
https://wikipedia2007.classicistranieri.com

Static Wikipedia (2006)
https://wikipedia2006.classicistranieri.com

Liber Liber
https://liberliber.classicistranieri.com

ZIM Files for Kiwix
https://zim.classicistranieri.com


Other Websites:

Bach - Goldberg Variations
https://www.goldbergvariations.org

Lazarillo de Tormes
https://www.lazarillodetormes.org

Madame Bovary
https://www.madamebovary.org

Il Fu Mattia Pascal
https://www.mattiapascal.it

The Voice in the Desert
https://www.thevoiceinthedesert.org

Confessione d'un amore fascista
https://www.amorefascista.it

Malinverno
https://www.malinverno.org

Debito formativo
https://www.debitoformativo.it

Adina Spire
https://www.adinaspire.com