בתשובה לירדן ניר-בוכבינדר, 18/10/04 15:15
בלי קשר לכלום 254406
העדפתי Trie כי לא היה לי רעיון לפונקציית ערבול עבור URL, אז אני יכול ליצר מפתח (פשוט את הבא בתור ב-Trie) ולהשתמש בו. זה פחות טוב מבחינת ביצועים?
בלי קשר לכלום 254509
על קצה המזלג, מה זה Trie?
בלי קשר לכלום 254520
(תנאי מוקדם כדי להבין הסבר זה יש להכיר את המושגים "מצביע" ו"מערך" בתכנות)

Trie הוא מבנה נתונים שבנוי כך:

הצומת הראשון מצביע אל מערך שמכיל את כל אותיות האלפבית של המפתח של המידע. כל איבר במערך, בנוסף לכך שהוא מכיל אות כלשהי (נסמנה a), מכיל גם מצביע למערך נוסף בעל אותו מבנה (שמאותחל ל-null - "כלום"), ומצביע לערך (Value), שמאותחל גם הוא ל-null. המצביע למערך הנוסף אכן מצביע למערך שכזה רק אם הוכנס ערך שהמפתח שלו, במקום המתאים, כולל את האות המתאימה (a). כלומר, עבור הכנסת המפתחות abc, abd ו-abdd נקבל את המבנה הבא:

מצביע לתחילת המבנה - המערך (נסמנו 1).

מערך (1) שמכיל את כל אותיות האלפבית. בתא של האות a המצביע אל מערך נוסף אינו null אלא מצביע למערך (נסמנו 2), כל שאר המצביעים במערך זה הם null.

מערך (2) שמכיל את כל אותיות האלפבית. בתא של האות b המצביע אל מערך נוסף אינו null אלא מצביע למערך (נסמנו 3), כל שאר המצביעים במערך זה הם null.

מערך (3) שמכיל את כל אותיות האלפבית. בתא של האות c המצביע אל *ערך* אינו ריק אלא מצביע אל הערך המתאים למפתח abc. בתא של האות d המצביע אל ערך גם אינו ריק אלא מצביע אל הערך המתאים למפתח abd. כמו כן, בתא זה גם המצביע למערך נוסף אינו null אלא מצביע למערך (נסמנו 4), כל שאר המצביעים במערך זה הם null.

מערך (4) שמכיל את כל אותיות האלפבית. בתא של האות d המצביע אל הערך אינו ריק אלא מצביע אל הערך המתאים למפתח abdd. כל שאר המצביעים במערך זה הם null.

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

מאד נוח להחזיק בצורה כזו מילון של ערכים, כי כפי שציין ירדן, קל מאד להדפיס אותם לפי סדר אלפביתי - ערוך טיול DFS על המבנה והדפס כל צומת שנכנסת אליו לראשונה ושהמצביע לערך שלו אינו null.
בלי קשר לכלום 254541
מה רע בפונקציית הערבול הסטנדרטית למחרוזות (למשל זו של ג'אווה)?

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

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

חזרה לעמוד הראשי

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