יעילות

Dont say a word

New member
יעילות

יש לי HashTable שמכיל מערכים של stringים, ואני צריך לבנות פונקציה שבהינתן string כזה
abcd​
אני מפרק את ה-string ל-4 וכל תו מהווה key ל-hashTable ואני צריך ליצור צירוף של כל הצירופים, אז כתבתי את הפונקציה אבל כשהקלט גדול יותר מ-17 המחשב נתקע לגמרי, השאלה שלי האם אפשר לשפר את האלגוריתם (סיבוכיות) או את הקוד עצמו תודה מראש
private static ArrayList getDnaHelixesFromProtein(string protein) { if (protein.Length == 1) return new ArrayList((ICollection)revCodon[protein]); char let = protein[0]; ArrayList aRet = getDnaHelixesFromProtein(protein.Substring(1, protein.Length-1)), aRes = new ArrayList(); string[] tmp = (string [])revCodon[let.ToString()]; for (int j = 0, len = tmp.Length; j < len; j++) { for (int i = 0; i < aRet.Count; i++) { aRes.Add(tmp[j] + aRet); } } return aRes; }
 

EdotK

New member
שאני אבין, אתה מנסה לבנות

HashTable עם 17 עצרת ערכים?! (355687428096000 ערכים) ואתה באמת לא רואה מה יכול לתקוע את המחשב כאן? גם אם כל ערך לוקח בייט אחד בלבד (והוא לוקח יותר), אתה עדיין מנסה להשתמש ב355687428096000 שהם 355687 ג'יגה בייט.
 

Dont say a word

New member
מזל שזה לא מה שאני עושה...

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

colossus

New member
לא נעין לי לומר לך, אבל

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

EdotK

New member
סורי, פשוט הקוד שלך לא הכי קריא

וההסברים שלך לא ממש עוזרים
 

gewitter

New member
לא יותר יעיל, אבל

private static System.Collections.Hashtable reverseCodon = new System.Collections.Hashtable(); private static string[] getReverses(string codon) { return (string[])reverseCodon[codon]; } private static string[] getDnaHelixesFromProtein(string protein) { if (protein.Length == 1) { return getReverses(codon); } string left = protein[0].ToString(); string[] right = getDnaHelixesFromProtein(protein.Substring(1, protein.Length-1)); string[] leftReverses = getReverses(left); string[] helixes = new string[leftReverses*right]; for (int i = 0; i < leftReverses.Length; i++) { for (int j = 0; j < right.Length; j++) { helixes[i*right.Length + j] = leftReverses + right[j]; } } return helixes; }

שניתי קצת שמות. עדיין אין לי מושג מה אתה מנסה לעשות, אבל אולי זה יעזור לך.
 

gewitter

New member
קצת טעויות

במקום codon צריך להיות protein בתנאי העצירה של הרקורסיה. באתחול של helixes צריך לקחת את הגודל של כל אחד מהמוכפלים.
 
למעלה