The Спробуйте структуру даних це деревоподібна структура даних, яка використовується для зберігання динамічного набору рядків. Його зазвичай використовують для ефективного пошук і зберігання ключів у великому наборі даних. Структура підтримує такі операції, як вставка , пошук , і видалення ключів, що робить його цінним інструментом у таких галузях, як інформатика та пошук інформації. У цій статті ми збираємося дослідити вставка та пошук операція в Trie Data Structure.

Спробуйте структуру даних
Зміст
- Представлення вузла Trie
- Представлення вузла Trie:
А Спробуйте структуру даних складається з вузлів, з’єднаних ребрами. Кожен вузол представляє символ або частину рядка. Кореневий вузол, початкова точка Trie, представляє порожній рядок. Кожне ребро, що виходить із вузла, означає певний символ. Шлях від кореня до вузла представляє префікс рядка, що зберігається в Trie.
Проста структура для представлення вузлів англійського алфавіту може бути наступною.
math pow java
C++struct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } };>
public class TrieNode { // Array for child nodes of each node TrieNode[] childNode; // Used for indicating the end of a string boolean wordEnd; // Constructor public TrieNode() { // Initialize the wordEnd variable with false wordEnd = false; // Initialize every index of the childNode array with null childNode = new TrieNode[26]; for (int i = 0; i < 26; i++) { childNode[i] = null; } } }>
Давайте розглянемо процес вставки слів у структуру даних Trie. Ми вже розглянули основи Trie та його структуру вузлів.
порівняти рядки java
Ось візуальне представлення вставки слів і і на у структуру даних Trie:
Вставити операцію в структуру даних Trie
Вставлення в структуру даних Trie:
Довжина масиву в java
- Почніть з кореневого вузла: Кореневий вузол не має асоційованого з ним символу та його wordEnd значення є 0 , що вказує на те, що на цьому місці не закінчується повне слово.
- Перший символ а: Обчисліть індекс за допомогою « a’ – ‘a’ = 0 . Перевірте, чи childNode[0] є нуль . Оскільки це так, створіть новий TrieNode із символом a , wordEnd встановлений в 0 і порожній масив покажчиків. Перейдіть до цього нового вузла.
- Другий символ n: Обчисліть індекс за допомогою «n» – «a» = 13 . Перевірте, якщо дочірній вузол [13] є нуль . Це так, тому створіть новий TrieNode із символом п , wordEnd встановлений в 0 і порожній масив покажчиків. Перейдіть до цього нового вузла.
- Третій символ d: Обчисліть індекс за допомогою « d’ – ‘a’ = 3 . Перевірте, якщо childNode[3 ] є нуль . Це так, тому створіть новий TrieNode із символом d , wordEnd встановлений в 1 (вказує на слово і закінчується тут).
Вставлення ant у структуру даних Trie:
- Почніть з кореневого вузла: Кореневий вузол не містить жодних даних, але він відстежує кожен перший символ кожного вставленого рядка.
- Перший символ а: Обчисліть індекс за допомогою « a’ – ‘a’ = 0 . Перевірте, чи childNode[0] є нуль . Ми вже маємо a вузол, створений з попередньої вставки. тому переходьте до існуючого a вузол.
- Перший символ n: Обчисліть індекс за допомогою « n’ – ‘a’ = 13 . Перевірте, якщо дочірній вузол [13] є нуль . Це не так, тому переходьте до існуючого п вузол.
- Другий символ t: Обчисліть індекс за допомогою «t» – «a» = 19 . Перевірте, якщо дочірній вузол [19] є нуль . Це так, тому створіть новий TrieNode із символом t , wordEnd встановлений в 1 (вказуючи, що тут закінчується слово мураха).
Нижче наведено реалізацію вставки рядків у структуру даних Trie:
C++#include using namespace std; struct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } }; void insert_key(TrieNode* root, string& key) { // Initialize the currentNode pointer // with the root node TrieNode* currentNode = root; // Iterate across the length of the string for (auto c : key) { // Check if the node exist for the current // character in the Trie. if (currentNode->childNode[c - 'a'] == NULL) { // Якщо вузол для поточного символу не існує // створюється новий вузол TrieNode* newNode = new TrieNode(); // Зберігати посилання для щойно створеного // вузла. currentNode->childNode[c - 'a'] = newNode; } // Тепер перемістіть покажчик поточного вузла на щойно // створений вузол. currentNode = currentNode->childNode[c - 'a']; } // Збільшення wordEndCount для останнього вказівника currentNode // це означає, що існує рядок, який закінчується на // currentNode. currentNode->wordEnd = 1; }>
Часова складність: O(кількість слів * maxLengthOfWord)
Допоміжний простір: O(кількість слів * maxLengthOfWord)Пошук ключа в структурі даних Trie подібний до операції вставки. Однак це лише порівнює персонажів і рухається вниз . Пошук може припинитися через кінець рядка або відсутність ключа в спробі.
Покроковий підхід для пошуку в структурі Trie Data:
перейменування каталогу
- Почніть з кореневого вузла. Це відправна точка для всіх пошуків у Trie.
- Перейдіть через Trie на основі символів слова, яке ви шукаєте. Для кожного персонажа дотримуйтеся відповідної гілки в Trie. Якщо гілки не існує, слова немає в Trie.
- Якщо ви дійшли до кінця слова, а прапорець wordEnd має значення 1, слово знайдено.
- Якщо ви дійшли до кінця слова, а прапорець wordEnd дорівнює 0, це слово не присутнє в Trie, навіть якщо воно має спільний префікс із існуючим словом.
Ось візуальне представлення слова для пошуку тато у структурі даних Trie:
Припустимо, що ми успішно вставили слова і , на , і тато у наш Trie, і ми повинні шукати певні слова в структурі даних Trie. Давайте спробуємо знайти слово тато :
Операція пошуку в структурі даних Trie
- Ми починаємо з кореневого вузла.
- Йдемо за гілкою, яка відповідає символу «d».
- Йдемо за гілкою, що відповідає символу a’.
- Йдемо за гілкою, яка відповідає символу «d».
- Доходимо до кінця слова і wordEnd прапор є 1 . Це означає що тато присутня в Trie.
Нижче наведено реалізацію рядків пошуку в Trie Data Structure:
C++#include using namespace std; struct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } }; bool search_key(TrieNode* root, string& key) { // Initialize the currentNode pointer // with the root node TrieNode* currentNode = root; // Iterate across the length of the string for (auto c : key) { // Check if the node exist for the current // character in the Trie. if (currentNode->childNode[c - 'a'] == NULL) { // Дане слово не існує в Trie return false; } // Перемістіть вказівник currentNode на вже // існуючий вузол для поточного символу. currentNode = currentNode->childNode[c - 'a']; } return (currentNode->wordEnd == true); }>
Часова складність: O(кількість слів * maxLengthOfWord)
Допоміжний простір: O(кількість слів * maxLengthOfWord)ціле число в рядок java
Створіть кореневий вузол за допомогою TrieNode() конструктор.
- Зберігайте колекцію рядків, які потрібно вставити в trie у векторі рядків, скажімо, обр .
- Вставка всіх рядків у Trie за допомогою insert_key() функція,
- Пошук рядків за допомогою search_key() функція.
Нижче наведено реалізацію вищезазначеного підходу:
C++ #include using namespace std; struct TrieNode { // pointer array for child nodes of each node TrieNode* childNode[26]; // Used for indicating ending of string bool wordEnd; TrieNode() { // constructor // initialize the wordEnd variable with false // initialize every index of childNode array with // NULL wordEnd = false; for (int i = 0; i < 26; i++) { childNode[i] = NULL; } } }; void insert_key(TrieNode* root, string& key) { // Initialize the currentNode pointer // with the root node TrieNode* currentNode = root; // Iterate across the length of the string for (auto c : key) { // Check if the node exist for the current // character in the Trie. if (currentNode->childNode[c - 'a'] == NULL) { // Якщо вузол для поточного символу не існує // створюється новий вузол TrieNode* newNode = new TrieNode(); // Зберігати посилання для щойно створеного // вузла. currentNode->childNode[c - 'a'] = newNode; } // Тепер перемістіть покажчик поточного вузла на щойно // створений вузол. currentNode = currentNode->childNode[c - 'a']; } // Збільшення wordEndCount для останнього вказівника currentNode // це означає, що існує рядок, який закінчується на // currentNode. currentNode->wordEnd = 1; } bool search_key(TrieNode* root, string& key) { // Ініціалізація вказівника currentNode // кореневим вузлом TrieNode* currentNode = root; // Ітерація по довжині рядка for (auto c : key) { // Перевірка наявності вузла для поточного // символу в Trie. if (currentNode->childNode[c - 'a'] == NULL) { // Дане слово не існує в Trie return false; } // Перемістіть вказівник currentNode на вже // існуючий вузол для поточного символу. currentNode = currentNode->childNode[c - 'a']; } return (currentNode->wordEnd == true); } // Код драйвера int main() { // Створення кореневого вузла для Trie TrieNode* root = new TrieNode(); // Зберігає рядки, які ми хочемо вставити у // вектор TrieinputStrings = { 'and', 'ant', 'do', 'geek', 'dad', 'ball' }; // кількість операцій вставки в Trie int n = inputStrings.size(); для (int i = 0; i< n; i++) { insert_key(root, inputStrings[i]); } // Stores the strings that we want to search in the Trie vectorsearchQueryStrings = { 'do', 'geek', 'bat' }; // кількість операцій пошуку в Trie int searchQueries = searchQueryStrings.size(); для (int i = 0; i< searchQueries; i++) { cout << 'Query String: ' << searchQueryStrings[i] << '
'; if (search_key(root, searchQueryStrings[i])) { // the queryString is present in the Trie cout << 'The query string is present in the ' 'Trie
'; } else { // the queryString is not present in the Trie cout << 'The query string is not present in ' 'the Trie
'; } } return 0; }>
Java class TrieNode { TrieNode[] childNode; boolean wordEnd; TrieNode() { childNode = new TrieNode[26]; wordEnd = false; } } class Trie { TrieNode root; Trie() { root = new TrieNode(); } // Function to insert a key into the Trie void insert(String key) { TrieNode currentNode = root; for (int i = 0; i < key.length(); i++) { int index = key.charAt(i) - 'a'; if (currentNode.childNode[index] == null) { currentNode.childNode[index] = new TrieNode(); } currentNode = currentNode.childNode[index]; } currentNode.wordEnd = true; } // Function to search for a key in the Trie boolean search(String key) { TrieNode currentNode = root; for (int i = 0; i < key.length(); i++) { int index = key.charAt(i) - 'a'; if (currentNode.childNode[index] == null) { return false; } currentNode = currentNode.childNode[index]; } return currentNode.wordEnd; } } public class Main { public static void main(String[] args) { Trie trie = new Trie(); String[] inputStrings = { 'and', 'ant', 'do', 'geek', 'dad', 'ball' }; // Insert each string into the Trie for (String str : inputStrings) { trie.insert(str); } String[] searchQueryStrings = { 'do', 'geek', 'bat' }; // Search for each string and print whether it is // found in the Trie for (String query : searchQueryStrings) { System.out.println('Query String: ' + query); if (trie.search(query)) { System.out.println( 'The query string is present in the Trie'); } else { System.out.println( 'The query string is not present in the Trie'); } } } }>
Python class TrieNode: def __init__(self): self.childNode = [None] * 26 self.wordEnd = False class Trie: def __init__(self): self.root = TrieNode() # Function to insert a key into the Trie def insert(self, key): currentNode = self.root for char in key: index = ord(char) - ord('a') if not currentNode.childNode[index]: currentNode.childNode[index] = TrieNode() currentNode = currentNode.childNode[index] currentNode.wordEnd = True # Function to search for a key in the Trie def search(self, key): currentNode = self.root for char in key: index = ord(char) - ord('a') if not currentNode.childNode[index]: return False currentNode = currentNode.childNode[index] return currentNode.wordEnd if __name__ == '__main__': trie = Trie() inputStrings = ['and', 'ant', 'do', 'geek', 'dad', 'ball'] # Insert each string into the Trie for word in inputStrings: trie.insert(word) searchQueryStrings = ['do', 'geek', 'bat'] # Search for each string and print whether it is found in the Trie for query in searchQueryStrings: print('Query String:', query) if trie.search(query): print('The query string is present in the Trie') else: print('The query string is not present in the Trie')>
JavaScript class TrieNode { constructor() { // Initialize the childNode array with 26 nulls this.childNode = Array(26).fill(null); // Initialize wordEnd to the false indicating that no word ends here yet this.wordEnd = false; } } class Trie { constructor() { // Initialize the root node of the Trie this.root = new TrieNode(); } // Function to insert a key into the Trie insert(key) { // Start from the root node let currentNode = this.root; for (let i = 0; i < key.length; i++) { const index = key.charCodeAt(i) - 'a'.charCodeAt(0); if (currentNode.childNode[index] === null) { currentNode.childNode[index] = new TrieNode(); } // Move to the next node in the Trie currentNode = currentNode.childNode[index]; } // Mark the end of the word currentNode.wordEnd = true; } // Function to search for a key in the Trie search(key) { // Start from the root node let currentNode = this.root; // Iterate through each character in the key for (let i = 0; i < key.length; i++) { const index = key.charCodeAt(i) - 'a'.charCodeAt(0); if (currentNode.childNode[index] === null) { return false; } // Move to the next node in the Trie currentNode = currentNode.childNode[index]; } // Return true if the end of the word is marked otherwise false return currentNode.wordEnd; } } // Driver code const trie = new Trie(); const inputStrings = ['and', 'ant', 'do', 'geek', 'dad', 'ball']; // Insert each string into the Trie inputStrings.forEach((str) =>trie.insert(str)); const searchQueryStrings = ['do', 'geek', 'bat']; // Пошук кожного рядка та друк, чи він знайдений у Trie searchQueryStrings.forEach((query) => { console.log(`Query String: ${query}`); if (trie.search(query)) { console.log('Рядок запиту присутній'); else { console.log('Рядок запиту відсутній');>
Вихід
Query String: do The query string is present in the Trie Query String: geek The query string is present in the Trie Query String: bat The query string is not present in the Trie>
- Спробуйте видалити
- Відображення вмісту Trie
- Функція автозаповнення за допомогою Trie
- Пошук за зразком із використанням усіх суфіксів
Практичні завдання:
- Мінімальний розрив слів
- Унікальні рядки в двійковій матриці
- Кількість різних підрядків
- Слово Боггл
- Сортування масиву рядків (або слів) за допомогою Trie
Практичні завдання:
- Мінімальний розрив слів
- Унікальні рядки в двійковій матриці
- Кількість різних підрядків
- Слово Боггл
- Сортування масиву рядків (або слів) за допомогою Trie