c: איך ניתן

shochat1

New member
c: איך ניתן

להכניס תורים ולממשם ב skiplist רנדומי כאשר נניח שמפתח התור הוא סכום הערכים בתור והכניסה לSKIPLIST תתבצע על-פיו (המפתחות שונים)
 

vinney

Well-known member
לא הבנתי, זה קשור לC?

ובכלל, לא ממש הבנתי מה אתה שואל...
 

shochat1

New member
אכן זה מבנה נתונים בשפת c

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

shochat1

New member
שאלה שונה במקצת

קטע הקוד שכתבתי מיועד לקלוט קבוצות מס' מקובץ מסוים (הקבוצות מופרדות ב; וסוף הקובץ ב.) ולהכניס כל קבוצה של מספרים לתור המיושם באמצעות מערך. טיפול בגלישה צריך להיות מיושם בשיטת ההכפלה כאשר ההקצאה הראשונית היא תא int בודד.
int i=0, j=0, counter=0, *Numbers[j]; /*this pointer is in order to read from a file*/ FILE* input; input= fopen ("input.txt","r"); Numbers= (int*)malloc (1*sizeof(int)); counter++; while (i!='.') { while (j!=';') { counter++; if (j>counter) { Numbers=(int*)realloc (Numbers,2*sizeof(Numbers)); } *Numbers[j]=fgetc(input); } } free(Numbers); fclose(input); exit(1); האם זה נכון ואם כן מדוע הודעת השגיאה error: incompatible types in assignment​
 

vinney

Well-known member
זאת שאלה לפורום שפות תכנות

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

shochat1

New member
איך לתקן את numbers

ככה שיהיה לי מצביע שיצביע על תחילת המערך ??
 

vinney

Well-known member
אל תצהיר עליו כמצביע למערך

אני כבר אמרתי לך פעם, ואגיד לך שוב, אתה שואל שאלות מאוד בסיסיות, אני ממליץ לך בחום (באמת!) להשיג ספר טוב על C (למשל - ANSI C של Karnighan & Ritchie,ה K&R).
 

vinney

Well-known member
מה זה איך?

אתה שואל אותנו איך לממש הכנסה למבנה שאתה בנית? מאיפה לנו לדעת? ולא, אין בC שום מבנה נתונים כזה. המבנים היחידים שיש בC הם רשומה (struct) ומערך.
 

shochat1

New member
אוקיי אתקן

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

vinney

Well-known member
איבדתי אותך לגמרי

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

shochat1

New member
אז ככה זה נראה

כל האלגוריתם אומר ככה: נתונה סדרה של מספרים בקובץ מסוים המחולקת לקבוצות של מס'. כל מס' הוא חיובי שלם הבנוי לכל היותר מ-10 תווים. מס' הערכים בכל קבוצה ומס' הקבוצות יקבע דינמית ולא ידוע מראש. כל זוג מס' בתוך כל קבוצה מופרד ברווח ובסוף כל קבוצה ; וכל סידרת המס' תסתיים ברווח ונקודה כעת יש להכניס את כל של מס' לתור המיושם באמצעות מערך. כאשר טיפול בגלישה יתבצע באמצעות שיטת ההכפלה. כל תור כזה צריך להיכנס לskiplist (שוב המפתח הוא סכום המספרים). השאלות שלי: לא איך מצביעים עם פוינטר לתחילת מערך אלא איך נבצע את שיטת ההכפלה כאן ואיך לבצע את כל נושא הskiplist ??
 

vinney

Well-known member
את שיטת ההכפלה

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

vinney

Well-known member
בדיוק כל דבר אחר?

לא מבין מה אתה רוצה, באמת שלא.
 

shochat1

New member
קלטתי תורים

השאלה איך מחברים אותם והופכים אותם לסיקפליסט המדוברת ??
 

vinney

Well-known member
יש אופרטור "+", מצוין לחיבורים

לגבי הכנסה לskip list - תקרא את האלגוריתם. כתוב שם.
 

shochat1

New member
קראתי ותכל'ס איך מבינים

לגבי הביצוע של בעיה. אני יודע מה skiplist הבעיה היא במימוש
 

vinney

Well-known member
מה אתה מתקשה לממש?

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

shochat1

New member
אוקיי

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

vinney

Well-known member
אני לא חושב שהבנת את הרעיון

מאחורי הskip list. מדובר ברשימה מקושרת (ממוינת!) שבעצם מכילה כמה וכמה רשימות מקביליות, כשכל רשימה קטנה בסדר גודל מקודמה. איך הן מתקשרות אחת עם השניה? בעזרת מצביעים ברשומות. הרשומות זהות, רק בכל רשימה מקבילית, אתה עובר על רשומות אחרות. למשל: ברשימה המלאה יש לך A, B,C,D,E,F,G,H,I,K,J ברמה השניה יש לך A, C, E, G, I, J ברמה השלישית יש לך A, E, I אתה מחפש את K, אז אתה מתחיל "אריה במדבר" בתוך הרשימה הכי קצרה, עד שאתה מגיע (במקרה שלנו) לI. שם אתה עובר לרשימה היותר ארוכה, ומוצא את עצמך מדלג לJ (אופס, פיספסת את K). אז אתה עובר לרשימה הכי ארוכה, ומתחיל לחפש את K אחד אחד אחורה. בדיוק כמו אריה במדבר במערך, רק שזה לא מערך. עכשיו, אתה שואל מתי אתה פותח את הרשימה המקבילית הבאה, נכון? זהו בדיוק החלק האקראי. לכל מפתח שאתה מוסיף, אתה שואל את המחשב אם לשים אותו ברמה הכי גבוהה. מחשב יגיד לך כן? יופי, יגיד לך לא? אז תשאל אותו מה לגבי הרמה היותר נמוכה. בסוף - הוא יגיד לך כן, או שפשוט תוסיף אותו לרמה הכי נמוכה שיש.
 
למעלה