Застрявший на реализации итератора Trie

Откройте этот файл с помощью текстового редактора

<your python2 instalation path>\lib\site-packages\vaderSentiment\vaderSentiment.py

Добавьте эти строки вверху файла:

from io import open
#------------------
import os
import re
import math
import string
import requests
import json
from itertools import product
from inspect import getsourcefile
10
задан Jonathan Leffler 9 December 2008 в 01:07
поделиться

3 ответа

Я рад видеть, что Попытки все еще преподаются, они - важная структура данных, которой часто пропускают.

Может быть проблема проектирования в Вашем коде, так как у Вас должны, вероятно, быть класс Trie и класс Узла. Путем Вы записали это, похоже, что каждый узел в Вашем Trie является своим собственным trie, который может работать, но сделает некоторые вещи сложными.

Не действительно ясно из Вашего вопроса, чем случается так, что у Вас есть проблема с: расчет порядка или расчет фактического кода?

С названия итератора это кажется, что должно было бы работать в порядке префикса. Так как Ваш trie хранит слова, и его дочерние узлы организованы буквами, затем Вы, как по существу ожидают, пробежитесь через все слова в алфавитном порядке. Каждое приращение принесет Вам к следующему слову.

Инвариант о Вашем итераторе - то, что в любой точке (как долго, поскольку это допустимо), он должен указывать на узел с "символом разделителя" для допустимого слова. Полагение, что слово просто включает сканирование вверх через родительскую цепочку, пока Вы не находите свою всю строку. Перемещение в следующее слово означает делать поиск DFS: поднимитесь однажды, сканирование для ссылок в более поздних "братьях", посмотрите, находите ли Вы слово, если не рекурсивно повышаются, и т.д.

6
ответ дан 4 December 2019 в 02:27
поделиться

С одной стороны, показанный код на самом деле не описывает trie. Скорее это, кажется, дерево, содержащее пару элементов в каждом узле (T* и unsigned). Вы можете дисциплиной использовать дерево кортежей как trie, но это только условно, не осуществление. Это - часть того, почему у Вас есть такое трудное время, реализовывая operator++.

То, что необходимо сделать, имеют каждого Trie содержите лево-право, непересекающееся ADT, а не просто необработанные элементы. Это - слой абстракции, которая чаще всего находится на функциональных языках (например, Scala Любой). К сожалению, система типов C++ не достаточно довольно мощна, чтобы сделать что-то что изящный. Однако нет ничего препятствующего тому, чтобы Вы делали это:

template <class L, class R>
class Either
{
public:

    Either(L *l) : left(l), right(0)
    {}

    Either(R *r) : left(0), right(r)
    {}

    L *get_left() const
    {
        return left;
    }

    R *get_right() const
    {
        return right;
    }

    bool is_left() const
    {
        return left != 0;
    }

    bool is_right() const
    {
        return right != 0;
    }

private:
    L *left;
    R *right;
};

Затем Ваш Trieэлементы данных были бы определены следующим образом:

private:
    Either<unsigned, T*> disjoint;

    vector<Trie<T> *> children;    // english pluralization
    Trie<T> * parent;

Я играю быстро и свободный с Вашими указателями, но Вы получаете суть того, что я говорю. Важный бит - то, что никакой данный узел не может содержать обоих unsigned и a T*.

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

0
ответ дан 4 December 2019 в 02:27
поделиться

Можно хотеть видеть мои измененные trie реализации в:

А именно, можно найти обсуждение, которое я имел на comp.lang.c ++. модерируемый о реализации итераторов для trie's в STL совместимый путь, который является проблемой начиная со всех stl контейнеров, к сожалению, вынужден использовать станд.:: пара <>, и итератор для этого должна содержать значение вместо просто ссылки на единственный узел в trie.

2
ответ дан 4 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: