תכנות דינמי פרק 6, סעיפים -6, ב- Kleinberg/Tardos סכום חלקי מרחק עריכה הרעיון: במקום להרחיב פתרון חלקי יחיד בכל צעד, נרחיב כמה פתרונות אפשריים וניקח בסוף את הטוב ביותר.
סכום חלקי sum) (subset הקלט: סדרה של n מספרים טבעיים a,a,...,an.w וטבעי הפלט: תת-סדרה I עבורה i I ai W והסכום מקסימלי תחת האילוץ הזה. תרגיל בית: הראו שהאלגוריתמים החמדנים הבאים נכשלים.. נוסיף ל- I איברים לפי הסדר כל עוד סכומם לא עולה על W.. נמיין את הסדרה בסדר לא יורד ואז נפעיל את האלגוריתם ב-.
תכנות דינמי נחזיק טבלה OPT בגודל n+ על.W+ OPT(i,w) הוא תת-סדרה של האיברים הערך שסכומם w והסכום מקסימלי תחת אילוץ זה. ערכי התחלה:.OPT(,w) = OPT(i,) = ε OPT(i,w) הוא הטוב מבין שתי אפשרויות. עדכון: אפשרות אחת:.OPT(i-,w) אפשרות שנייה:.OPT(i-,w-ai), i a,a,...,ai
האלגוריתם Subset_Sum(a,n,W) אתחול for w to W do OPT(,w) ε; S(,w) for i to n do OPT(i,) ε; S(i,) for i to n do for w to W do if S(i-,w) > S(i-,w-ai) + ai then S(i,w) S(i-,w) OPT(i,w) OPT(i-,w) else S(i,w) S(i-,w-ai) + ai OPT(i,w) OPT(i-,w-ai), i end if end for end for return OPT(n,W) נחזיק טבלת עזר S שבה S(i,w) הוא סכום האיברים ב-( OPT(i,w. 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4
הסדרה:,, i w 4 4
תרגיל בית תארו אלגוריתם לחלוקת פסקה לשורות באורך L. הפסקה מורכבת ממילים באורכים שונים. סדרת האורכים נתונה כקלט. אסור לקטוע מילה בין שתי שורות. יש להשאיר רווח אחרי כל מילה בשורה, למעט המילה האחרונה בשורה. מטרתכם היא למזער את הסכום על השורות של ריבוע ההפרש בין L לאורך שורת הטכסט. 6
מרחק עריכה y ו- y מעל א ב. הקלט: שתי מחרוזות x הפלט: המספר המזערי של פעולות עריכה (הוספת אות, מחיקת אות, החלפת אות באות אחרת) אשר דרושות ל- y. y x על מנת להפוך את 7
דוגמאות מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת G T G C A A G T C C C A T G T C A A G G G C C A T C דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות ט מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת G T G C A A G T C C C A T G T C A A G G G C C A T C דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת G T G C A A G T C C C A T G T C A A G G G C C A T C דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת G T G C A A G T C C C A T G T C A A G G G C C A T C דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת דנ א של אדם: דנ א של שימפנזה: G G T G C A A G T C C C A T G T C A A G G G C C A T C 8
דוגמאות G G G T G C A A G T C C C A T G T C A A G G G C C A T C ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות G G G T G C A A G T C C C A T G T C A A G G G C C A T C ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת דנ א של אדם: דנ א של שימפנזה: 8
דוגמאות G G C G T G C A A G T C C C A T G T C A A G G G C C A T C ט ע מילה שגויה: ה צ ת ע צ ו ת מילה מתוקנת: ה צ ט ע צ ע ו ת דנ א של אדם: דנ א של שימפנזה: 8
הצגה בעזרת גרף התחלה G T C A A G G G C C A T C G T G C A A G T C C C A T סיום 9
x = m, y = n הצגה בעזרת גרף (המשך) G = (V,E) V = {,,,...,m} X {,,,...,n} E = {((i,j),(i+,j)): i < m j n} {((i,j),(i,j+)): i m j < n} {((i,j),(i+,j+)): i < m j < n} w((i,j),(i+,j)) = w((i,j),(i,j+)) = w((i,j),(i+,j+)) = [xi+ yj+] מחיקות הוספות החלפות אינדיקטור לתנאי מסלול מכוון מ-(, ) ל-( m,n ) מתאים לסדרת פעולות עריכה שממירות את x ל- y. נחפש מסלול עם משקל מינימלי.
Edit_Distance(x.m,y,n) for i to m do D(i,) i for j to n do D(,j) j האלגוריתם נחזיק טבלה D. הערך שנחשב ב-( D(i,j הוא המשקל המינימלי של מסלול מ-(, ) ל-( i,j ). for i to m do for j to n do D(i,j) = min{d(i-,j)+,d(i,j-)+,d(i-,j-)+[xi yj]} end for end for return D(m,n) סיבוכיות: זמן,O(mn) מקום.O(mn)
הוכחת נכונות נוכיח באינדוקציה על סדר החישוב של איברי D שלכל i,j הערך D(i,j) הוא המשקל המינימלי של מסלול מ-(, ) ל-( i,j ). בסיס האינדוקציה: האתחול מבטיח נכונות עבור הזוגות.j או = i שבהם = i,j צעד האינדוקציה: כל מסלול ל-( i,j ) חייב לעבור דרך אחד הצמתים (i-,j) או (i,j-) או,(i-,j-) ואז לשלם עבור הקשת הנוספת. הקטע עד הצומת הקודם חייב להיות מסלול במשקל מינימלי, אחרת אפשר להחליפו ולהוריד את המשקל הכולל. האלגוריתם בוחר במינימום בין שלוש האפשרויות. הערה: במימוש, די לשמור עמודות מקום O(m)
חישוב סדרת פעולות העריכה.m+ X n+ נשמור טבלה נוספת P בגודל P(i,j) יציין את הקשת האחרונה במסלול הערך ל-( i,j ). שמשקלו D(i,j) מ-(, ) P(i,j) {(i-,j), (i,j-), (i-,j-)} הדפסת המסלול: נקרא ל-(( m,n ) Edit_sequence(P; Edit_sequence(P; (i,j)) if (i,j) (,) then Edit_sequence(P; P(i,j)) if P(i,j) = (i-,j) then write(delete xi) else if P(i,j) = (i,j-) then write(insert yj) else if xi yj then write(substitute xi by yj) end if return הערה: קשה יותר להקטין את סיבוכיות המקום.