שתי שאלות בניתוח סיבוכיות.
1. מה סיבוכיות זמן הריצה של הפונ' הבאה כאשר קוראים לה עם איבר ממויין בסדר יורד ועם k=0:
1. מה סיבוכיות זמן הריצה של הפונ' הבאה כאשר קוראים לה עם איבר ממויין בסדר יורד ועם k=0:
Rec_Build_Strong_Heap(A,k) if (2*k+1<=n-1) l=Rec_Build_Strong_Heap(A,2*k+1) if (2*k+2<=n-1) r=Rec_Build_Strong_Heap(A,2*k+2) root=AllocateMemory key[root]=A[k] if (2*k+1<=n-1) left[root]=l parent[l]=root else left[root]=NIL if (2*k+2<=n-1) right[root]=r parent[r]=root else right[root]=NIL return root
הפונ' מקבלת מערך ממוין (בסדר יורד) A ואינדקס k ובונה ערימת מקסימום חזקה שהשורש שלה הוא האיבר A[k] zzz. ערימת מקסימום חזקה היא ערימת מקסימום שבה כל האיברים בשכבה מסוימת קטנים מכל האיברים בשכבה שמעליה. ברור לי שהסיבוכיות היא Θ zzz אבל הסתבכתי בנסיון להוכיח את זה. ניסיתי להראות שכאשר קוראים לפונ' עם k=0 אז היא מבצעת מספר קבוע של פעולות לכל אחד מn האיברים אבל הסתבכתי בנסיון להראות שהיא אכן "עוברת" על כל איבר רק פעם אחת בלבד ועוברת על כל האיברים. מה שעשיתי זה להגדיר את הפונ':l(k)=2*k+1 r(k)=2*k+2
ואז ניסיתי להראות שכל שני ביטויים של הרכבות של l ו k (למשל l∘k∘k∘k∘l∘l∘l∘k∘l∘k) תמיד יתנו פונ' שונות ושעל ידי ההרכבות שהפונ' Rec_Build_Strong_Heap אפשר להגיע לכל j כך ש j בין 1 לn. כמו שאמרתי, הסתבכתי ונדמה לי שקצת נסחפתי... למישהו יש רעיון פשוט יותר? 2. אני צריך לפשט את הביטוי:lg( 2!*4!*8!*...*((n+1)/4)! )
ולהציג אותו במונחי Ω. הצלחתי להגיע ל Ωzzz אבל קשה לי להאמין שזה הדוק. הנה מה שעשיתי:lg( 2!*4!*8!*...*((n+1)/4)! ) = lg(2!) + lg(4!) + lg(8!) + ...+ lg((n+1)/4)! = 2*lg(2) + 4*lg(4) 8*lg(8) + ... + ((n+1)/4)*lg((n+1)/4) >= 2*lg(2) + 4*lg(2) + 8*lg(2) + ....((n+1)/4)*lg(2) = Ω
המעבר השני נובע מהזהות ׂlg(t!) = Θ(t*lg(t)) zzz, את המעבר האחרון עשיתי באמצעות סכום סידרה הנדסית. האם החסם הדוק או שאפשר לשפר אותו? תודה מראש.