מבני נתונים בסיסייםבינוני6 דק׳ קריאה

עץ קידומות - מבנה הנתונים שמאחורי השלמה אוטומטית

Trie מאחסן מחרוזות בצורה שמאפשרת חיפוש קידומות ב-O(m). חיוני לשאלות ראיון על מחרוזות.

Trie (נקרא גם Prefix Tree) הוא עץ שבו כל מסלול מהשורש לעלה מייצג מחרוזת. מחרוזות עם קידומת משותפת חולקות את אותו נתיב - וזה מה שהופך חיפוש קידומות לזריז במיוחד.

מבנה הצומת

class TrieNode {
  constructor() {
    this.children = {};  // אות -> TrieNode
    this.isEnd = false;  // סוף מילה תקינה?
  }
}

class Trie {
  constructor() {
    this.root = new TrieNode();
  }

  insert(word) {
    let node = this.root;
    for (const ch of word) {
      if (!node.children[ch]) node.children[ch] = new TrieNode();
      node = node.children[ch];
    }
    node.isEnd = true;
  }

  search(word) {
    let node = this.root;
    for (const ch of word) {
      if (!node.children[ch]) return false;
      node = node.children[ch];
    }
    return node.isEnd;
  }

  startsWith(prefix) {
    let node = this.root;
    for (const ch of prefix) {
      if (!node.children[ch]) return false;
      node = node.children[ch];
    }
    return true; // קידומת קיימת
  }
}

סיבוכיות

פעולהזמןהערה
insert(word)O(m)m = אורך המילה
search(word)O(m)
startsWith(prefix)O(m)
זיכרון כוללO(ALPHABET_SIZE × m × n)n = מספר מילים

לעומת Hash Table שנותן O(m) לחיפוש מילה מדויקת, Trie נותן O(m) גם לחיפוש קידומות - וזה דבר ש-Hash Table לא יכול לעשות ביעילות.

יישומים בפועל ובראיונות

  • Autocomplete - השלמה אוטומטית בחיפוש (Google, VS Code)
  • Spell Checker - בדיקת איות וצביעה שגיאות
  • IP Routing - ניתוב רשת לפי קידומות IP (longest prefix match)
  • Word Search II (LeetCode) - מציאת מילים בלוח אותיות
  • Replace Words - החלפת מילים בקידומת הקצרה ביותר

אופטימיזציה - Compressed Trie

Trie רגיל בוזבז זיכרון כשיש שרשרות ארוכות של צמתים עם בן יחיד. Compressed Trie (Radix Tree) מאחד שרשרות כאלה לקשת אחת עם תווית מחרוזת - חוסך זיכרון משמעותי.

בראיון: אם שואלים על חיפוש קידומות, autocomplete, או מילים במילון - Trie הוא כנראה התשובה הנכונה. זהו אחד ממבני הנתונים שהכי 'מרשים' מראיינים.

שאלות נפוצות

מה זה עץ קידומות (Trie)?

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

מה היתרון של Trie על פני טבלת גיבוב?

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

כמה זיכרון צורך Trie?

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

מאמרים קשורים

ויזואליזציה של מבני נתוניםלכל המאמרים