חלק א' עדי אונגר 28.11.2011 1 נושאי השיעור הגדרות בסיסיות  THE INCREMENTAL ALGORITHM  GIFT WRAPPING  GRAHAM SCAN  הערות חשובות  בפרק זה נעסוק בקבוצות סופיות של.

Download Report

Transcript חלק א' עדי אונגר 28.11.2011 1 נושאי השיעור הגדרות בסיסיות  THE INCREMENTAL ALGORITHM  GIFT WRAPPING  GRAHAM SCAN  הערות חשובות  בפרק זה נעסוק בקבוצות סופיות של.

Slide 1

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 2

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 3

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 4

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 5

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 6

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 7

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 8

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 9

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 10

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 11

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 12

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 13

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 14

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 15

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 16

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 17

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 18

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 19

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 20

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 21

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 22

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 23

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 24

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 25

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 26

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 27

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 28

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 29

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 30

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 31

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 32

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 33

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 34

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 35

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 36

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 37

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 38

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 39

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 40

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 41

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 42

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 43

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 44

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 45

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 46

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 47

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 48

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 49

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 50

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 51

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 52

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 53

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 54

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 55

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 56

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57


Slide 57

‫חלק א'‬

‫עדי אונגר‬
‫‪28.11.2011‬‬
‫‪1‬‬

‫נושאי השיעור‬
‫ הגדרות בסיסיות‬
THE INCREMENTAL ALGORITHM 
GIFT WRAPPING 
GRAHAM SCAN 

2

‫הערות חשובות‬
‫‪ ‬בפרק זה נעסוק בקבוצות סופיות של נקודות‪.‬‬
‫‪ ‬קבוצת נקודות אינה בהכרח סדורה‪.‬‬

‫‪3‬‬

‫אזור קמּור – ‪convex region‬‬
‫אזור ייקרא קמור אם כל שתי נקודות בו "רואות" אחת את‬
‫השנייה בתוך האזור‪.‬‬
‫דוגמאות‪:‬‬

‫אזור קמּור‬

‫‪4‬‬

‫אזור לא קמּור‬

‫קְ מֹור – ‪convex hull‬‬
‫בהינתן קבוצה של נקודות ‪ ,S‬נרצה למצוא את הקְ מֹור שלה‪.‬‬

‫אינטואיציה‪:‬‬
‫נחשוב על כל נקודה מהקבוצה ‪ S‬כעל מסמר שנעוץ במישור‪.‬‬
‫אם ניקח גומייה‪ ,‬נמתח אותה כך שתכיל את כל נקודות ‪S‬‬
‫ונשחרר‪ ,‬הצורה שתתקבל היא הקְ מֹור של ‪.S‬‬

‫‪5‬‬

‫קְ מֹור ‪ -‬הגדרה‬
‫הקְ מֹור הוא האזור הקמּור הקטן ביותר המכיל את נקודות ‪.S‬‬
‫למעשה‪ ,‬זהו החיתוך בין כל האזורים הקמורים המכילים את ‪.S‬‬

‫נסמן את הקמור של קבוצת נקודות ‪ S‬כך‪conv(S) :‬‬

‫‪6‬‬

‫דוגמה‬

‫הקמור של ‪S‬‬

‫‪7‬‬

‫אזור קמור המכיל את ‪S‬‬

‫תרגיל‬
‫האם הקְ מֹור הוא אכן אזור קמּור?‬
‫במילים אחרות אנו שואלים האם חיתוך של אזורים קמורים יוצר‬
‫אזור קמור‪.‬‬

‫‪8‬‬

‫תשובה‬
‫יהיו 𝑛𝑅‪ 𝑅1 ,𝑅2 , … ,‬אזורים קמורים‪.‬‬
‫ותהיינה 𝑏‪ 𝑎,‬נקודות המקיימות 𝑛𝑅 ∩ ⋯ ∩ ‪𝑎,𝑏 ∈ 𝑅1 ∩ 𝑅2‬‬
‫אז כל נקודה 𝑐 על הקטע )𝑏‪ (𝑎,‬מקיימת‪:‬‬
‫𝑛𝑅 ∩ ⋯ ∩ ‪𝑐 ∈ 𝑅1 ∩ 𝑅2‬‬
‫לכן 𝑛𝑅 ∩ ⋯ ∩ ‪ 𝑅1 ∩ 𝑅2‬בעצמו קמור‪.‬‬
‫הערה‪ :‬הטענה נכונה גם עבור‬
‫חיתוך של אינסוף אזורים קמורים‪.‬‬
‫‪9‬‬

‫תכונה של הקְ מֹור‬
‫קְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע‪.‬‬

‫בפרט‪ ,‬הקְ מֹור של קבוצת נקודות ‪ S‬הוא מצולע קמּור‪.‬‬

‫‪10‬‬

‫האם ההגדרה שהצענו לקְ מֹור "טובה"?‬
‫נשים לב שההגדרה שנתונה לנו מקשה עלינו לבנות אלגוריתם‬
‫למציאת קמור כיוון שעלינו לעבור על מספר אינסופי של אזורים‬
‫קמורים המכילים את ‪.S‬‬
‫נציע הגדרה נוספת‪.‬‬

‫‪11‬‬

‫אבחנה‬
‫נשים לב שלכל שתי נקודות ‪ a,b‬באזור קמור ‪ R‬מתקיים שגם‬
‫הקטע הישר )‪ (a,b‬נמצא כולו ב‪.R-‬‬
‫לכן‪ ,‬כל נקודה על הקטע )‪ (a,b‬גם היא ב‪.R-‬‬
‫נכתוב את הקטע )‪ (a,b‬כך‪:‬‬
‫}‪{ 𝑛𝑎 + 𝑚𝑏 | 𝑛, 𝑚 ≥ 0 𝑎𝑛𝑑 𝑛 + 𝑚 = 1‬‬
‫* ‪ m,n‬אינם בהכרח שלמים‪.‬‬

‫‪12‬‬

‫צירוף קמּור – ‪convex combination‬‬
‫בהכללה על מספר כלשהו של נקודות נקבל‪:‬‬
‫צירוף קמור של נקודות } 𝑛𝑝‪ 𝑠 = {𝑝1 ,...,‬הוא מהצורה‬
‫}‪{𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 |𝜆𝑖 ≥ 0 𝑎𝑛𝑑 𝜆𝑖 = 1‬‬

‫‪13‬‬

‫צירוף קמּור ‪ -‬אינטואיציה‬
‫עבור שלוש נקודות ‪ , 𝑝1 ,𝑝2 ,𝑝3‬הצירוף הקמור הוא‬
‫‪{𝜆1 𝑝1 + 𝜆2 𝑝2 + 𝜆3 𝑝3 𝜆1,2,3 ≥ 0 𝑎𝑛𝑑 𝜆1 + 𝜆2 + 𝜆3 = 1‬‬
‫לדוגמה‪:‬‬
‫‪1‬‬
‫𝑝‬
‫‪3 3‬‬

‫‪+‬‬

‫‪𝑝1 + 𝑝2‬‬

‫‪2 1‬‬
‫‪3 2‬‬

‫=‬

‫‪1‬‬
‫‪+ 𝑝3‬‬
‫‪3‬‬

‫‪𝑝3‬‬

‫‪𝑝2‬‬
‫‪14‬‬

‫‪𝑝1‬‬

‫‪1‬‬
‫‪+ 𝑝2‬‬
‫‪3‬‬

‫‪1‬‬
‫𝑝‬
‫‪3 1‬‬

‫משפט‬
‫עבור קבוצת נקודות 𝑛𝑝‪𝑠 = 𝑝1 ,...,‬‬
‫הקְ מֹור של ‪ S‬הוא קבוצת כל הצירופים הקמורים של ‪.S‬‬

‫‪15‬‬

‫הוכחה‬
‫תהי ‪ M‬קבוצת כל הצירופים הקמורים של ‪:S‬‬
‫𝑛‬

‫‪𝑀 = 𝜆1 𝑝1 + ⋯ + 𝜆𝑛 𝑝𝑛 𝜆𝑖 ≥ 0,‬‬

‫}‪𝜆𝑖 = 1‬‬
‫‪𝑖=1‬‬

‫נרצה להראות )‪.M=conv(S‬‬
‫כלומר נראה )𝑆(𝑣𝑛𝑜𝑐 ⊆ 𝑀 וגם 𝑀 ⊆ )𝑆(𝑣𝑛𝑜𝑐‪.‬‬

‫‪16‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫קל לראות שמתקיים 𝑀 ⊆ 𝑆‪.‬‬
‫לכן‪ ,‬מספיק לנו להוכיח ש‪ M-‬הוא אזור קמּור‪.‬‬

‫יהיו 𝑀 ∈ 𝑏‪ 𝑎,‬ונראה שהקטע )‪ (a,b‬גם הוא ב‪.M-‬‬
‫𝑀 ∈ 𝑎 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛𝜆 ‪𝑎 = 𝜆1 𝑝1 + ⋯ +‬‬
‫𝑀 ∈ 𝑏 ולכן ניתן לכתוב אותו 𝑛𝑝 𝑛 ‪𝑏 = 𝜆′1 𝑝1 + ⋯ + 𝜆′‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬
‫‪17‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כיוון ראשון ‪𝑐𝑜𝑛𝑣(𝑆) ⊆ 𝑀 -‬‬
‫נראה שכל נקודה על הקטע )‪ (a,b‬ניתן לכתוב כך‪:‬‬
‫𝑖𝑝) 𝑖 ‪(𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫= 𝑖𝑝 𝑖‪𝜆′‬‬

‫𝑚 ‪𝜆𝑖 𝑝𝑖 +‬‬

‫𝑛 = 𝑏𝑚 ‪𝑛𝑎 +‬‬

‫כאשר‪𝑛,𝑚 ≥ 0,𝑛 + 𝑚 = 1 :‬‬
‫ואכן‪ ,‬נשים לב שמתקיים‪:‬‬

‫‪𝑛𝜆𝑖 + 𝑚𝜆′ 𝑖 ≥ 0‬‬

‫‪𝜆′ 𝑖 = 𝑛 ∙ 1 + 𝑚 ∙ 1 = 1‬‬

‫‪18‬‬

‫𝑚 ‪𝜆𝑖 +‬‬

‫𝑛 = 𝑖 ‪𝑛𝜆𝑖 + 𝑚𝜆′‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫נראה שכל נקודה ב‪ M-‬נמצאת ב‪ conv(S)-‬באינדוקציה על ‪.n‬‬
‫מקרה הבסיס‪𝑀 = 𝑐𝑜𝑛𝑣 𝑆 = 𝑝1 :n=1 ,‬‬
‫נניח נכונות לקבוצת נקודות ’‪ S‬עם ‪ n-1‬נקודות‪.‬‬
‫נתבונן בקבוצה עם ‪ n‬נקודות } 𝑛𝑝‪𝑆 = {𝑝1 , … ,‬‬
‫לפי הנחת האינדוקציה כל נקודה ניתן לכתוב כך‪:‬‬
‫‪𝑥 = 𝜆′1 𝑝1 + ⋯ + 𝜆′ 𝑛−1 𝑝𝑛−1‬‬

‫‪𝜆′𝑖 = 1‬‬

‫‪𝜆′ 𝑖 ≥ 0 ,‬‬

‫וכל נקודה כזו מקיימת )𝑆(𝑣𝑛𝑜𝑐 ⊂ ) ‪𝑥 ∈ 𝑐𝑜𝑛𝑣(𝑆 ′‬‬
‫‪19‬‬

‫כיוון שני ‪𝑀 ⊆ 𝑐𝑜𝑛𝑣(𝑆) -‬‬
‫כעת‪ ,‬אנו יכולים לבחור‬

‫𝑖𝜆‬
‫) 𝑛𝜆‪(1−‬‬

‫= 𝑖‪𝜆′‬‬

‫ואז נקבל 𝑛𝜆 ‪𝜆1 + ⋯ + 𝜆𝑛−1 = 1 −‬‬
‫הבחירה הזו עדיין מקיימת את כל התנאים שהצבנו‪.‬‬
‫ומתקיים‪𝑐𝑜𝑛𝑣 𝑆 ′ ⊂ 𝑐𝑜𝑛𝑣 𝑆 ; 𝑥,𝑝𝑛 ∈ 𝑐𝑜𝑛𝑣(𝑆) :‬‬
‫מכיוון ששתי הנקודות בקמור אז גם כל הנקודות על הקטע ) 𝑛𝑝‪(𝑥,‬‬
‫ניתנת לכתיבה כך‪:‬‬
‫‪𝜆1‬‬
‫‪𝜆𝑛−1‬‬
‫𝑛𝜆 ‪1 −‬‬
‫‪𝑝1 + ⋯ +‬‬
‫𝑛𝑝 𝑛𝜆 ‪𝑝𝑛−1 +‬‬
‫𝑛𝜆 ‪1 −‬‬
‫𝑛𝜆 ‪1 −‬‬
‫ולכן כל נקודה על הקטע היא ב‪ conv(S)-‬כדרוש‪.‬‬
‫‪20‬‬

‫תרגיל‬
‫תהי ‪ S‬קבוצת נקודות עם לפחות ארבעה איברים‪.‬‬
‫הוכח שקיימת חלוקה של ‪ S‬ל‪A,B-‬‬
‫כך ש‪.𝑐𝑜𝑛𝑣(𝐴) ∩ 𝑐𝑜𝑛𝑣(𝐵) ≠ 𝜙-‬‬

‫‪21‬‬

‫תשובה‬

‫‪22‬‬

23

‫כיצד נייצג את הקְ מֹור?‬
‫לצורך מימוש בעזרת אלגוריתמים נבחר לייצג את הקמור כך‪:‬‬
‫הקמור הוא גבול המצולע )‪.conv(S‬‬

‫לכן‪ ,‬חישוב הקמור משמעותו חישוב צלעות המצולע )‪.conv(S‬‬

‫‪24‬‬

‫אינטואיציה‬
‫אם היו נותנים לנו פיסת נייר שעליה מסומנות נקודות‪,‬‬
‫אז קל לעין האנושית להבחין מהו הקמור של קבוצת הנקודות‪.‬‬

‫לעומת זאת‪ ,‬אם היו נותנים לנו פיסת דף שעליה‬
‫רשימת נקודות לפי )‪ (x,y‬היה לנו קשה יותר לזהות‬
‫את הקמור של הקבוצה‪.‬‬

‫‪25‬‬

‫אינטואיציה ‪ -‬המשך‬
‫קבוצת נקודות הנתונה כרשימה זהו האופן שבו המחשב‬
‫מתמודד עם הקלט‪.‬‬

‫באופן טבעי ניתן מיד להחליט שהנקודות הקיצוניות לפי ‪x‬‬
‫(הימנית ביותר והשמאלית ביותר) והנקודות הקיצוניות‬
‫לפי ‪( y‬הגבוהה ביותר והנמוכה ביותר) הן קודקודים של הקְ מֹור‪.‬‬
‫מציאת יתר נקודות הקְ מֹור זו משימה לא קלה‪.‬‬

‫‪26‬‬

‫דוגמה‬

‫‪27‬‬

‫רעיון האלגוריתם‬
‫האלגוריתם עובד באופן "אינדוקטיבי" –‬
‫נניח שהצלחנו למצוא את הקמור של ‪ k‬נקודות‪,‬‬
‫ונשתמש בו כדי למצוא את הקמור של ‪ k+1‬נקודות‪.‬‬
‫האלגוריתם מתבסס על מיון קבוצת הנקודות הנתונה לפי‬
‫קואורדינטת ה‪ x-‬שלהן‪.‬‬

‫‪28‬‬

‫הנחות על ‪S‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שתי נקודות עם אותו ערך ‪.x‬‬
‫אם בקבוצת הנקודות הנתונה יש שתי נקודות או יותר עם אותו ‪,x‬‬
‫אז בעזרת סיבוב קל של המישור אנו יכולים לקבל קבוצת נקודות‬
‫שבה אין שתי נקודות עם אותו ערך ‪.x‬‬
‫‪ ‬נניח שבקבוצה ‪ S‬אין שלוש נקודות על אותו ישר‪.‬‬

‫‪29‬‬

‫ישר משיק – ‪tangent line‬‬
‫יהי ‪ P‬מצולע קמור ותהי ‪ x‬נקודה על גבול ‪.P‬‬
‫ישר ‪ L‬יקרא תומך ב‪ P-‬בנקודה ‪ x‬אם מתקיים‪:‬‬
‫‪ L (1‬עובר דרך ‪x‬‬
‫‪ (2‬כל המצולע ‪ P‬נמצא באותו צד של הישר ‪L‬‬
‫ישר כזה יקרא משיק ל‪ P-‬בנקודה ‪.x‬‬

‫‪30‬‬

‫כיצד בונים את הקמור החדש?‬
‫נניח שיש בידנו קבוצת נקודות ממוינות לפי קואורדינטת ה‪x-‬‬
‫שלהן‪.‬‬
‫נתבונן בשלושת הנקודות הראשונות‪ .‬הקמור שלהן הוא המשולש‬
‫שקודקודיו הם הנקודות שבחרנו‪ .‬נסמן אותו ב‪.𝐻3 -‬‬
‫נניח שיש בידנו את 𝑘𝐻‪ ,‬הקמור של ‪ k‬הנקודות הראשונות‪.‬‬
‫נתבונן בנקודה ‪ 𝑝𝑘+1‬ונבנה את ‪.𝐻𝑘+1‬‬
‫ברור ש‪ 𝑝𝑘+1 -‬היא בקמור כי ערך ה‪ x-‬שלה מקסימלי‪.‬‬
‫מה לגבי יתר הקודקודים? ייתכן שעכשיו חלק מהם הפכו להיות‬
‫נקודות פנימיות‪.‬‬
‫‪31‬‬

‫כיצד בונים את הקמור החדש?‬
‫המטרה שלנו היא למצוא שתי נקודות ‪ a,b‬ב‪ 𝐻𝑘 -‬שמקיימות‪:‬‬
‫הישר העובר דרך ) ‪ (𝑎,𝑝𝑘+1‬והישר העובר דרך ) ‪ (𝑏,𝑝𝑘+1‬הם‬
‫משיקים ל‪.𝐻𝑘 -‬‬
‫בדרך זו אנו קובעים אלו נקודות צריכות להפוך להיות פנימיות‬
‫ואלו נקודות נשארות כקודקודים של הקמור‪.‬‬

‫‪32‬‬

RIGHT-OF-ְ ‫ ו‬LEFT-OF ‫פונקציות‬
𝑎𝑏-‫ משמאל ל‬c ‫ בודקת האם‬LEFT-OF(a,b,c)
𝑎𝑏-‫ מימין ל‬c ‫ בודקת האם‬RIGHT-OF(a,b,c)

1 𝑥𝑎
𝑠𝑖𝑔𝑛 1 𝑥𝑏
1 𝑥𝑐

𝑦𝑎
> 0 𝑖𝑓 LEFT−OF(𝑎, 𝑏, 𝑐)
𝑦𝑏
𝑦𝑐 < 0 𝑖𝑓 RIGHT−OF(𝑎, 𝑏, 𝑐)

33

‫האלגוריתם‬
‫‪(1‬‬
‫‪(2‬‬
‫‪(3‬‬
‫‪(4‬‬

‫‪34‬‬

‫נמיין את נקודות ‪ S‬לפי שיעור קואורדינטת ה‪ x-‬שלהם‪.‬‬
‫‪ 3‬הנקודות הראשונות יוצרות משולש – הקְ מֹור ההתחלתי‪.‬‬
‫נתבונן בנקודה הבאה לפי הסדר ב‪ ,S-‬נוסיף אותה לקְ מֹור‬
‫ונסיר את הנקודות שהופכות לפנימיות‪.‬‬
‫נמשיך בתהליך של הוספת נקודה בכל שלב‪ ,‬עד שנסיים‬
‫לעבור על כל נקודות ‪.S‬‬

‫דוגמת הרצה‬

‫‪35‬‬

‫ניתוח סיבוכיות‬
‫מיון נקודות ‪ S‬מתבצע ב‪𝑂(𝑛𝑙𝑜𝑔𝑛)-‬‬
‫לכל נקודה ב‪ S-‬אנו בודקים את גבולות הקְ מֹור הנוכחי‪.‬‬
‫במקרה הגרוע נצטרך לעבור על כל ‪ k-1‬גבולות הקְ מֹור‪.‬‬
‫לכן נקבל‪:‬‬

‫‪𝑛 𝑛−1‬‬
‫𝑛 ‪𝑛2‬‬
‫= ‪3 + 4 + ⋯+ 𝑛 − 1‬‬
‫= ‪− 1+2‬‬
‫‪− −3‬‬
‫‪2‬‬
‫‪2 2‬‬

‫לכן סה"כ סיבוכיות האלגוריתם היא ) ‪𝑂(𝑛2‬‬

‫‪36‬‬

‫שאלה‬
‫האם האלגוריתם תמיד מסיים ומוצא את הקְ מֹור?‬

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

‫‪37‬‬

‫שאלה‬
‫נגדיר את הקוטר של ‪ S‬להיות המרחק הגדול ביותר בין שתי‬
‫נקודות ב‪.S-‬‬
‫הראו שנקודות אלו הן קודקודים של הקְ מֹור‪.‬‬

‫‪38‬‬

‫תשובה‬
‫תהי ‪ S‬קבוצת נקודות במישור‪ ,‬ונניח ש‪ a,b-‬הן הנקודות עם‬
‫המרחק הגדול ביותר ביניהן‪.‬‬

‫‪39‬‬

‫נשים לב שניתן לסובב את קבוצת הנקודות שלנו כך‪:‬‬

‫הנקודות הקיצוניות על ציר ‪ x‬הן קודקודים של הקְ מֹור‬

‫‪40‬‬

41

‫מוטיבציה‬
‫במקום שהאלגוריתם יעבור על כל נקודות ‪,S‬‬
‫ננסה למצוא את נקודות הקמור באופן ישיר‪.‬‬

‫‪42‬‬

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

‫‪43‬‬

‫האלגוריתם‬
‫‪ (1‬נתחיל עם הנקודה התחתונה ביותר – נקודת העוגן‬
‫הראשונה‪.‬‬
‫‪ (2‬נשווה את הזוויות עם נקודת העוגן ונבחר את הנקודה‬
‫שיוצרת את הזווית הקטנה ביותר עם ציר ‪.X‬‬
‫‪ (3‬נחזור על התהליך ונשווה את הזוויות שנוצרות עם הנקודה‬
‫החדשה והקטע האחרון שהוספנו‪ ,‬עד שנחזור לנקודת‬
‫ההתחלה‪.‬‬

‫‪44‬‬

‫דוגמת הרצה‬

‫‪45‬‬

‫ניתוח סיבוכיות‬
‫בכל שלב עלינו לחשב זווית עם ‪ n-1‬נקודות‪,‬‬
‫כלומר כל שלב עולה לנו )‪.O(n‬‬

‫כמה שלבים כאלו אנו מבצעים?‬
‫כמספר הנקודות שיש לנו בקמור‪ ,‬נסמן מספר זה ב‪.h-‬‬
‫סה"כ סיבוכיות האלגוריתם היא )‪O(h∙n‬‬

‫‪46‬‬

‫שאלה‬
‫הראה שהנקודות שיוצרות את הזווית הקטנה ביותר עם הצלע‬
‫הקודמת הן בהכרח קודקודים בקְ מֹור‬

‫‪47‬‬

‫שאלה‬
‫הראה שניתן להחליף את השוואת הזוויות בפונקציות ‪,LEFT-OF‬‬
‫‪ RIGHT-OF‬שראינו קודם‬

‫‪48‬‬

‫שאלה‬
‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הגרועה ביותר ) ‪𝑂(𝑛2‬‬

‫הראו דוגמה לקבוצת נקודות שהרצת האלגוריתם עליה היא‬
‫בסיבוכיות הזמן הטובה ביותר‪ .‬מהי הסיבוכיות במקרה הזה?‬

‫‪49‬‬

50

‫רעיון האלגוריתם‬
‫במקום לחשב לכל נקודה בקמור את הזוויות שלה עם כל‬
‫נקודות ‪ ,S‬גרהאם חשב למיין מלכתחילה את הנקודות‬
‫לפי הזוויות שלהן‪.‬‬
‫כך‪ ,‬נוכל למצוא את הקמור בקלות יותר‪.‬‬

‫‪51‬‬

‫האלגוריתם‬
‫בהינתן קבוצת נקודות ‪ ,S‬נבחר נקודה שאנו יודעים בוודאות‬
‫שהיא חלק מהקמור (למשל‪ ,‬התחתונה ביותר)‪.‬‬
‫את יתר הנקודות נמיין לפי הזוויות שהן יוצרות עם נקודת העוגן‬
‫וציר ה‪ x-‬מהקטנה ביותר לגדולה ביותר‪.‬‬
‫כעת‪ ,‬נעבור על הנקודות לפי סדרן‪.‬‬

‫‪52‬‬

‫האלגוריתם ‪ -‬המשך‬
‫נסמן את קצה הקמור שמצאנו עד כה ב‪ ab-‬ונניח שברצוננו‬
‫לנסות להוסיף את נקודה ‪ - c‬הנקודה הבאה לפי סדר הזוויות‪.‬‬
‫נבדוק מהי הזווית הנוצרת ע"י ‪.abc‬‬
‫אם הזווית היא "פנייה ימינה" אז ‪ b‬אינה חלק מהקמור‪,‬‬
‫נסיר את ‪ b‬מהקמור ונחזור על הבדיקה עם הקצה החדש‬
‫של הקמור‪.‬‬
‫אם הזווית היא "פנייה שמאלה" אז נצרף את ‪ c‬לקמור‬
‫ונעבור לבדוק את הנקודה הבאה‪.‬‬

‫‪53‬‬

‫דוגמת הרצה‬

‫‪54‬‬

‫האלגוריתם‬
‫‪ (1‬נבחר את הנקודה התחתונה ביותר להיות נקודת העוגן שלנו‪.‬‬
‫‪ (2‬נמיין את נקודות ‪ S‬לפי הזווית שהן יוצרות עם נקודת העוגן‬
‫וציר ‪.x‬‬
‫‪ (3‬נעבור על הנקודות לפי הסדר‪ .‬נוסיף נקודות שיוצרות פניה‬
‫שמאלה ונסיר נקודות שיוצרות פניה ימינה‪.‬‬

‫‪55‬‬

‫סיבוכיות האלגוריתם‬
‫מיון נקודות ‪ S‬לפי זווית מתבצע ב‪.O(nlogn)-‬‬
‫כל נקודה מחושבת באלגוריתם לכל היותר פעמיים –‬
‫פעם ראשונה כאשר מוסיפים אותה‬
‫והפעם השנייה במידה והיא יוצרת "פנייה ימינה"‪.‬‬
‫נשים לב – נקודה שהוצאה מהקמור לא תחושב שוב!‬
‫לכן חיפוש נקודות הקמור מתבצע ב‪ O(n)-‬זמן‪.‬‬
‫סה"כ הסיבוכיות היא – )‪.O(nlogn‬‬

‫‪56‬‬

57