Nano Hash - криптовалюты, майнинг, программирование

Обход BST, который содержит два типа значений

Для задания я создаю программу, которая загружает слова текстового документа в BST, а также строки, в которых они встречаются в документе, поэтому узлы имеют два члена данных: строку (слово) и Очередь целых чисел (каждая строка, в которой встречается слово, с дубликатами). Класс BST также является классом-шаблоном. Для одной из частей задания мне нужно найти слово с максимальным количеством вхождений и распечатать его. Однако дерево сортируется по первому члену данных (строкам), поэтому я знаю, что поиск очереди с наибольшей длиной означает обход всего дерева. Определение частной функции обхода, которое было включено в незавершенное, имело следующую подпись:

BinarySearchTree<ItemType, OtherType>::Inorder(void visit(ItemType&, OtherType&), BinaryNode<ItemType, OtherType>* node_ptr) const

Итак, я сделал такие функции:

public:
template<class ItemType, class OtherType>
void BinarySearchTree<ItemType, OtherType>::InorderTraverse(void visit(ItemType&, OtherType&)) const
{
   Inorder(visit, root_);
}  // end inorderTraverse

private:
template<class ItemType, class OtherType>
void BinarySearchTree<ItemType, OtherType>::Inorder(void visit(ItemType&, OtherType&), BinaryNode<ItemType, OtherType>* node_ptr) const
{
   if (node_ptr != nullptr)
   {
      Inorder(visit, node_ptr->GetLeftPtr());
      ItemType item = node_ptr->GetItem();
      OtherType other = node_ptr->GetOther();
      visit(item, other);
      Inorder(visit, node_ptr->GetRightPtr());
   }  
} 

Таким образом, передается клиентская функция, которая может выполнять некоторые операции с данными-членами каждого узла. Однако я не могу придумать, как создать функцию, которая сравнивает элементы данных в каждом узле. Я попытался добавить два члена данных для хранения соответствующей информации и использовать функцию-член в классе BST и передать ее функции Inorder, но это дало мне ошибку, говорящую о том, что я передаю «неразрешенный тип перегруженной функции». Для справки, вот как это выглядит:

public:
template<class ItemType, class OtherType>
bool BinarySearchTree<ItemType, OtherType>::GetMaxOther(ItemType& theItem, OtherType& theOther)
{
    if(root_ == nullptr)
        return false; 

    InorderTraverse(MaxOtherHelper);
    theItem = maxOtherItem;
    theOther = maxOther;

    return true;
}

private:
template<class ItemType, class OtherType>
void BinarySearchTree<ItemType, OtherType>::MaxOtherHelper(ItemType& theItem, OtherType& theOther)
{
    if(theOther.Length() > maxOther.Length())
    {
        maxOther = theOther;
        maxOtherItem = theItem;
    }
}

Это явно небрежное решение, и оно все равно не работает. Мой вопрос в том, есть ли способ выполнить эту задачу без создания совершенно новой, нерекурсивной функции обхода? Назначение пришло с прототипом функции обхода, поэтому я пытаюсь выяснить, есть ли способ сделать это с помощью предоставленной функции.

tl; dr BST содержит два типа членов данных, сортируется только по одному из них, как мне искать, используя другие?


  • Я не думаю, что вы можете решить это, не прибегая к глобальным переменным. 13.12.2016

Ответы:


1

Я не уверен, какую цель решает ваш BST. BST хранит данные в виде пары ключ-значение, где дерево сортируется по ключам. Если вам нужно найти значение, вам нужно пройти по дереву или создать новое дерево, содержащее некоторую информацию о значении, чтобы вы могли использовать структуру BST для быстрого получения необходимой информации.

Другим решением может быть - отслеживать узел, который имеет максимальное количество вхождений (количество слов), при добавлении нового узла или обновлении существующего узла, если вы обнаружите, что значение этого узла превышает значение предыдущего максимума, тогда вы просто необходимо изменить объект отслеживания/указатель.

Если вам нужно только получить слово с максимальным появлением, вы можете использовать Trie, который будет более эффективным, чем BST для этой цели.

Надеюсь, поможет!

13.12.2016

2

Более полезная подпись InorderTraverse

Причина, по которой у вас возникает ошибка компиляции с MaxOtherHelper, заключается в том, что он имеет тип void(BinarySearchTree<I, O>::*)(I&, O&), а не void(I&, O&). Если мы реализуем InorderTraverse следующим образом

template<class ItemType, class OtherType>
void BinarySearchTree<ItemType, OtherType>::InorderTraverse(std::function<void(ItemType&, OtherType&)> visit, BinaryNode<ItemType, OtherType>* node_ptr) const
{
   if (node_ptr != nullptr)
   {
      Inorder(visit, node_ptr->GetLeftPtr());
      ItemType item = node_ptr->GetItem();
      OtherType other = node_ptr->GetOther();
      visit(item, other);
      Inorder(visit, node_ptr->GetRightPtr());
   }  
} 

Это дает нам больше гибкости в отношении того, что может быть visit, в частности, мы можем std::bind или использовать лямбда для передачи функций-членов и по-прежнему получать доступ к this, например. InorderTraverse([this](ItemType & item, OtherType & other){MaxOtherHelper(item, other);});

13.12.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..