שאלה במדעי המחשב

  • פותח הנושא KO74
  • פורסם בתאריך

KO74

New member
עוד תיקון

הלולאה השניה צריכה להיות: (++for (index=1; index<N; index מתחילה מתא 1 ולא מ-0
 

vinney

Well-known member
לא ברור, מצטער

עזוב את הקוד, הקוד לא מעניין. מה בדיוק האלגוריתם שאתה עושה? במיוחד מעניין אותי השלב הראשון, בו אתה משנה את המערך... איך אתה תתמודד עם מערכים כאלה: 3,3,3,3,3,3,3,3,3 או 1,2,3,1,2,3,1,2,3,1,2,3,1 למשל?
 

KO74

New member
הסברתי כבר, אבל שוב:

נעקוב אחרי הביצוע עבור המערך 1,2,3,1,2,3,1,2,3 המערך באורך 9 הנה הביצוע: התא הראשון - הערך הוא 1, מוסיפים לתא 1, (לא תא 0) את הערך 9, עכשיו יש בו 11 1,11,3,1,2,3,1,2,3 התא השני - הערך הוא 11, מוסיפים לתא במקום arr[index]%9 שזה 11%9 את הערך 9, עכשיו יש בו 12: 1,11,12,1,2,3,1,2,3 התא השלישי - יש בו 12, מוסיפים לתא ה- 12%9 את הערך 9, עכשיו יש בו 10 1,11,12,10,2,3,1,2,3 וכך הלאה, זה קצת מסובך, אבל זה עובד בדוק. קצת אמונה
 

vinney

Well-known member
יש לי בעיה עם נפנופי ידיים

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

KO74

New member
אני אנסה שוב

הלולאה מבצעת מעבר אחד על המערך, ומשתמשת בו כמערך מונים הבעיה שנוצרת היא שאני לא יכול למנות בצורה רגילה כי אז אני הורס את הערכים הבאים מה הפיתרון, למנות בצורה לא 'קונבנציונלית', זה בדיוק מה שעשיתי הערך הכי גדול שיכול להופיע במערך הוא N-1, לכן כל פעם שאני מונה, במקום להוסיף 1 עבור כל פעם, אני מוסיף N עבור כל פעם זה עדיין לא פותר את הבעיה, לכן, אני לא מסתכל על התא כמו שהוא אלא על התא mod N לדוגמה: N=9, בתא הראשון יש את הערך 3, ובתא השלישי יש לי את הערך 7 כשאני סורק את התא הראשון, אני נתקל בערך 3, ומוסיף לתא ה- 3=3%9 את הערך 9 כלומר בתא השלישי יש לי עכשיו 16 במקום 7 כשאני יגיע לתא השלישי, אני יוסיף לתא ה- 7=16%9 את הערך 9
 

vinney

Well-known member
זוכר מה אמרנו על פעולות חשבון?

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

vinney

Well-known member
אבל הרעיון יפה ../images/Emo13.gif

תקרא פה עוד קצת על שיטת העבודה הזאת.
 

KO74

New member
חישוב שארית הוא בסיבוכיות log n ?

אני לא מבין למה, אפשר לעשות את החישוב z=x%y בדרך אחרת: z=x/y z=z*y z=x-z
 

vinney

Well-known member
המם.... טוב, אני סתם נכנס לקטנות../images/Emo13.gif

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

KO74

New member
אף פעם לא חשבתי על זה ככה

אבל זה כבר באמת ברמה של ביצוע הפעולה ב- alu
 

vinney

Well-known member
זה יכול להיות גורם מאוד משמעותי

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

sr78

New member
בשאלות כמו שהוא הציג נוטים להזניח

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

vinney

Well-known member
כן, אני מניח... ../images/Emo13.gif

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

johnny d

New member
לא היה לי כח לקרוא את כל השרשור

ואני בטוח שמי שהציג את הבעיה התייחס לפעולות אריתמטיות באל פעולות אטומיות כנהוג אצל אנשי מחשבים בימינו. מה שיכול להיות נכון באופן תיאורתי ומעשי כאשר מביטים על הבעיה שאתה מציג מנקודה מסויימת. בכל מקרה, ניתן לפתור את הבעיה כך c <- N לכל i <- 1 to N בצע c <- c + array - i בסיום אלגוריתם קצר זה יהיה בידך המספר המבוקש.
 

KO74

New member
לא הבנתי את האלגוריתם

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

johnny d

New member
אופס אכן טעות בידי

לא קראתי היטב את השאלה, זה קורה לי המון, סליחה.
 
למעלה