JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 1
  • Score
    100M100P100Q33763F
  • License MIT

Реализация префиксного дерева для автозаполнения с поддержкой слов и фраз

Package Exports

  • tree-autocomplete

Readme

tree

Управление префиксным деревом (tree) с поддержкой слов и фраз. Включает систему счетчиков для корректной обработки дубликатов.

Описание

trie предоставляет API для работы с префиксным деревом, включая операции вставки, поиска, автодополнения и управления данными. Поддерживает как отдельные слова, так и целые фразы с учетом количества вхождений каждого элемента.

Функциональность

Операции со словами

  • insertWord - добавление нового слова в дерево (увеличивает счетчик при дубликатах)
  • searchWord - проверка существования слова в дереве
  • deleteWord - удаление слова из дерева (уменьшает счетчик)
  • autocompleteWords - получение списка слов по префиксу
  • getWordCount - получение количества вхождений конкретного слова

Операции с фразами

  • insertPhrase - добавление новой фразы в дерево (увеличивает счетчик при дубликатах)
  • searchPhrase - проверка существования фразы в дереве
  • autocompletePhrases - получение списка фраз по префиксу
  • deletePhrase - удаление фразы из дерева (уменьшает счетчик)
  • getPhraseCount - получение количества вхождений конкретной фразы

Дополнительные операции

  • checkPrefix - проверка наличия слов, начинающихся с заданного префикса
  • getStats - получение расширенной статистики по дереву (включая общее количество вхождений)
  • clearTrie - удаление всех данных из дерева

Веб пример

Пример

Интерфейсы

InsertWord

interface InsertWord {
  word: string;
}

InsertPhrase

interface InsertPhrase {
  phrase: string;
}

SearchResponse

interface SearchResponse {
  exists: boolean;
  text: string;
  count?: number; // Количество вхождений (опционально)
}

AutocompleteResponse

interface AutocompleteResponse {
  prefix: string;
  suggestions: string[];
  count: number;
}

WordCountResponse

interface WordCountResponse {
  word: string;
  count: number;
  normalized: string;
}

PhraseCountResponse

interface PhraseCountResponse {
  phrase: string;
  count: number;
  normalized: string;
}

TreeStats

interface TreeStats {
  totalNodes: number;
  totalWords: number; // Уникальные слова
  totalPhrases: number; // Уникальные фразы
  totalWordOccurrences: number; // Общее количество вхождений слов
  totalPhraseOccurrences: number; // Общее количество вхождений фраз
}

Методы

insertWord(dto: InsertWord)

- Добавляет новое слово в префиксное дерево или увеличивает счетчик существующего.

**Параметры:**
- `dto` - объект с полем `word`

**Возвращает:**
- `{ message: string }` - сообщение об успешном добавлении

**Исключения:**
- Выбрасывает ошибку при неудачной вставке

**Примечание:**
- При добавлении дубликата увеличивается внутренний счетчик

insertPhrase(dto: InsertPhrase)

- Добавляет новую фразу в префиксное дерево или увеличивает счетчик существующей.

**Параметры:**
- `dto` - объект с полем `phrase`

**Возвращает:**
- `{ message: string }` - сообщение об успешном добавлении

**Исключения:**
- Выбрасывает ошибку при неудачной вставке

**Примечание:**
- При добавлении дубликата увеличивается внутренний счетчик
- Автоматически создаются префиксы для автодополнения

searchWord(word: string)

- Ищет слово в префиксном дереве.

**Параметры:**
- `word` - слово для поиска

**Возвращает:**
- `SearchResponse` - результат поиска с информацией о существовании

**Примечание:**
- Возвращает true только если слово существует и имеет count > 0

searchPhrase(phrase: string)

- Ищет фразу в префиксном дереве.

**Параметры:**
- `phrase` - фраза для поиска

**Возвращает:**
- `SearchResponse` - результат поиска с информацией о существовании

**Примечание:**
- Возвращает true только если фраза существует и имеет count > 0

getWordCount(word: string)

- Получает количество вхождений конкретного слова.

**Параметры:**
- `word` - слово для подсчета

**Возвращает:**
- `number` - количество вхождений слова (0 если не найдено)

**Пример использования:**
```typescript
const count = tree.getWordCount("рыбалка"); // 3

getPhraseCount(phrase: string)

- Получает количество вхождений конкретной фразы.

**Параметры:**
- `phrase` - фраза для подсчета

**Возвращает:**
- `number` - количество вхождений фразы (0 если не найдена)

**Пример использования:**
```typescript
const count = tree.getPhraseCount("зимняя рыбалка"); // 2

autocompleteWords(prefix: string, limit?: number)

- Получает список слов, начинающихся с заданного префикса.

**Параметры:**
- `prefix` - префикс для поиска
- `limit` - максимальное количество результатов (по умолчанию 10)

**Возвращает:**
- `AutocompleteResponse` - список предложений

**Исключения:**
- Выбрасывает ошибку, если префикс не указан

**Примечание:**
- Возвращает только слова с count > 0

autocompletePhrases(prefix: string, limit?: number)

- Получает список фраз, начинающихся с заданного префикса.

**Параметры:**
- `prefix` - префикс для поиска
- `limit` - максимальное количество результатов (по умолчанию 10)

**Возвращает:**
- `AutocompleteResponse` - список предложений

**Исключения:**
- Выбрасывает ошибка, если префикс не указан

**Примечание:**
- Возвращает только фразы с count > 0

checkPrefix(prefix: string)

- Проверяет наличие слов, начинающихся с заданного префикса.

**Параметры:**
- `prefix` - префикс для проверки

**Возвращает:**
- `{ hasWords: boolean }` - результат проверки

deleteWord(word: string)

- Удаляет слово из префиксного дерева (уменьшает счетчик).

**Параметры:**
- `word` - слово для удаления

**Возвращает:**
- `{ message: string }` - сообщение об успешном удалении

**Исключения:**
- Выбрасывает ошибку, если слово не найдено

**Примечание:**
- Уменьшает счетчик на 1
- Физически удаляет из дерева только при count = 0
- Безопасно обрабатывает дубликаты

deletePhrase(phrase: string)

- Удаляет фразу из префиксного дерева (уменьшает счетчик).

**Параметры:**
- `phrase` - фраза для удаления

**Возвращает:**
- `{ message: string }` - сообщение об успешном удалении

**Исключения:**
- Выбрасывает ошибку, если фраза не найдена

**Примечание:**
- Уменьшает счетчик на 1
- Физически удаляет из дерева только при count = 0
- Безопасно обрабатывает дубликаты
- Автоматически очищает связанные префиксы при полном удалении

getStats()

- Получает расширенную статистику по префиксному дереву.

**Возвращает:**
- `TreeStats` - объект со статистикой, включающий:
  - `totalNodes` - общее количество узлов
  - `totalWords` - количество уникальных слов
  - `totalPhrases` - количество уникальных фраз
  - `totalWordOccurrences` - общее количество вхождений слов
  - `totalPhraseOccurrences` - общее количество вхождений фраз

**Пример результата:**
```typescript
{
  totalNodes: 234,
  totalWords: 15,
  totalPhrases: 8,
  totalWordOccurrences: 45,
  totalPhraseOccurrences: 23
}

### clearTrie()
```html
- Очищает все данные из префиксного дерева.

**Возвращает:**
- `{ message: string }` - сообщение об успешной очистке

**Примечание:**
- Сбрасывает все счетчики и удаляет все узлы

Система счетчиков

Принцип работы

  • Каждый узел дерева содержит счетчик count
  • При добавлении элемента: count++
  • При удалении элемента: count--
  • Элемент считается существующим только при count > 0

Преимущества

  • Корректная обработка дубликатов: 5 одинаковых фраз = 1 узел с count = 5
  • Безопасное удаление: удаление одной фразы не влияет на остальные дубликаты
  • Экономия памяти: дубликаты не создают лишние узлы
  • Консистентность: поиск и автодополнение работают только с активными элементами

Пример использования со счетчиками

// Добавляем одинаковые фразы
tree.insertPhrase({ phrase: "зимняя рыбалка" }); // count = 1
tree.insertPhrase({ phrase: "зимняя рыбалка" }); // count = 2
tree.insertPhrase({ phrase: "зимняя рыбалка" }); // count = 3

// Проверяем количество
console.log(tree.getPhraseCount("зимняя рыбалка")); // 3

// Удаляем одну фразу
tree.deletePhrase("зимняя рыбалка"); // count = 2

// Фраза все еще существует
console.log(tree.searchPhrase("зимняя рыбалка")); // { exists: true, text: "зимняя рыбалка" }
console.log(tree.getPhraseCount("зимняя рыбалка")); // 2

Обработка ошибок

Tree включает обработку ошибок для всех операций. При возникновении ошибки выбрасывается исключение с описательным сообщением на русском языке.

Типы ошибок

  • Пустые входные данные
  • Отсутствие элементов при удалении
  • Отсутствие префикса при автодополнении
  • Внутренние ошибки дерева

Использование

import { tree } from 'tree-autocomplete';

// Добавление слова
tree.insertWord({ word: "привет" });
tree.insertWord({ word: "привет" }); // Увеличивает счетчик

// Проверка количества
console.log(tree.getWordCount("привет")); // 2

// Поиск слова
const result = tree.searchWord("привет");
console.log(result); // { exists: true, text: "привет" }

// Автодополнение
const suggestions = tree.autocompleteWords("прив", 5);

// Безопасное удаление
tree.deleteWord("привет"); // count = 1, слово остается
tree.deleteWord("привет"); // count = 0, слово удаляется

// Получение статистики
const stats = tree.getStats();
console.log(stats);
// {
//   totalNodes: 156,
//   totalWords: 23,
//   totalPhrases: 12,
//   totalWordOccurrences: 67,
//   totalPhraseOccurrences: 34
// }

Примечания

  • Поддерживается работа как с отдельными словами, так и с целыми фразами
  • Методы автодополнения имеют ограничение по умолчанию в 10 результатов
  • Система счетчиков обеспечивает корректную работу с дубликатами
  • Физическое удаление узлов происходит только при count = 0
  • Все операции поиска учитывают только активные элементы (count > 0)
  • Статистика включает как уникальные элементы, так и общее количество вхождений