npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

tree-autocomplete

v1.0.6

Published

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

Downloads

16

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)
  • Статистика включает как уникальные элементы, так и общее количество вхождений