|
הרשם | ![]() |
שאלות ותשובות | ![]() |
רשימת חברים | ![]() |
לוח שנה | ![]() |
הודעות מהיום | ![]() |
חיפוש | ![]() |
|
![]() |
![]() |
|
כלים לאשכול | תצורת הצגה |
|
![]() |
# 1 |
משתמש - היכל התהילה
|
כתבתי פתרון שהסיבוכיות שלו היא בין n^2 - n (יותר קרוב לזה) לבין 2n - 2 (במקרים קיצוניים בלבד).
מה שהוא עושה זה מערך עם הנתונים. עובר על קומבינציות החיבור ועל קומבינציות החיסור. אני שומר משתנה זמני של ההפרש וההפרש האחרון כאשר הארגומנט הראשון זהה, אם ההפרש גדל אז אני קוטע את הלולאה וככה חוסך ריצות. מכיוון שPHP זו שפת מפרש אני לא יודע אם זה מועיל בה בכלל. הפונקצייה מחזירה false למערך קטן מ2 אלמנטים או את האינדקס של הארגומנט הראשון והשני, את הסימן ביניהם ואת ההפרש מהתוצאה. הקוד: PHP קוד:
PHP קוד:
PHP קוד:
עריכה: הפתרון בלי הוידוי של ההפרש (השוותי אותם, עם הוידוי יותר מהיר בגדול, ככל שיש יותר "מיותרים" ככה הוא יותר יעיל מן הסתם): PHP קוד:
Last edited by Shay Ben Moshe; 08-03-10 at 23:49.. |
![]() |
![]() |
# 2 | |
חבר וותיק
|
שי - בלי לקרוא הכל יש פה כבר משהו מוזר
כתבת: ציטוט:
בנוגע לפותח ההודעה יש לי בראש פתרון אבל הוא לא פתרון יעיל... בגדול לדעתי צריך לעשות דבר כזה... צריך לקלוט את המספר ואת המספרים שאיתם צריך לבצע את הפעולות ואז לחלק אותם לקבוצות לפי מה נחלק לקבוצות? לפי 3 תנאים מרכזיים: תנאי ראשון להמשך באלגוריתם הוא שסכום כל הערכים המוחלטים של המספרים המוזנים גדול מהמספר אליו אנחנו שואפים (אם הוא שווה נחזיר את הסכום) תנאי ראשון של החלוקה, כמות המספרים המקס' בכל קבוצה צריך להיות פרופורציוני לשורש של המספר שאנחנו רוצים להגיע אליו (אני חושב השורש כפול 1 זה סקאלה סבירה), כמות הקבוצות צריכה להיות גם בערך 1.5 כפול השורש של המספר אליו נרצה להגיע החלוקה צריכה להיות לפי הקרבה של מספרים אחד לשני.. כלומר כל המספרים שקרובים אחד לשני והמקסימלי בקבוצה פחות המינימאלי בקבוצה לא יותר גדולים מהשורש של המספר כפול 2 בערך.. כשאני אומר קרבה משמע המספרים נמצאים קרוב על הציר לפי מה שכתבתי עד כה אם נחלק את המספרים הבאים: 1 2 3 4 6 7 8 45 52 60 נקבל את הקבוצות הבאות: 1 2 3 4 6 7 8 45 52 60 בהנחה שהמספר אליו אנחנו שואפים הוא 100 (השורש שלו הוא 10) מכאן אחרי החלוקה לקבוצות כדי להפעיל השוואה יעילה נמצא את המספר האמצעי בערך בכל קבוצה (לא ממוצע! אמצעי!) ונגיע למספרים הבאים: 4 45 60 לאחר מכן נבחן את כל האפשרויות של חיבורים/חיסורים בין ה"ראשי קבוצות", את האפשרויות נדרג בטבלה לפי הקרבה שלהם למספר המקורי (100) ונקבל שבראש הטבלה שלנו יש את 60+45 = 105 כעת אנחנו רואים כי עברנו את המספר, נמשיך לרדת עד שנמצא מספר מדויק אם נראה שאנחנו יוצאים מהטווח שבו ההפרש בין הפתרונות קטן משורש של הפתרון כפול 2 אז נעזוב את הנוסחא הנוכחית ונעבור לבאה בתור בטבלה שלנו ופשוט נשבץ אליה את המספרים ככל שיש יותר מספרים ככה הסיבוכיות גדלה.. מה גם שיש פה הרבה פרמטרים שצריך לחשוב עליהם והרבה בדיקות שיש לעשות בסופו של דבר אני חושב שזה יותר יעיל מלבדוק את כל הפתרונות האפשריים, אבל עדיין לא מספיק יעיל שאלה אחרונה - למה אתה צריך את הדבר הזה?? אם תתן כיוון אולי אפשר לפתור את זה בדרך אחרת
__________________
![]() |
|
![]() |
![]() |
חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים) | |
|
|