תוכן lina12 - HWzone פורומים
עבור לתוכן
  • צור חשבון

lina12

משתמש רשום
  • מספר הודעות

    15
  • הצטרפות

  • ביקר לאחרונה

הודעות שנפתחו על-ידי lina12

  1. ציטוט של af db creid

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

     

    דבר שני, קוד טיפה יותר אידיומטי יראה בסגנון הזה:

    
    
    public static <T extends Comparable<T>> List<T> combineSorted(LinkedList<T> ... lists) {
        	List<T> newList = new LinkedList<T>();
        	for (LinkedList<T> list : lists) {
              	newList.addAll(list);
        	}
        	Collections.sort(newList);
        	return newList;
    }

    אבל הקוד הכי פשוט הוא עם Java 8 Streams API:

    
    
    public static <T extends Comparable<T>> List<T> combineSorted(LinkedList<T> ...lists) {
        return Arrays.stream(lists)
            .flatMap(List::stream)
            .sorted()
            .collect(Collectors.toList());
    }

     

    ולגבי הסיבוכיות:

    אנחנו מוסיפים כל רשימה לרשימה הסופית. K רשימות, כל אחת N איברים - סה"כ KN.

    חוץ מזה, אנחנו ממיינים את הרשימה הזו. Collections.sort() מעתיק את הרשימה למערך (O(len)), ואז ממיין אותו בTimSort (שזה O(len*log(len))), ובסוף מעתיק בחזרה לרשימה (שוב O(len)). len שלנו הוא K*N, אז סה"כ הסיבוכיות היא:

    
    
    O(K*N + K*N + K*N*log(K*N) + K*N) = O(K*N*log(K*N))

     

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

  2. היי,

    צריך לממש מתודה שמקבלת רשימות מקושרות (מטיפוס גנרי) ומחזירה רשימה ממוינת.

    public static <T extends Comparable<T>> List<T> combineSorted(LinkedList<T> ... lists){
        	int listsLength = lists.length; //number of lists
        	int length = lists[0].size(); //elements on each list
        	List<T> newList = new LinkedList<T>();
        	for(int i = 0; i < listsLength; i++) {
        		for(int j = 0; j < length; j++) {
        			newList.add(lists[i].get(j));
        		}
        	}
        	Collections.sort(newList);
        	return newList;

     

    הקוד עובד אבל אשמח לעזרה עם חישוב הסיבוכיות (יש k רשימות מקושרות וכל אחת מהרשימות היא באורך N).

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

     

    תודה רבה!

  3. ציטוט של Buck

    את צריכה להקצות בלולאה מערך בגודל n של פוינטרים לchar ואז לרוץ על המערך איבר איבר בלולאה ולהקצות בכל מקום n איברים בגודל char.

     

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

     

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

    תודה רבה קודם כל!

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

  4. היי :)

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

    אני צריכה לכתוב את הדרך בפונקציה ולא יכולה להשתמש בפונקציות למשל itoa וכו'.

    בנוסף, לא למדתי עוד sprintf לכן אי אפשר להשתמש גם בזה.

    אשמח לעזרה.

     תודה רבה!

  5. ציטוט של multicore

    יש משהו שניסית ולא הצליח או לא הבנת?

    בעיקרון, יש יותר משיטה אחת לקלוט מחרוזת עם רווחים, מעבר לשימוש ב gets:

    https://www.geeksforgeeks.org/taking-string-input-space-c-3-different-methods/

    עם scanf לא עובד לי. אי אפשר לקלוט רווחים עם scanf

  6. היי :)

    אני צריכה לקלוט מחרוזת ב-C שיכולה להכיל גם רווחים.

    כשאני עושה את זה בscanf זה עוצר את הקליטה אחרי הרווח.

    אשמח לדעת איך אפשר שהמחרוזת תקלוט גם רווחים.

    רק לציין שלא למדנו פונקציית gets לקליטה (למדנו רק scanf וgetchar).

    תודה רבה!

  7. ציטוט של af db creid

    טוב.

    קודם כל - מה ניסית. הכי קל לתת לך תוכנית מוכנה, אבל יותר יועיל לך אם נכוון אותך. מה הכיוונים שלך? על מה חשבת?

    מה פירוש "בלי מצביעים"? אלא איך? עם מערכים?

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

  8. ציטוט של Jabberwock

    לא הצלחתי להבין את התרגיל.

    יש לך מערך של char בעל 100 תווים ?

    ככה:

    
    
    char szInput[100];

    לא ?

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

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

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

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

  9. ציטוט של af db creid

    שלום רב.

     

    ובכן -

    א. האם הפונקציה הרקורסיבית עצמה צריכה לקלוט את הטקסט או בנפרד ממנה?

    ב. מה ניסית עד כה? במה את צריכה עזרה?

    צריך לקלוט טקסט מהmain ואז להפעיל את הפונקציה.

    בגדול הצלחתי לעשות את זה בלי מערך. הבעיה היא שיש הגבלה ל100 תווים ככה שאני די בטוחה שהדרך היחידה היא במערך.

×
  • צור חדש...