ABA


"|חידה| קטנה וחמודה:"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15980 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15980
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   10:14   15.07.10   
אל הפורום  
  |חידה| קטנה וחמודה:  
 
מתוך המבחן במבני נתונים שעשיתי אתמול:

קלט: מערך, ונתון כי K האיברים הראשונים בו זוגיים, וכל השאר אי-זוגיים.
עליכם להחזיר את K ב- O(log(K)) - runtime, O(1) - memory usage.

לא קשה מדי, אבל מעט טריקי.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  סוג של חיפוש בינארי? ronen333  15.07.10 10:29 1
     הפתרון שלך רץ ב- ((O(log(n, הדרישה היא ל: ((O(log(K Zippo  15.07.10 10:46 3
         אה, נכון.. ronen333  15.07.10 10:53 6
  זה נתונים מאוד חזקים. Deuce  15.07.10 10:45 2
     זה רץ ב-(O(K, הפסיעות אחורה יכולות להיות בגודל ליניארי Zippo  15.07.10 10:47 4
         ... ronen333  15.07.10 10:52 5
         מכתב Deuce  15.07.10 10:59 7
             בדיוק! Zippo  15.07.10 11:07 8
                 שאלה דווקא הוגנת מאוד :). ronen333  15.07.10 11:08 9
                 בהחלט הוגנת. Deuce  15.07.10 16:28 10
                     הממ.. יותר קשה ממה שציפיתי. Zippo  16.07.10 12:12 11
                         מכתב Deuce  16.07.10 16:09 12
                             לא ממש הבנתי. Zippo  16.07.10 16:58 13
                                 מכתב Deuce  16.07.10 18:24 14

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:29   15.07.10   
אל הפורום  
  1. סוג של חיפוש בינארי?  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 15.07.10 בשעה 10:38 בברכה, ronen333
 
אם זוגי+אי זוגי=אי זוגי
וזוגי+זוגי=זוגי

פשוט במקום להסתמך על מיון אתה מסתמך על זוגיות.
הסבר:

אם אתה רואה שהחיבור של האיבר הHIGH והLOW זה אי זוגי אז אתה מוריד את הHIGH לMIDDLE, אם אתה רואה שזה זוגי אתה בודק אם איבר אחרי הMIDDLE זוגי, אם הוא זוגי אז לא סיימת את החיפוש ואתה מעלה את הLOW לMIDDLE. אם האיבר אחרי הMIDDLE אינו איבר זוגי דהיינו זה זה האיבר הK שלך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   10:46   15.07.10   
אל הפורום  
  3. הפתרון שלך רץ ב- ((O(log(n, הדרישה היא ל: ((O(log(K  
בתגובה להודעה מספר 1
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:53   15.07.10   
אל הפורום  
  6. אה, נכון..  
בתגובה להודעה מספר 3
 
   טוב, מה שאייל הציע סבבה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   10:45   15.07.10   
אל הפורום  
  2. זה נתונים מאוד חזקים.  
בתגובה להודעה מספר 0
 
אתה יודע ש-K הראשונים בו זוגיים? פשוט תתקדם כל איטרציה פי שניים מהמיקום הנוכחי, כלומר בצע:
1, 2, 4 , 8 , ... .
תמשיך כך כל עוד נחתת על מספר זוגי. בשלב מסויים עבור m (כאשר m גדול מ-lg k אך m-1 קטן שווה ל-lg k) תהיה על מספר אי זוגי, ואז תתקדם אחורה בפסיעות של 1 עד שתגיע למספר הזוגי.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   10:47   15.07.10   
אל הפורום  
  4. זה רץ ב-(O(K, הפסיעות אחורה יכולות להיות בגודל ליניארי  
בתגובה להודעה מספר 2
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:52   15.07.10   
אל הפורום  
  5. ...  
בתגובה להודעה מספר 4
 
   ערכתי לאחרונה בתאריך 15.07.10 בשעה 11:02 בברכה, ronen333
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   10:59   15.07.10   
אל הפורום  
  7. מכתב  
בתגובה להודעה מספר 4
 
לא יודע למה חשבתי בראש שהמרחק יהיה סדר גודל של lg k, לכן אמרתי שאפשר לפסוע פשוט בקפיצות של 1, לא רציתי להתחכם ולומר לעשות חיפוש בינארי ואז זה יעלה lg lg k.

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






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   11:07   15.07.10   
אל הפורום  
  8. בדיוק!  
בתגובה להודעה מספר 7
 

האמת, שזאת שאלה לא כ"כ הוגנת למבחן... אבל מי אני שיתלונן?
אני הצלחתי לפתור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:08   15.07.10   
אל הפורום  
  9. שאלה דווקא הוגנת מאוד :).  
בתגובה להודעה מספר 8
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   16:28   15.07.10   
אל הפורום  
  10. בהחלט הוגנת.  
בתגובה להודעה מספר 8
 
היא אפילו לא קשה במיוחד, אל תיקח דוגמא מזה שבטעות אמרתי לפסוע כל פעם אחד אחורה - כל עוד אפשר לחפש בינארית אז מחפשים.

בזמנו שעשיתי מבני נתונים הפציצו אותי בשאלות תיאורטיות על ערימת פיבונצ'י - זה לא הוגן .

אם אתה ברוח של מבנ"ת אז קח שאלה נחמדה:
נתון מערך עם n איברים. צריך לקבוע האם איבר מופיע במערך יותר מ-n/lg n פעמים.
(הערה: אפשר לעשות את זה מהר יותר מ-nlg n)

בהצלחה במבחן אגב !






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   12:12   16.07.10   
אל הפורום  
  11. הממ.. יותר קשה ממה שציפיתי.  
בתגובה להודעה מספר 10
 
אני מכיר חידה דומה, שהייתה לנו בשיעורי בית.
למצוא בזמן ליניארי אם קיים איבר שמופיע יותר מ-50% במערך.
הפתרון היה select לחציון, ומעבר סדרתי לבדיקה אם הוא אכן מופיע יותר מ-n/2 פעמים...

אני מניח שפה הפיתרון יהיה דומה, עם תוספת של partition,
אבל אם כמובן נתחיל לחלק את המערך ל-2 כל פעם, ונבדוק,
זה בדיוק quicksort דטרמיניסטי שלוקח (n*log(n.

אולי בניתוח לשיעורין, אם נשנה את quicksort כך שהתנאי עצירה הוא טווח קטן מ- (2n/log(n ,
ולכן המיון לא יושלם, ונמשיך לבדוק רק קטעים שהטווח שלהם הוא לפחות (n/log(n,
כלומר, עבור כל תת-קטע בגודל K,
(n/log(n) >= K >= 2n/log(n
אם באותו קטע יש לפחות (n/log(n איברים זהים, אזי יש יותר מחצי איברים זהים, כלומר החציון של אותו קטע יהיה האיבר שאותו צריך לבדוק, ואת זה נוכל לעשות כמו שפתרתי את השאלה מהתרגילי בית.

אני לא יודע אם הזמן ריצה הוא אכן נמוך מ-(n*log(n, אבל אני משער שכן.
הרי אנחנו עוצרים את המיון בשלב מספיק מוקדם כדי שזה לא יעלה (n*log(n,
ושאר הפעולות עולות (O(n

זה הפתרון שאליו כיוונת, או שיש משהו פשוט יותר שפספסתי?

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   16:09   16.07.10   
אל הפורום  
  12. מכתב  
בתגובה להודעה מספר 11
 
ליניארית 2 זה מקצוע שבאמת משננים בו הרבה, אני בתור מתמטיקאי מצאתי בו גם לא מעט יופי, אבל אני בעצמי שיננתי הוכחות - אין מנוס מזה.

בהצלחה במבני נתונים, במקרה הכי גרוע באמת יש מועד ב'

באשר לפתרון - זה כיוון טוב, אבל יש גישה נוחה יותר לדעתי. בוא נצא מנקודת הנחה שאם איבר מופיע n/lg n פעמים אז הוא אחד מהאיברי המערך שדרגתם i * n/lg n כאשר i רץ בין 1 ל-lg n. כאמור אם נעשה lg n קריאות ל-Select מתאים, זה יעלה nlg n כמו שאמרת. במקום, אפשר להסתכל על 2lg n חציוני המערך וכל פעם שאנחנו מוצאים חציון, לחלק אותו לשני תתי מערכים ועל כל אחד מהם למצוא חציון.
כלומר כל איטרציה תמצא חציון למערך, תחלק את המערך הנתון לשני תתי מערכים ותקרא רקורסיבית לפונקציה על כל אחד משני תתי המערכים שהתקבלו.
באופן זה אתה יכול למצוא את lg n (או 2lg n) חציוני החציונים בעלות של nlg lg n.

זה חסכון נחמד לדעתי






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   16:58   16.07.10   
אל הפורום  
  13. לא ממש הבנתי.  
בתגובה להודעה מספר 12
 
קראתי כמה פעמים את התגובה, אבל לא הצלחתי להבין את האלגוריתם.
תוכל להסביר יותר, או לכתוב פסאודו-קוד קטן?

לגבי ליניארית,
אכן יש בו יופי, אבל לא מלמדים את זה בליניארית 1,2...
החומר למבחן הוא מאד טכני, משעמם, עם שינון נוסחאות לא חשובות.

טוב נו... די הבאתי את זה על עצמי, אז לא ממש יש לי זכות להתלונן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   18:24   16.07.10   
אל הפורום  
  14. מכתב  
בתגובה להודעה מספר 13
 
בליניארית1-2 נמצא כבר היופי, ההמשך של האלגברות הוא כבר לא כ"כ ליניארי. משפטי פירוק, קיום בסיסים, טענות לכסון, צורת ז'ורדן, מטריצה קנונית, תבניות ביליניאריות - כל אלו נושאים מעניינים עם משפטים מאד חזקים, פשוט הקורס עצמו מלווה בהמון הוכחות ובפרספקטיבה אלגברית שלא כולם אוהבים (אני עשיתי לצורך העניין קורסים מתקדמים יחסית באלגברה).

בכל מקרה, כמו שאמרתי וגם אתה - זה אכן מלווה בד"כ בשינון של הרבה הוכחות, קח את הזמן.

בכל אופן, בנוגע לחידה:
כמו שאמרתי, אם איבר מופיע n/lg n פעמים אז הוא חייב להיות מדרגה (סדר סטטיסטי) של k * n/lg n (כמו שאם למשל אני רוצה לדעת האם קיים איבר המופיע n/5 פעמים במערך אז אני אקרא ל-Select עם n/5, 2n/5 , ... , 4n/5 , n - אחת מהתוצאות חייבת להיות האיבר הזה).
יש לי סה"כ lg n כאלו, ואם אני סתם אקרא ל-Select אז זה יעלה לי nlg n שזה לא טוב.

במקום נמצא את log n החציונים באופן יעיל:
נחלק את המערך לשני מערכים ונמצא לכל תת מערך את החציון שלו (כלומר נמצא את החציון וניצור 2 תתי מערכים, באחד כל האיברים הקטנים ממנו, באחר כל האיברים הקטנים ממנו).
כל איטרציה על מערך בגודל n לוקחת 2n (כאמור n עבור מציאת החציון ו-n עבור חלוקת המערך לשני תתי מערכים).
עומק הרקורסיה הוא log log n.
בסה"כ נקבל שכל רמה בעץ הרקורסיה עלותה היא 2n.
כלומר עלות החישוב הינה 2nlog log n.

בגלל שאתה עובד בצורה מאוזנת, אתה מחשב lg n חציונים ב-nlg lg n במקום ב-nlg n.

לבסוף אתה מחזיק ביד lg n ערכים כאשר אתה יודע שאם קיים איבר במערך המופיע n/lg n פעמים הוא בהכרח אחד מהערכים שאתה מחזיק. מפה לא קשה להמשיך.







                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net