ABA


"איך הכי יעיל לרשום את הקוד הבא ב C++ ?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10376 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10376
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   20:04   01.05.11   
אל הפורום  
  איך הכי יעיל לרשום את הקוד הבא ב C++ ?  
 
   ערכתי לאחרונה בתאריך 01.05.11 בשעה 20:20 בברכה, Roni
 
In the box below, write a function in any programming language that takes a text string as input and returns a data structure that contains each character that appears in the string more than one time, and the number of total times that each such character appears. Assume that this function is going to be called by code written by other programmers at our firm. Write this code as you would if this was a real work assignment. Note: You may want to do the actual writing in a text editor and then just paste the result into the box below. *

חשבתי ליצור class עם הפונקציה הזאת כ public ושני משתנים private שהם בעצם vectors

או אולי אפילו lists אחד מדגם char והשני מדגם int

איך הכי יעיל וכדאי לעשות את זה?

אני לומד C++ עכשיו ומצטער אם השאלה דפוקה...


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  לעשות 2 רשימות או 2 וקטורים זה לא משהו כ''כ OO Nokia 01.05.11 21:14 1
     אני לא כל כך מכיר את הלינגו התיכנותי בעברית... Roni 01.05.11 21:47 3
  תקרא על BUCKET SORT VeNom  01.05.11 21:27 2
     מכתב Roni 01.05.11 21:51 4
         תחשוב ככה VeNom  01.05.11 23:47 5
             כן אחי, הבנתי את הרעיון שלך... הרעיון עצמו מצויין אבל Roni 02.05.11 00:05 6
  זה צועק ל MAP Net_Boy  02.05.11 02:18 7
     הרעיון השני הוא כמו הרעיון של Venom ... הקטע עם הרעיון Roni 02.05.11 03:49 8
     אש אחי! עכשיו קראתי על maps ונראה לי זה בדיוק מה שחיפשתי! תודה רבה. Roni 02.05.11 04:18 9
         בכיף :) Net_Boy  02.05.11 11:07 10
  בתאכלס ? אם מתחשבים גם במקום של הזכרון, קוד הופמן... Yariv-H 08.05.11 21:49 11
  חידה - אותו הדבר רק עבור substring. Deuce  08.05.11 23:06 12

       
Nokia
חבר מתאריך 1.7.02
538 הודעות
   21:14   01.05.11   
אל הפורום  
  1. לעשות 2 רשימות או 2 וקטורים זה לא משהו כ''כ OO  
בתגובה להודעה מספר 0
 
   יותר הגיוני לעשות קלאס פנימי \ struct שיכיל 2 שדות ואז במחלקה הגדולה לעשות רשימה טיפוסים מהסוג שלו


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   21:47   01.05.11   
אל הפורום  
  3. אני לא כל כך מכיר את הלינגו התיכנותי בעברית...  
בתגובה להודעה מספר 1
 
   מה זה רשימה טיפוסים?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   21:27   01.05.11   
אל הפורום  
  2. תקרא על BUCKET SORT  
בתגובה להודעה מספר 0
 
   זה ממש מתאים כאן..
בגדול אתה מקבל כקלט string ומחזיר מערך באקטים שכל תא בו הוא בעצם int ומייצג אות(מערך בגוגל 26 אם מדובר באנגלית ולא חשוב ה case).
הפונקציה כולה עוברת על כל האותיות בסטרינג ועושה לאות הספציפית עריכה ל low case ומגדילה את הקאונטר של הבאקט המתאים..
משהו כזה בערך..

int buckets[26] = {0};
for(int i = 0 ; i < stringSize; i++)
{
char c = toLowerCase(string[i]);
buckets[c - 'a']++;
}
return buckets;


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   21:51   01.05.11   
אל הפורום  
  4. מכתב  
בתגובה להודעה מספר 2
 
   ואיפה אני שומר את האותיות ? הבנתי שכל מיקום מסמל אות באלף בית האנגלי


הקטע של ה c- 'a' הוא מצויין! אהבתי את הרעיון


ו array נחשב ל data structure, נכון ?


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

תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   23:47   01.05.11   
אל הפורום  
  5. תחשוב ככה  
בתגובה להודעה מספר 4
 
   שאתה מגדיר מערך של ints כזה:

int array[26];

בעצם יש לך תאים באינדקסים מ 0...25
עכשיו היית רוצה לעשות משהו כזה:

array[a]++;
במקום
array[0]++;


ולכן אם תשים לב במפת ה
ascii
אז לתו 'a'
יש ערך 97..לתו
'b'
יש ערך 98..וכו עד התו
'z'
..הם באים אחד אחרי השני..
(אני מתייחס כאן רק ל
LOWER CASE)..
לכן בעצם

array[0] = array['a' - 'a']
array[1] = array['b' - 'a']
....
array[25] = array['z' - 'a']



בקיצור אתה יוצר מערך של Int
בגודל 26 ומאתחל את כל התאים ל 0.
מקבל string
ועובר עליו תו תו.
לכל תו אתה מעביר את התו הזה ל lowercase באמצעות פונקציה פשוטה(אם כל התוים הם lowercase מלכתחילה אז תתעלם..)
ואז אתה פשוט מאוד תקח כל תו כזה שהוא מטיפוס char ותעשה את הדבר הבא:


int array[26] = {0}
for(int i = 0 ; i < stringLength ; i++)
{
char c = toLower(string[i]); // convert char to lower case
array[c - 'a']++; // do the simple conversion as explained above
}

מערך הוא כן טיפוס נתונים..
מבחינת יעילות אז אתה רץ פעם אחת על המחרוזת..ועל כל תו עושה פעולה קבועה שלא נחשבת..לאחר מכן מעבר על מערך ה buckets תעלה לך זמן קבוע כי יש כולה 26 אותיות..
בקיצור בסוף אתה עושה משהו כזה:

for(int i = 0 ; i < 26 ; i++)//print numoftimes each letter appeared
{
if(array[i] > 0)
printf("The Letter %c appeared %d times\n",(char)('a' + i) ,array[i]);
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   00:05   02.05.11   
אל הפורום  
  6. כן אחי, הבנתי את הרעיון שלך... הרעיון עצמו מצויין אבל  
בתגובה להודעה מספר 5
 
   הם רוצים a data structure
כלומר טיפוס נתונים אחד (לפחות ככה אני מבין).... אז נראה לי צריך ליצור struct כמו שהבחור מלמעלה אמר ולעשות array of structs או vector of structs... ולעשות מה שאתה עשית... כי הם רוצים שאני אשמור גם את האות וגם את מספר הפעמים שזה מופיע... לא ?

תודה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   02:18   02.05.11   
אל הפורום  
  7. זה צועק ל MAP  
בתגובה להודעה מספר 0
 
   ואם אסור לך להשתמש בזה, תעשה טריק מאד נחמד ואלגנטי כדי לקבל זמן ריצה של O(n) - כאשר n זה מספר התווים שלך במחרוזת.

תגדיר מערך עזר בגודל 256 (שזה בעצם מספר הערכים שCHAR יכול לקבל) ותאפס את כל הערכים בו.
תרוץ על המחרוזת שלך
ואז כל פעם
תקדם את המערך במקום התו שלך כלומר, משהו כמו:


countArr['a']++;


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   03:49   02.05.11   
אל הפורום  
  8. הרעיון השני הוא כמו הרעיון של Venom ... הקטע עם הרעיון  
בתגובה להודעה מספר 7
 
   הזה הוא שזה לא באמת שומר רק את האותיות שמופיעות יותר מפעם אחת... זה בעצם array של כל האותיות ואנחנו פשוט מדפיסים את אלו שמופיעות יותר מפעם אחת...
אבל השאלה מבקשת שנשתמש ב data structure ונשמור רק את אלו שמופיעים יותר מפעם אחת...

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

תודה רבה לך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Roni
חבר מתאריך 28.2.06
26514 הודעות, 4 פידבק
   04:18   02.05.11   
אל הפורום  
  9. אש אחי! עכשיו קראתי על maps ונראה לי זה בדיוק מה שחיפשתי! תודה רבה.  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   11:07   02.05.11   
אל הפורום  
  10. בכיף :)  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yariv-H לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
5856 הודעות, 1 פידבק
   21:49   08.05.11   
אל הפורום  
  11. בתאכלס ? אם מתחשבים גם במקום של הזכרון, קוד הופמן...  
בתגובה להודעה מספר 0
 
   הכי יעיל



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:06   08.05.11   
אל הפורום  
  12. חידה - אותו הדבר רק עבור substring.  
בתגובה להודעה מספר 0
 
עליכם ליצור מבנה נתונים שמכיל את כל תתי המחרוזות במחרוזת ואת מספר הופעותיהן.






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

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

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



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