Menu
Coddy logo textTech

Linear Search (חיפוש ליניארי)

עודכן לאחרונה

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

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

סיבוכיות זמן וזיכרון

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

צעד אחר צעד

צעדמה קורה
1מתחילים באינדקס 0, האיבר הראשון במערך.
2משווים את האיבר הנוכחי לערך המטרה.
3אם הם שווים, מחזירים את האינדקס הנוכחי (נמצא).
4אחרת זזים מקום אחד ימינה וחוזרים על הבדיקה.
5אם מגיעים לסוף המערך בלי התאמה, המטרה לא קיימת (מחזירים -1).

דוגמה מפורטת

חיפוש של 5 ב-[7, 3, 9, 1, 5, 8, 2]:

השוואהאינדקסאיברתוצאה
1077 ≠ 5: ממשיכים לסרוק.
2133 ≠ 5: ממשיכים לסרוק.
3299 ≠ 5: ממשיכים לסרוק.
4311 ≠ 5: ממשיכים לסרוק.
5455 = 5: נמצא באינדקס 4.

מתי להשתמש בחיפוש ליניארי

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

מימוש נקי של Linear Search שאפשר להריץ, ב-Python, JavaScript, Java, C++, C, Pseudocode. בחרו שפה, העתיקו את הקוד, או פתחו אותו טעון מראש בעורך האונליין של Coddy.

קוד Linear Search ב-Python

Python
1def linear_search(a, target):2    # Scan left to right until the target appears3    for i in range(len(a)):4        if a[i] == target:5            return i6    return -17
8
9nums = [7, 3, 9, 1, 5, 8, 2]10print("Index of 5:", linear_search(nums, 5))11print("Index of 4:", linear_search(nums, 4))
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על חיפוש ליניארי

מהי סיבוכיות הזמן של חיפוש ליניארי?
O(n) במקרה הממוצע ובמקרה הגרוע (ייתכן שהסריקה תצטרך לבקר בכל איבר) ו-O(1) במקרה הטוב, כשהאיבר הראשון הוא המטרה. הוא משתמש ב-O(1) זיכרון נוסף.
האם חיפוש ליניארי צריך נתונים ממוינים?
לא, וזה היתרון העיקרי שלו. חיפוש ליניארי עובד על נתונים לא ממוינים לגמרי, כי הוא בודק כל איבר לשוויון; הסדר אף פעם לא משנה. חיפוש בינארי, לעומת זאת, עובד רק על מערכים ממוינים.
מתי חיפוש ליניארי עדיף על חיפוש בינארי?
כשהנתונים לא ממוינים ומחפשים בהם רק פעם אחת (מיון קודם היה עולה O(n log n)), כשהאוסף זעיר, או כשיש רק גישה סדרתית, כמו זרם או רשימה מקושרת. לחיפושים חוזרים במערכים ממוינים, חיפוש בינארי מנצח.
האם חיפוש ליניארי זהה לחיפוש סדרתי?
כן, שני השמות מתארים את אותו אלגוריתם: סורקים את האיברים לפי הסדר עד שמוצאים את המטרה או שהאוסף נגמר.
כמה השוואות חיפוש ליניארי מבצע בממוצע?
אם המטרה קיימת ויכולה להיות בכל מקום בסבירות שווה, בערך n/2 השוואות בממוצע; אם המטרה לא קיימת, בדיוק n. הגדילה הליניארית הזו היא הסיבה שהוא נקרא חיפוש ליניארי.
איור של שפות התכנות ב-Coddy

לשלוט באלגוריתמים עם Coddy

להתחיל