חלק א' עדי אונגר 28.11.2011 1 נושאי השיעור הגדרות בסיסיות THE INCREMENTAL ALGORITHM GIFT WRAPPING GRAHAM SCAN הערות חשובות בפרק זה נעסוק בקבוצות סופיות של.
Download ReportTranscript חלק א' עדי אונגר 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
חלק א'
עדי אונגר
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