ABA


"חידה קשה ! :)"
גירסת הדפסה   אשכול נעול - לקריאה בלבד
 
   
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15117 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15117
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:08   20.12.08   
אל הפורום  
  חידה קשה ! :)  
 
עוגן האשכול הוסר בתאריך 09.01.09 בשעה  21:18  על-ידי Nesher, (מנהל הפורום)
 
(אשמח אם יוצע פרס לפותר נכונה + עוגן קטנטן )

החלטתי לחלק את החידה ל-3 חלקים מהקל לקשה, את הראשונה רובכם מכירים, את השנייה חלקכם מכירים והשלישית - השלישית היא החידה אותה אני רוצה שתפתרו.

לחידות:
1.
זוהי חידה קלה שמרבים לשאול אותה ברעיונות עבודה
נתון מערך בגודל n+1 המכיל את כל המספרים הטבעיים בין 1 ל-n (כלומר כל מספר בהכרח נמצא בו).
מצא את המספר שמופיע פעמיים.
Time Complexity: O(n)
Space Complexity: O(1)

2.
זוהי חידה מסובכת יותר שעומר, net_boy, שאל אותי בעבר
נתון מערך בגודל n+1 המכיל מספרים טבעיים בין 1 ל-n. לא ידוע כמה מספרים מופיעים פעמיים וייתכן גם שמספר אחד מופיע יותר מפעמיים.
מצא מספר כלשהו שמופיע לפחות פעמיים (כלומר לא צריך את כל המספרים שמופיעים יותר מפעם אחת, אלא אחד כזה).

Time Complexity: O(n)
Space Complexity: O(1)

3.
הגענו לחידה הקשה מכולן, אותה אני מעוניין להפנות כאתגר.
נתון מערך בגודל n+1 המכיל מספרים טבעיים בין 1 ל-n. לא ידוע כמה מספרים מופיעים פעמיים וייתכן גם שמספר אחד מופיע יותר מפעמיים.
מצא מספר כלשהו שמופיע במערך יותר מפעם אחת.
להגבלות:
1. המערך הוא Read Only - לא ניתן לבצע בו שינויים.
2. הגבלות סיבוכיות:

Time Complexity: O(nlog n) - נדמה לי 
Space Complexity: O(log n)

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

בהצלחה !!!







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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אם הייתי יודע מה זה סיבכיות הייתי מנסה אבל אני חלש במת' Groove 21.12.08 22:18 1
  1 באמת קלה - פתרון Oranav 22.12.08 00:42 2
  ב-1 אתה בטוח שאתה לא מדבר על n פעולות במקום O? ldan192  22.12.08 12:02 3
     1 באמת מאוד פשוטה, אורן צדק וגם אתה. Deuce  22.12.08 12:50 4
  נו איפה כל המודיעין - אנשים חושבים. Deuce  22.12.08 20:31 5
  צל''ש למי שפותר את החידה השנייה ו-וינר למי שפותר את השלישית Net_Boy  22.12.08 21:49 6
     עוד 50 נקודות במחפשים לפותר השאלה ה-3. Deuce  22.12.08 23:14 7
  תשובה ל 3 (סקיצה כי ממש אין לי זמן :) ) TTAsnn 23.12.08 17:59 8
     לא ממש הבנתי. Deuce  23.12.08 20:47 10
         אתה ללא ספק צודק, אמרתי לך שמיהרתי :) עפתי שוב. TTAsnn 23.12.08 21:05 13
  תשובה ל 2 TTAsnn 23.12.08 18:03 9
     גם לוקה בחסר, אם כי אתה בכיוון. Deuce  23.12.08 20:50 11
         מה פתאום TTAsnn 23.12.08 21:03 12
             הממ אבל תראה ... Deuce  23.12.08 21:13 14
                 ממש לא הבנת אותי נכון. TTAsnn 23.12.08 23:28 15
                     בדוגמא שהבאתי לך אבל אתה נתקע ... Deuce  24.12.08 04:44 17
  מימוש TTAnsen אם הבנתי נכון DOWNTOWN 23.12.08 23:37 16
  =-=-= מאשר את הפתרון לחידה 2 =-=-= Deuce  24.12.08 04:55 18
     זה רק רעיון, כי באמת אני פה לשניה. TTAsnn 24.12.08 10:33 19
         הממ לא חושב שזה יתפוס. Deuce  24.12.08 21:16 22
  אני לא יודע אם זה מתאים לדרישות DOWNTOWN 24.12.08 11:47 20
     את השורה הראשונה עדיף לעשות בפונקציה DOWNTOWN 24.12.08 11:55 21
     לא כ''כ הבנתי מה הולך פה ... Deuce  24.12.08 21:18 23
  מקפיץ - רמז !!! Deuce  21.01.09 15:42 24
  עבור 1 יש לי תחושה של פתרון קצת מסורבל אבל זה מה שיצא. the crusher 27.01.09 18:12 25
     יש פתרון ל-1, לחסר את n או את n!? בכל מקרה זה לא בידיוק Deuce  27.01.09 23:40 26
  ניסיון: menda  07.02.09 00:21 27
     נשמע ששני הפתרונות נכונים. Deuce  07.02.09 00:41 28
  פתרון ל1 Magiclog 15.02.09 20:57 29
  פתרון שלי ל-3. bronho 12.03.09 11:17 30
     מכתב, Deuce  14.03.09 06:54 31
         הסבר bronho 14.03.09 12:16 32
             פתרון מאוד מעניין הבאת פה. Deuce  14.03.09 16:14 33
                 ברגע שפתרתי את השאלה הייתה לי הרגשה שזאת לא הכוונה... bronho 14.03.09 16:38 34
                     פשוט מה שעשית פה זה קצת התחכמות. Deuce  14.03.09 17:08 35
                         אז יאללה שחרר פתרון :P עבר מלא זמן By-king 15.03.09 20:41 36
                             חחח אני צריך לפתור מחדש בעצמי. Deuce  15.03.09 23:47 37
  פתרון לשאלה 3 בסיבוכיות מקום קבועה. the crusher 10.12.09 22:28 38
     ממש מיותר להקפיץ את זה אחרי יותר מחצי שנה! Nesher  11.12.09 15:02 39

       
Groove
חבר מתאריך 6.8.11
219 הודעות
   22:18   21.12.08   
אל הפורום  
  1. אם הייתי יודע מה זה סיבכיות הייתי מנסה אבל אני חלש במת'  
בתגובה להודעה מספר 0
 
  


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

   00:42   22.12.08   
אל הפורום  
  2. 1 באמת קלה - פתרון  
בתגובה להודעה מספר 0
 
   בכללי (אין לי כוח לכתוב עכשיו אלגוריתם) - סוכם את כל המערך, מחסר מהסכום n(n+1)/2 ומה שהתקבל זה המספר שמופיע פעמיים.

את החידות האחרות אני אבדוק מחר


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:02   22.12.08   
אל הפורום  
  3. ב-1 אתה בטוח שאתה לא מדבר על n פעולות במקום O?  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 22.12.08 בשעה 12:02 בברכה, ldan192
 
כי אחרת זה ממש שטויות ולא מעניין :|

אתה סוכם את המספרים מ-1 עד n (זה n פעולות)
אתה מתחיל להחסיר את הסכום הזה מכל ה-n+1 איברים (זה n+1 פעולות)
המספר שנותר בערכו המוחלט זה המספר המבוקש.
סה"כ (O(n פעולות.
אם תרצה גם אלגוריתם ב-C זה שתי שניות

השאר אני אשאיר ליותר מאוחר


בברכה,
עידן


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   12:50   22.12.08   
אל הפורום  
  4. 1 באמת מאוד פשוטה, אורן צדק וגם אתה.  
בתגובה להודעה מספר 3
 
בכל מקרה, אין צורך לבדוק ערך מוחלט - המספרים טבעיים.
אין צורך גם לסכום n איברים עוקבים כי זאת סדרה חשבונית פשוטה.

תתחילו לחשוב על השאר






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   20:31   22.12.08   
אל הפורום  
  5. נו איפה כל המודיעין - אנשים חושבים.  
בתגובה להודעה מספר 0
 
יש לי חידות הרבה יותר קשות.
בכל זאת, יש לנו כאן נגדים שכבר שנים בתחום, סטודנטים למדעי המחשב, בוגרי מדעי המחשב, גאמאיסטים ומודיעין - אנשים חושבים.

ובכל זאת, נראה כי אתם מתקשים.






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   21:49   22.12.08   
אל הפורום  
  6. צל''ש למי שפותר את החידה השנייה ו-וינר למי שפותר את השלישית  
בתגובה להודעה מספר 0
 
  


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:14   22.12.08   
אל הפורום  
  7. עוד 50 נקודות במחפשים לפותר השאלה ה-3.  
בתגובה להודעה מספר 6
 
עלי






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

   17:59   23.12.08   
אל הפורום  
  8. תשובה ל 3 (סקיצה כי ממש אין לי זמן :) )  
בתגובה להודעה מספר 0
 
   כמו שאמרתי, ממש אין לי זמן לחשוב על זה לעומק, אבל הנה ניסיון שקפץ לי לראש, לא בדקתי לעומק:
אתה מעתיק את log n האיברים הראשונים למערך עזר בגודל המותר, ממיין אותם (לא חסרים מיונים עם חסם של nlogn), עובר עליהם ובודק אם איבר כלשהו שווה לעוקב לו, אם כן, זה האיבר המבוקש, אם לא, אתה מעתיק את האיבר האחרון במערך העזר להיות האיבר הראשון במערך העזר ומעתיק (log n)-1 איברים נוספים למערך העזר ועושה ככה עד שאתה מוצא את האיבר המבוקש....


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

[n,n-1,n-2,,...,1,1]

(שמתי כפילות בסוף).
אז אתה אומר להעתיק בהתחלה למערך העזר log n איברים ראשונים:

[n,n-1, ... ,n-log n+1]

יהיה המערך החדש שלך.
הממ אתה תמיין אותו, זה יעלה לך log nlog log n ע"י heap sort.
לא תמצא שום דבר.
תעתיק את האיבר האחרון במערך העזר (אם הבנתי נכון, נעתיק את האיבר האחרון המקורי שהיה שם כלומר את n-log n+1).
ואז נעתיק log n-1 איברים נוספים, כלומר את

[n-log n, ... , n-log n-log n+2]

ובמקום הראון יהיה האיבר n-log n+1 אותו שמרנו.

הממ האם זה נכון?
יכול להיות שכבר באיטרציה הראשונה פיספסת כפילות.
אם למשל ב-log n הראשונים שהעברת היו את המספרים 1,2,3,4,5,6
וב-log n השניים שהעברת היו את 8,9,5 ועוד, אז פיספסת כפילות 5.

ואם אתה מתכוון לרוץ כל פעם log n החל מהאיבר הראשון וה-log nיה האחרונה אז אתה צריך להעתיק:


(n-log n) * log n

כלומר יש לך nlog n העתקות למערך העזר.
על כל אחת מהן אתה מבצע מיון ערימה שעולה לך log n log log n.

חרגת ידידי ...






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

   21:05   23.12.08   
אל הפורום  
  13. אתה ללא ספק צודק, אמרתי לך שמיהרתי :) עפתי שוב.  
בתגובה להודעה מספר 10
 
  


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

   18:03   23.12.08   
אל הפורום  
  9. תשובה ל 2  
בתגובה להודעה מספר 0
 
   בדיוק שבאתי ללכת חשבתי רגע גם על תשובה ל 2:
אתה עובר איבר אחרי איבר במערך ועושה עבור כל איבר ככה:
עבור האיבר השווה ל i אתה הולך למקום ה i במערך, אם האיבר במקום ה i הוא i, הנה המספר שחיפשת, אם הוא לא, אתה מחליף בין המספר השווה ל i למספר במקום ה i ואז ממשיך לעשות את זה, עד שכאמור תמצא את המספר המבוקש.


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   20:50   23.12.08   
אל הפורום  
  11. גם לוקה בחסר, אם כי אתה בכיוון.  
בתגובה להודעה מספר 9
 
ערכתי לאחרונה בתאריך 23.12.08 בשעה 21:16 בברכה, Deuce
 

[n,n-1,...,1, 5]

תאר לך שהכפילות נמצאת ממש ממש בסוף ... בתא ה
n+1
אם כל פעם אתה מחליף וחוזר להתחלה אז הסיבוכיות עולה:

1 + 2 + 3 + 4 + ... = n^2

ואם אתה לא חוזר כל פעם להתחלה אז אתה מפספס כפילויות.






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

   21:03   23.12.08   
אל הפורום  
  12. מה פתאום  
בתגובה להודעה מספר 11
 
   אני עובר על האיבר הראשון (בעל הערך i), אם הוא נמצא במקום של הערך שלו, אז סבבה, אני עובר לאיבר הבא, אם לא, אני בודק אם האיבר שהאינדקס שלו הוא i הוא גם בעל ערך i, אם כן, מצאתי את האיבר המבוקש, אם לא, אני מחליף ביניהם ועכשיו בודק עבור האיבר שהחלפתי איתו את אותו הדבר, ככה אני מתזז לי בין האיברים עד שאני מנסה להחליף עם תא אשר יש בו כבר ערך התואם לאינדקס.
ככה אני במקרה הכי גרוע עושה את פעולת ההעתקה\החלפה הזו n פעמים, כי באיבר האחרון אני בטוח אצדוק. אני לא מבין איך חישבת את הסיבוכיות שחישבת לפתרון שלי...
אני לא צריך לחזור לשום דבר, בגלל שאני ככה *בטוח* אעבור על כל האיברים אלא אם אמצא כפילות באמצע. תחשוב על זה יותר לעומק.


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   21:13   23.12.08   
אל הפורום  
  14. הממ אבל תראה ...  
בתגובה להודעה מספר 12
 
ערכתי לאחרונה בתאריך 23.12.08 בשעה 21:16 בברכה, Deuce
 
נניח תיקח:

[n, ... , 1 , n+1]
Firstindex = 1
Lastindex = n+1

בהתחלה קפצת לאיבר הnי, עשית החלפה והמשכת קדימה וסיימת.

נ.ב:
אערוך את ההודעה שהגבתי לך, זה לא הדפיס את המערך.






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

   23:28   23.12.08   
אל הפורום  
  15. ממש לא הבנת אותי נכון.  
בתגובה להודעה מספר 14
 
   להמשיך הלאה הכוונה היא לא לעבור לאיבר באינדקס i+1 אלא החלפתי את האיבר עם הערך i עם האיבר במקום ה i שיש לו את הערך j, עכשיו אני עושה את אותה פעולה שעשיתי עבור i רק עבור j, כלומר לגשת למקום ה j ולעשות השוואה ובלה בלה...


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   04:44   24.12.08   
אל הפורום  
  17. בדוגמא שהבאתי לך אבל אתה נתקע ...  
בתגובה להודעה מספר 15
 
ערכתי לאחרונה בתאריך 24.12.08 בשעה 04:50 בברכה, Deuce
 
עריכה:
נראה לי שהבנתי, אתם מניחים שהמערך מסודר מ-0 עד n ומנצלים את העובדה ש-0 הוא לא טבעי.

אני אבדוק את זה שנייה.

באיבר הראשון יש לי n.
כלומר:
אינדקס = 1
ערך התא = n
עכשיו כמו שאמרת "החלפתי את האיבר עם הערך i עם האיבר במקום ה-i שיש לו את הערך j"
כלומר אני לוקח את האיבר עם הערך n עם האיבר במקום ה-n שיש לו (בדוגמא שלי) את הערך 1.
לאחר ההחלפה המערך נראה כך:


עכשיו אתה עושה את אותה פעולה עם האיבר במקום ה-i (כלומר במקום ה-nי) שיש לו את הערך j (כלומר את הערך 1).
ואז אתה ממשיך ככה עד אינסוף ...






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DOWNTOWN
חבר מתאריך 28.5.02
5388 הודעות
   23:37   23.12.08   
אל הפורום  
  16. מימוש TTAnsen אם הבנתי נכון  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 23.12.08 בשעה 23:37 בברכה, DOWNTOWN
 

static int retDoub(int[] arr)
{
int i = 0;
int helper = arr[i];
while (arr[i] != -1)
{
helper = arr[i];
arr[i] = -1;
i = helper;
}
return i;
}


בעצם הוא מתייחס עבור הערך שמכיל arr בתור הבדיקה האם הוא כבר עבר עליו, וi הוא המספר


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   04:55   24.12.08   
אל הפורום  
  18. =-=-= מאשר את הפתרון לחידה 2 =-=-=  
בתגובה להודעה מספר 0
 
כל הכבוד לכם חברה
רק שימו לפרט קטנטן:
לו המערך היה מאותחל מ-1 ועד n+1 אז התשובה לא הייתה תופסת כפי שתיארתי לעיל. היה ניתן ליצור מחזור אינסופי, מ-1 לשלוח למשל ל-n ומ-n לשלוח אל 1.
התשובה שלכם נכונה בהינתן המיספור של המערך מ-0 ועד n כי אי אפשר לשלוח לתא 0, ולכן בסופו של דבר זה מבטיח את התשובה.

ולכן - למרות הפתרון האלגנטי - אני אטיל מגבלה נוספת:
לא נתון המספור של המערך, ייתכן והמערך ממוספר בצורה שונה.

תהיו ערמומיים, אני רוצה שתתגברו גם עליה.
כל הכבוד לפותר !






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

   10:33   24.12.08   
אל הפורום  
  19. זה רק רעיון, כי באמת אני פה לשניה.  
בתגובה להודעה מספר 18
 
   אתה מחפש את המינימום של המערך (זמן לינארי) מחסר אותו מכל איברים המערך (גם כן לינארי) ואז זו בדיוק הבעיה שדנו עליה עכשיו ואת פתרונה כבר אישרת?


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   21:16   24.12.08   
אל הפורום  
  22. הממ לא חושב שזה יתפוס.  
בתגובה להודעה מספר 19
 
נניח והמערך שלי ממוספר מ-1 ועד n+1.
נניח אי שם באמצע יש לי 0 שהוא האיבר המינמלי.
האיבר הראשון יהיה n
האיבר ה-nי יהיה 1

...






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DOWNTOWN
חבר מתאריך 28.5.02
5388 הודעות
   11:47   24.12.08   
אל הפורום  
  20. אני לא יודע אם זה מתאים לדרישות  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 24.12.08 בשעה 11:51 בברכה, DOWNTOWN
 
אבל אחרי שקראתי קצת על quicksort עשיתי דבר דומה מאוד כאן.

static int retDoubS(int[] arr)
{
Array.Sort(arr);
int helper = (arr.Length + 1) / 2;
if (arr[helper] == arr[helper - 1])
return arr[helper];
int[] newArr = new int[helper];
int sum = 0;
for (int i = 0; i < helper; i++)
{
newArr[i] = arr[i];
sum += newArr[i];
}
if (sum == ((helper + 1) * (helper)) / 2)
{
for (int i = helper; i < arr.Length; i++)
{
newArr[i - helper] = arr[i];
}
}
return retDoubS(newArr);
}

http://pastebin.com/m54e055c8


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DOWNTOWN
חבר מתאריך 28.5.02
5388 הודעות
   11:55   24.12.08   
אל הפורום  
  21. את השורה הראשונה עדיף לעשות בפונקציה  
בתגובה להודעה מספר 20
 
   מנהלת של הפונקציה הזאת כי יש צורך בה רק בפעם הראשונה


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   21:18   24.12.08   
אל הפורום  
  23. לא כ''כ הבנתי מה הולך פה ...  
בתגובה להודעה מספר 20
 
ערכתי לאחרונה בתאריך 24.12.08 בשעה 21:57 בברכה, Deuce
 
בהתחלה למשל Array.Sort.
כל מיון יכול להיות אומגה של nlog n.

נציין בשביל כולם:
בחידה 3 לא לגעת במערך.
הוא READ ONLY.






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:42   21.01.09   
אל הפורום  
  24. מקפיץ - רמז !!!  
בתגובה להודעה מספר 0
 
תסתכלו על הפתרון לחידה הראשונה ותחשבו איך עבודה עם סכומים ומערך עזר בגודל log n יכולים לסייע לכם לפתור את החידה.






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
the crusher
חבר מתאריך 1.8.02
18936 הודעות
   18:12   27.01.09   
אל הפורום  
  25. עבור 1 יש לי תחושה של פתרון קצת מסורבל אבל זה מה שיצא.  
בתגובה להודעה מספר 0
 
   לסכום את כל אברי המערך.
לחסר את n!
וזה המספר :]


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:40   27.01.09   
אל הפורום  
  26. יש פתרון ל-1, לחסר את n או את n!? בכל מקרה זה לא בידיוק  
בתגובה להודעה מספר 25
 
אתה מחסר את סכום הסדרה החשבונית.






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
menda 
חבר מתאריך 22.5.06
3563 הודעות
   00:21   07.02.09   
אל הפורום  
  27. ניסיון:  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 07.02.09 בשעה 00:26 בברכה, menda
 
1) סכום המספרים פחות סכום האינדקסים. חיסור תוצאת ההפרש הזה מN+1 יתן את המספר שמופיע פעמיים.
קוד מטלב

l=length(a)
s=0;
for i=1:l;
s=s+i-a(i);
end;
result=l-s

2)נסתכל על האיבר האחרון תמיד ונבצע N פעמים חילוף שלו עם האיבר במקום הסודר שלו בסוף ישאר לנו איבר שמופיע פעמיים. הנה קוד מטלב:

l=length(a)
for i=1:l;
c=a(l);
a(l)=a(c);
a(c)=c;
end;
result=a(l)

לגבי 3. אחשוב קצת.


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:41   07.02.09   
אל הפורום  
  28. נשמע ששני הפתרונות נכונים.  
בתגובה להודעה מספר 27
 
נראה אותך מפצח את 3






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

   20:57   15.02.09   
אל הפורום  
  29. פתרון ל1  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 15.02.09 בשעה 21:26 בברכה, Magiclog
 
אני עכשיו רק חוזר לתכנות אחרי די הרבה זמן שלא נגעתי.

פתרתי את זה על ידי סכום כול האינדקסים עד n
סכום כול המערך n+1 ואז חיסור של סכום המערך בסכום האינדקסים
והמספר הנותר זה המספר שמופיע פעמיים

איך זה?

עריכה: אה עכשיו ראיתי את הסיבוכיות זמן.
בסדר אז אתה מחסר בין סכום האינדקסים וסכום המערך תוך כדי ולא בנפרד.


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
bronho
חבר מתאריך 15.9.08
534 הודעות
   11:17   12.03.09   
אל הפורום  
  30. פתרון שלי ל-3.  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 12.03.09 בשעה 11:21 בברכה, bronho
 
עריכה: תאמת שעכשיו כשאני חושב על זה, בפתרון הזה אפשר גם ללא מערך עזר אלא עם משתנה עזר אחד.

טוב אני קודם כל אסביר את הפתרון:
חילקתי את כל המספרים ל- log n קבוצות, כאשר בכל קבוצה N/log N איברים.
וההפרש בין כל איבר לאיבר הוא log n.
לדוגמא N=8, Log N = 3
אז יש את ה-3 קבוצות הבאות:
1,4,7
2,5,8
3,6

(ברמת העיקרון לפתרון החידה אפשר לחלק לאיזו קבוצות שאנו רוצים,
העיקר שמספר הקבוצות יהיה מספר האיברים במערך, ושיהיה היגיון בין המספרים, לדוגמא, אם אני לא טועה, גם ההגדרה הבאה נכונה:
1,2,3
4,5,6
7,8)

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

אני אתן דוגמא שתפשט את זה, אם ככה ייראה המערך הגדול:
{1,3,2,4,5,6,2,2,4}
ככה ייראה הקטן:
{21,13,11}

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


M= Log(n);
for i:=1 to n+1 do
Begin
j:=1;
Ezer:=Array
while Ezer>=(M) do
Begin
Ezer:=Ezer-M;
inc(j);
End;
If ((ShortArray) div (10^(j-1)) <> 0) and ((((ShortArray) div (10^(j-1)) mod 10) = 1) then
return (Array);
else ShortArray:=ShortArray+10^(j-1);
End;


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   06:54   14.03.09   
אל הפורום  
  31. מכתב,  
בתגובה להודעה מספר 30
 
הקטע קוד שלך לא כזה מובן בגלל ששכחת לאפשר סוגריים מרובעים.
יותר חשוב לי הרעיון, אז אני אתעמק בו.
לא כזה הבנתי למה אתה מתכוון בקטע של האיבר הראשון יהיה 1, האיבר השני 10, האיבר השלישי 100.
ובנוסף לא הבנתי את הדוגמא:
"אני אתן דוגמא שתפשט את זה, אם ככה ייראה המערך הגדול:
{1,3,2,4,5,6,2,2,4}
ככה ייראה הקטן:
{21,13,11}"

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






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
bronho
חבר מתאריך 15.9.08
534 הודעות
   12:16   14.03.09   
אל הפורום  
  32. הסבר  
בתגובה להודעה מספר 31
 
   ערכתי לאחרונה בתאריך 14.03.09 בשעה 12:29 בברכה, bronho
 
איך מאפשרים סוגריים מרובעים?

וזה הדוגמא...
האיבר הראשון במקוצר, מראה על כך שיש:
פעם אחת את המספר 1, ופעמיים את המספר 4.
האיבר השני מראה:
3 פעמיים את המספר 2, ופעם אחת את המספר 5.
והאיבר השלישי:
פעם 1 את המספר 3, ופעם אחת את המספר 6.

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

והנה הקטע שוב:


M= Log(n); {ההפרש בין האיברים בקבוצה}
for i:=1 to n+1 do {רצים על כל המערך הגדול}
Begin
j:=1; {אינדקס הבודק את איזה מקום המספר בקבוצה שלו}
Ezer:=Array{i}
while Ezer>=(M) do {הלולאה בודקת באיזה מקום המספר בקבוצה שלו}
{דוגמא: במערך לדוגמא, המספר 5 יפעיל את הלולאה פעם אחת ויגדיל את האינדקס ל 2}
Begin
Ezer:=Ezer-M;
inc(j);
End;
If ((ShortArray{Ezer}) div (10^(j-1)) <> 0) and ((((ShortArray{Ezer}) div (10^(j-1)) mod 10) = 1) then {בודק האם האיבר כבר הוכנס למערך הקטן, אם כן אז הוא מחזיר את האיבר כאיבר שנמצא פעמיים}
return (Array{i});
else ShortArray{Ezer}:=ShortArray{Ezer}+10^(j-1);
End;

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

וכך הלאה, עד שאפשר להגיע גם למספרים עם 20 ספרות תלוי בגודל המערך.


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   16:14   14.03.09   
אל הפורום  
  33. פתרון מאוד מעניין הבאת פה.  
בתגובה להודעה מספר 32
 
אז באמת כדי למצוא כל מיקום זה עולה log n ואתה רץ על כל איברי המערך, nlog n. והסיבוכיות מקום היא באמת log n ואפילו אפשר באמת לשים במשתנה אחד.

פתרון יפה, כל הכבוד

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






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
bronho
חבר מתאריך 15.9.08
534 הודעות
   16:38   14.03.09   
אל הפורום  
  34. ברגע שפתרתי את השאלה הייתה לי הרגשה שזאת לא הכוונה...  
בתגובה להודעה מספר 33
 
   ניסיתי לחשוב לכיוון השני, מה שאמרת עם הסכום.
ומה שעולה לי זה שוב חלוקה ל לוג N קבוצות, ולחשב סכום בנפרד לכל קבוצה.
אבל ישנם הרבה מצבי קצה שיהפכו את הסיבכיות ל N^2...

האם הכיוון בכלל זה החלוקה לקבוצות, או ראש אחר לגמרי?

תודה


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   17:08   14.03.09   
אל הפורום  
  35. פשוט מה שעשית פה זה קצת התחכמות.  
בתגובה להודעה מספר 34
 
ואם היית שם נניח הכל במחרוזת אחת ארוכה אז זה עדיין היה O(n(.
הממממ אז זהו שלא בידיוק חח

אני אגיד לך את האמת - אני בעצמי צריך לפתור את זה מחדש, כי עבר הרבה זמן






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק
   20:41   15.03.09   
אל הפורום  
  36. אז יאללה שחרר פתרון :P עבר מלא זמן  
בתגובה להודעה מספר 35
 
  


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:47   15.03.09   
אל הפורום  
  37. חחח אני צריך לפתור מחדש בעצמי.  
בתגובה להודעה מספר 36
 
לא זוכר :X
סופ"ש יהיה לי קצת זמן (מקווה), אז אני אחשוב על זה ואפרסם פתרון.






                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
the crusher
חבר מתאריך 1.8.02
18936 הודעות
   22:28   10.12.09   
אל הפורום  
  38. פתרון לשאלה 3 בסיבוכיות מקום קבועה.  
בתגובה להודעה מספר 0
 
   אתחיל בעובדה שאני מניח שבערך לא כל המספרים מופיעים, אחרת ניתן למצוא את המספר לפי 1.
הרעיון הוא בעצם להתחיל עם מספר n/2, ולבדוק כמה גדולים\קטנים ממנו ולהתקדם בהתאם.
אם הרוב גדולים ממנו אז נעבור לשלושת רבעי n ונמשיך ככה(משמע הוספת n/4) רק שהפעם בהתיחסות למספרים שקטנים ממנו נחסר את מספר המספרים שהיו קטנים מn/2 וכך בעצם נוצרה התיחסות רק עבור המספרים שגדולים מn/2 בלבד.
ממשיכים כך הלאה ויש logn צעדים ובכל אחד יש n שלבים.
אם זה לא מובן אשמח להסביר שוב :]


                                    (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   15:02   11.12.09   
אל הפורום  
  39. ממש מיותר להקפיץ את זה אחרי יותר מחצי שנה!  
בתגובה להודעה מספר 38
 


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

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



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