recitation #9. q1 גרף מכוון מורכב מקבוצה של צמתים (nodes) ומקשתות...

Post on 19-Dec-2015

235 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Recitation #9

Q1ביניהם. כל קשת מכוונת המחברות(arcs) קשתות מכוונותומ( nodes)צמתים גרף מכוון מורכב מקבוצה של

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

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

    

ושאר איבריה i בגרף מכוון היא רשימה אשר האיבר הראשון בה הוא i של צומת (incidence list) רשימת סמיכותהיוצאת מצומת נכנסת קשת אליהם בגרף כל הצמתים כך למשל הרשימה iהם רשימת (4 3 2 1). היא

. אנו נייצג גרף מכוון על ידי רשימה אשר איבריה הם רשימות הסמיכות של כל 0G בגרף 1סמיכות של צומת צמתי הגרף.

שלעיל ייוצג כך:G0כך, למשל, הגרף

•( (1 2 3 4( )2 1 4( )3 1( )4 1 2( )5( )6 1 7 9( )7( )9) ) )‘ (define G0  

בגרף 5,7,9 אשר לא יוצאות ממנו קשתות מכוונות )כמו למשל הצמתים iשימו לב כי רשימת הסמיכות של צומת G0 מכילה את )i .בלבד

Q1.a המקבלת כפרמטר (nodes g)עליך להשלים את הגדרת הפרוצדורה )א.

גרף ביצוג שהגדרנו ומחזירה את רשימת הצמתים שלו. למשל:

לדוגמא:( (1 2 3 4( )2 1 4( )3 1( )4 1 2( )5( )6 1 7 9( )7( )9) ) )‘ (define

G0

( >nodes G0)( 1 2 3 4 5 6 7 9)

    

Solution Q1.a

(define (nodes g) (map car g))

Q1.bנייצג קשת מכוונת כזוג: קשת המכוונת מצומת ב. תיוצג j לצומת iאנו

המקבלת arcs. עליך להשליך את הגדרת הפרוצדורה (i . j)על ידי הזוג . לדוגמא:g ומחזירה את רשימת כל הקשתות של gכפרמטר את הגרף

(arcs G0)( (1.2) (1.3) (1.4) (2.1) (2.4) (3.1) (4.1) (4.2) (6.1) (6.7) (6.9) )

-incidence-list-toהפרוצדורה משתמשת בפרוצדורת העזר הפנימית arcs-list פרוצדורה פנימית זו מקבלת כפרמטר יחיד רשימת סמיכות .l

בגרף. היא מחזירה רשימה הכוללת את כל iשל צומת כלשהוא לצמתים בגרף. לדוגמא: iהקשתות המכוונות מ-

(incidence-list-to-arcs-list '(1 2 3 4))( (1.2) (1.3) (1.4))(incidence-list-to-arcs-list '(5))()

Q1.b

(define (arcs g)

(define (incidence-list-to-arc-list l)

______________________________________________________________________

______________________________________________________________________)

(accumulate

_______________________________________________________________________

_______________________________________________________________________

________________________________________________________________________))

Q1.b solution

(define (arcs g)(define (incidence-list-to-arc-list l)

(map (lambda (x) (cons (car l) x)) (cdr l))) (accumulate append null (map incidence-list-to-arc-list g)))

Q1.Cהפרוצדורה מימוש את להשלים שני (delete-node i g)עליך המקבלת

צומת וגרף iפרמטרים: g-מ המתקבל הגרף את מחזירה הפרוצדורה .g או נכנסות i ואת כל הקשתות היוצאות מ iכאשר מוחקים ממנו את הצומת

אליו. לדוגמא:

(delete-node 1 G0)( (2 4) (3) (4 2) (5) (6 7 9) (7) (9))

(define (delete-node i g)(map (lambda (lst) ____________________________________________ ____________________________________________________________)

(filter_____________________________________________________ g )

))

Q1.C SOLUTION

(define (delete-node i g) (map (lambda (lst) (filter (lambda (x) (not (= x i))) lst)) (filter (lambda (lst) (not (= (car lst) i))) g)))

Q1.D המקבלת שני (delete-list-of-nodes l g)עליך להשלים את מימוש הפרוצדורה

צמתים רשימת וגרף lפרמטרים: g הגרף את מחזירה הפרוצדורה ..l כאשר מוחקים ממנו את כל הצמתים ב gהמתקבל מ-

(define (delete-list-of-nodes l g)(accumulate

____________________________________________________________

____________________________________________________________

__________________________________________________________))

Q1.D SOLUTION

(define (delete-list-of-nodes l g)(accumulate delete-node g l))

Q1.Eהפרוצדורה מימוש את להשלים עליך זה . (nodes-with-arcs-to i g)בסעיף

. הפרוצדורה מחזירה את g וגרף iהפרוצדורה מקבלת שני פרמטרים: צומת . לדוגמא:i אשר יוצאת מהן קשת אל צומת gרשימת הצמתים ב-

(nodes-with-arcs-to 1 G0)(2 3 4 6)

(nodes-with-arcs-to 6 G0)()

(define (nodes-with-arcs-to i g)(map _______________________________________________________

(filter__________________________________________________ (arcs g))))

Q1.E SOLUTION

(define (nodes-with-arcs-to i g) (map car (filter (lambda (arc) (= (cdr arc) i)) (arcs g))))

Q1.Fבגרף היא קבוצת צמתים של הגרף אשר הגרף ( independent set)קבוצה בלתי תלויה

היא {1,5,7,9}אינו מכיל שום קשת בין שניים מהם. לדוגמא, קבוצת הצמתים (inedpendent-set g). בסעיף זה נממש את הפרוצדורה G0קבוצה בלתי תלויה בגרף

ומחזירה רשימה של צמתים המהוים קבוצה בלתי תלויה gהמקבלת כפרמטר גרף . המימוש מבוסס על הרעיון הבא. בכל שלב אנו בוחרים צומת כלשהוא מצמתי gשל

, מוסיפים אותו לקבוצה הבלתי תלויה שאנו בונים, ומוחקים אותו ואת כל iהגרף, ובין אם היא iבין אם הקשת יוצאת מ הצמתים המחוברים אליו בקשת מן הגרף )

(. כך אנו ממשיכים, עד שאנו מגיעים לגרף ריק. הפרוצדורה נכנסת אליוindependent-set מבצעת תהליך זה באופן רקורסיבי. עליך להשלים מימוש

פרוצדורה זו.

(define (independent-set g)(if (null? g) null

(cons __________________________________ (independent-set

___________________________________________________________________ ___________________________________________________________________ __________________________________________________________________ __________________________________________________________________))))

Q1.F SOLUTION

(define (independent-set g) (if (null? g) null (cons (caar g) (independent-set (delete-list-of-nodes (append (car g) (nodes-with-arcs-to

(caar g) g)) g)))))

Q2. הפרוצדורה k, ומספר שלם lst מקבלת שני פרמטרים: רשימה (suffix lst k)הפרוצדורה

-ית של הרשימה, כלומר רשימה הכוללת את כל k ה ( suffix)סיפאמחזירה את ה האיברים הראשונים. הפרוצדורהk למעט lstאיברי

(prefix lst k) מקבלת אף היא שני פרמטרים lst ו kרישא. היא מחזירה את ה. lst האיברים הראשונים של k-ית של הרשימה, כלומר רשימה הכוללת את kה

. לדוגמא:([length lst, )0] הוא מספר שלם בתחום: kבשני המקרים ניתן להניח ש-

(define lst '(a b c d e f g h)) (suffix lst 3)

(d e f g h) (suffix lst 1)

(b c d e f g h) (suffix lst 0)

(a b c d e f g h) (prefix lst 0)

() (prefix lst 4)

(a b c d)

Q2.a(define (suffix lst k) (if (= k 0)

____________________________________________________________

___________________________________________________________))

(define (prefix lst k) (if (= k 0)

____________________________________________________________

___________________________________________________________))

Q2.a solution

(define (suffix lst k) (if (= k 0) lst (suffix (cdr lst) (- k 1))))

(define (prefix lst k) (if (= k 0) null (cons (car lst) (prefix (cdr lst) (- k 1)))))

Q2.bרשימה (rotate lst k)הפרוצדורה פרמטרים: שני מקבלת lst ומספר ,

lst. היא מחזירה רשימה המתקבלת מ ([length lst, )0] בתחום kשלם מקומות. לדוגמא:k )שמאלה( ב lstעל ידי סיבוב איברי

(define lst '(a b c d e f g h)) (rotate lst 1) (b c d e f g h a)(rotate lst 4) (e f g h a b c d)(rotate lst 0) (a b c d e f g h)

(define (rotate lst k) ________________________________________________________________________ _______________________________________________________________________)

Q2.b Solution

(define (rotate lst k) (append (suffix lst k) (prefix lst k)))

Q2.Cשוות l2 ו l1 שתי רשימות של סימבולים. אנו נאמר כי l2 ו l1יהיו

אם ניתן לקבל את הרשימה השניה על ידי סיבוב ( cyclic-equalציקלית של הרשימה השניה )או להיפך(. לדוגמא:

> (is-cyclic-equal? '(a b c d) '(c d a b))#t> (is-cyclic-equal? '(a b c d) '(d a b c))#t> (is-cyclic-equal? '(a b c d) '(c a b d))#f

מקבל כקלט שתי רשימות של (is-cyclic-equal? l1 l2)הפרדיקט אחרת. f# אם הן שוות ציקלית, או t#סימבולים באורך שווה ומחזיר

הפרדיקט ממומש באופן איטרטיבי על ידי קריאה לפרוצדורה פנימית. עליך להשלים את מימוש פרוצדורה פנימית זו בתבנית הקוד שלהלן.

Q2.C

(define (is-cyclic-equal? l1 l2) (define (iter-helper lst k) (cond ( (= k (length lst)) _________) (_____________________________________ #t) (else (iter-helper ________________________ _______________________________________))))

(iter-helper l2 0))

Q2.C Solution

(define (is-cyclic-equal? l1 l2) (define (iter-helper lst k) (cond ( (= k (length lst)) #f) ( (equal? l1 lst) #t) (else (iter-helper (rotate lst 1) (+ k 1))))) (iter-helper l2 0))

Q2.D מקבלת רשימה אחת או יותר של cyclic-equal-to-anyהפרוצדורה

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

זהה ציקלית לאחת או יותר מן הרשימות איתן lst אם t#ומחזיר . לדוגמא:cyclic-equal-to-anyקראנו ל

(define proc (cyclic-equal-to-any '(one two three) '(alpha beta gamma)))

(proc '(two three one))#t

(proc '(gamma alpha beta))#t

(proc '(I like Mike))#f

Q2.D(define (cyclic-equal-to-any lst1 . other-lists) (define (compare-with-all-lists lst) (let ((all-lists (cons lst1 other-lists))) (accumulate ______________________________________________________ _______________________________________________________

(map___________________________________________________ ________________________________________________)))) ____________________________________________________________)

Q2.D Solution

(define (cyclic-equal-to-any lst1 . other-lists) (define (compare-with-all-lists lst) (let ((all-lists (cons lst1 other-lists))) (accumulate (lambda (x y) (or x y)) #f (map (lambda (l) (is-cyclic-equal? lst l)) all-lists)))) compare-with-all-lists)

top related