1 00:00:00,000 --> 00:00:09,560 2 00:00:09,560 --> 00:00:13,120 >> ZAMYLA צ'אן: הדבר הראשון שאתה עשוי הודעה על תגלית היא שאנחנו כבר 3 00:00:13,120 --> 00:00:14,520 יש קוד שנכתב עבורנו. 4 00:00:14,520 --> 00:00:16,219 זה נקרא קוד הפצה. 5 00:00:16,219 --> 00:00:19,060 אז אנחנו לא רק בכתיבה שלנו קוד מחדש יותר. 6 00:00:19,060 --> 00:00:23,870 במקום זאת, אנחנו רק ממלאים את החללים בחלק הקוד קיים מראש. 7 00:00:23,870 --> 00:00:28,860 >> תכנית find.c מבקשת עבור מספרים כדי למלא את ערימת שחת, חיפושים 8 00:00:28,860 --> 00:00:33,260 ערימת שחת למחט משתמש שהוגש, והוא עושה זאת על ידי קריאה ומיון 9 00:00:33,260 --> 00:00:36,660 חיפוש, פונקציות מוגדרות בhelpers.c. 10 00:00:36,660 --> 00:00:38,740 אז find.c נכתב כבר. 11 00:00:38,740 --> 00:00:41,840 התפקיד שלך הוא לכתוב עוזרים. 12 00:00:41,840 --> 00:00:42,940 >> אז מה אנחנו עושים? 13 00:00:42,940 --> 00:00:45,270 אנחנו מיישמים שתי פונקציות. 14 00:00:45,270 --> 00:00:50,110 חיפוש, שמחזיר true אם ערך הוא נמצא בערימת השחת, חוזרים 15 00:00:50,110 --> 00:00:52,430 שקר אם הערך הוא לא בערימת השחת. 16 00:00:52,430 --> 00:00:59,060 ואז אנחנו גם מיישמים סוג שהוא, אשר ממיין את המערך בשם ערכים. 17 00:00:59,060 --> 00:01:01,120 אז בואו להתמודד עם חיפוש. 18 00:01:01,120 --> 00:01:04,550 >> חיפוש מיושם כיום כחיפוש ליניארי. 19 00:01:04,550 --> 00:01:06,620 אבל אתה יכול לעשות הרבה יותר טוב מזה. 20 00:01:06,620 --> 00:01:11,610 חיפוש ליניארי מיושם בO של n זמן, שהוא איטי למדי, למרות שזה 21 00:01:11,610 --> 00:01:14,920 ניתן לחפש בכל רשימה שניתנה לו. 22 00:01:14,920 --> 00:01:21,190 התפקיד שלך הוא ליישם חיפוש בינארי, שיש להפעיל בזמן O של n יומן. 23 00:01:21,190 --> 00:01:22,200 זה די מהר. 24 00:01:22,200 --> 00:01:24,240 >> אבל יש תניה. 25 00:01:24,240 --> 00:01:28,910 חיפוש בינארי יכול רק לחפש באמצעות רשימות ממוינות. 26 00:01:28,910 --> 00:01:31,450 מדוע זה כך? 27 00:01:31,450 --> 00:01:33,690 ובכן, בואו נסתכל על דוגמא. 28 00:01:33,690 --> 00:01:37,350 בהינתן מערך של ערכים, בערימת השחת, אנחנו הולכים להיות מסתכלים 29 00:01:37,350 --> 00:01:41,510 למחט, וזה למשל, המספר השלם 3. 30 00:01:41,510 --> 00:01:45,220 >> אופן שבו חיפוש בינארי עובד הוא ש אנו משווים את ערך אמצע 31 00:01:45,220 --> 00:01:49,430 המערך למחט, כמו איך פתחנו ספר טלפונים ועד לאמצע 32 00:01:49,430 --> 00:01:51,720 דף בשבוע 0. 33 00:01:51,720 --> 00:01:55,710 אז לאחר שהשווה הערך לאמצע את המחט, אתה יכול להשליך גם 34 00:01:55,710 --> 00:01:59,620 שמאל או חצי הימני של המערך על ידי הידוק הגבולות שלך. 35 00:01:59,620 --> 00:02:04,450 במקרה זה, שכן 3, המחט שלנו, היא פחות מ -10, ערך האמצע, 36 00:02:04,450 --> 00:02:07,060 ימין מאוגד יכול להקטין. 37 00:02:07,060 --> 00:02:09,470 >> אבל לנסות להפוך את הגבולות שלך חזק ככל האפשר. 38 00:02:09,470 --> 00:02:12,690 אם הערך האמצעי הוא לא המחט, אז אתה יודע שאתה לא צריך 39 00:02:12,690 --> 00:02:14,070 לכלול אותו בחיפוש שלך. 40 00:02:14,070 --> 00:02:18,390 אז זכותך מחויבת יכולה להדק את גבולות חיפוש רק טיפה יותר, 41 00:02:18,390 --> 00:02:22,840 וכן הלאה וכן הלאה, עד אתה מוצא את המחט שלך. 42 00:02:22,840 --> 00:02:24,580 >> אז מה עושה פסאודו הקוד נראה? 43 00:02:24,580 --> 00:02:28,980 ובכן, בזמן שאנחנו עדיין מחפשים דרך הרשימה ועדיין יש לי 44 00:02:28,980 --> 00:02:33,540 אלמנטים להסתכל ב, אנחנו לוקחים את האמצע של הרשימה ולהשוות את זה 45 00:02:33,540 --> 00:02:36,020 ערך אמצעי למחט שלנו. 46 00:02:36,020 --> 00:02:38,380 אם הם שווים, אז זה אומר שיש לנו מצאתי את המחט, ושאנחנו יכולים 47 00:02:38,380 --> 00:02:40,160 החזר אמיתי. 48 00:02:40,160 --> 00:02:43,940 >> אחרת, אם המחט היא פחות מ הערך האמצעי, אז זה אומר שאנו 49 00:02:43,940 --> 00:02:48,350 יכול לבטל את המחצית הימנית ופשוט חיפוש בצד השמאלי של המערך. 50 00:02:48,350 --> 00:02:51,860 אחרת, נצטרך לחפש צד ימני של המערך. 51 00:02:51,860 --> 00:02:55,470 ובסופו של הדבר, אם אין לך שום יותר אלמנטים יצאו לחפש אבל אתה 52 00:02:55,470 --> 00:02:58,030 לא מצא המחט שלך עדיין, אז אתה בתמורת שווא. 53 00:02:58,030 --> 00:03:02,960 בגלל המחט בהחלט לא בערימת השחת. 54 00:03:02,960 --> 00:03:06,200 >> עכשיו, דבר מסודר אחד על פסאודו זה קוד בחיפוש בינארי הוא שזה יכול 55 00:03:06,200 --> 00:03:11,000 להתפרש כאו איטרטיבי או יישום רקורסיבית. 56 00:03:11,000 --> 00:03:14,900 אז זה יהיה רקורסיבית אם אתה נקרא פונקציית החיפוש בתוך החיפוש 57 00:03:14,900 --> 00:03:18,400 לתפקד משני מחצית מהמערך. 58 00:03:18,400 --> 00:03:20,750 אנחנו נכסה רקורסיה קצת מאוחר יותר בקורס. 59 00:03:20,750 --> 00:03:23,210 אבל יודע שזה אופציה אם אתה רוצה לנסות. 60 00:03:23,210 --> 00:03:24,460