Re: trie_map & trie_set, v0.07
От: R.K. Украина  
Дата: 13.09.05 04:59
Оценка:
Здравствуйте, R.K., Вы писали:

RK>
  • введёны новые типы итераторов — partial match iterators (partimap ) — const_partimap, partimap.

    Вот что значит ночью посты писать! Конечно, не partimap, а partimator.
  • You aren't expected to absorb this
    trie_map & trie_set, v0.11
    От: R.K. Украина  
    Дата: 21.09.05 16:02
    Оценка: 8 (2)
    Привет всем, кого ещё интересует судьба моих контейнеров

    trie_map & trie_set, v0.11 (MSVC 7.1)
    Первая версия, в которой всё появившееся ранее работает и при этом не вызывает отвращения.
    Подробнее:
    Вроде ничего не забыл.


    Кратко о предыдущих версиях:

    v0.07

    v0.05
    You aren't expected to absorb this
    Re: trie_map & trie_set, v0.11
    От: R.K. Украина  
    Дата: 26.09.05 07:04
    Оценка: 5 (1)
    Привет всем!

    trie_map & trie_set, v0.13 (MSVC 7.1, GCC 3.2, Comeau 4.3)
    Ничего особо нового, только теперь компилируется с вышеперечисленными компиляторами (указаны минимальные номера версий, доступных для проверки). Comeau C++ тестировался онлайн. Кстати, только он в режиме strict выдал варнинг на отсутствие return *this; в _Myt &operator=(const _Myt&) в trie_generic. Остальные компилеры предательски молчали, MSVC в /W4, а GCC, соответственно, в -pedantic -Wextra.
    Удивительно ещё то, что GCC собрал релиз, выполняющийся быстрее на треть (32%), в сравнении с MSVC с max speed optimizations.
    Насчёт дальнейшего развития: это ещё не всё, но имеются некоторые алгоритмические трудности. Будут идеи, свободное время — будут новые версии.
    You aren't expected to absorb this
    Re[2]: trie_map & trie_set, v0.11
    От: _nn_ www.nemerleweb.com
    Дата: 01.10.05 08:17
    Оценка:
    Здравствуйте, R.K., Вы писали:

    RK>Привет всем!


    RK>trie_map & trie_set, v0.13 (MSVC 7.1, GCC 3.2, Comeau 4.3)

    RK>Ничего особо нового, только теперь компилируется с вышеперечисленными компиляторами (указаны минимальные номера версий, доступных для проверки). Comeau C++ тестировался онлайн. Кстати, только он в режиме strict выдал варнинг на отсутствие return *this; в _Myt &operator=(const _Myt&) в trie_generic. Остальные компилеры предательски молчали, MSVC в /W4, а GCC, соответственно, в -pedantic -Wextra.
    RK>Удивительно ещё то, что GCC собрал релиз, выполняющийся быстрее на треть (32%), в сравнении с MSVC с max speed optimizations.
    RK>Насчёт дальнейшего развития: это ещё не всё, но имеются некоторые алгоритмические трудности. Будут идеи, свободное время — будут новые версии.

    Ждем
    Было бы неплохо сделать более полный тест скорости работы класса.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    trie_map & trie_set, v0.17
    От: R.K. Украина  
    Дата: 05.10.05 09:42
    Оценка: 22 (2)
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, R.K., Вы писали:


    RK>>Насчёт дальнейшего развития: это ещё не всё, но имеются некоторые алгоритмические трудности. Будут идеи, свободное время — будут новые версии.


    __>Ждем


    Дождались
    trie_map & trie_set, v0.17 (MSVC 7.1, GCC 3.2, Comeau 4.3):

    Немного о планах (в приблизительном порядке невозрастания реализуемости;):

    __>Было бы неплохо сделать более полный тест скорости работы класса.


    Это да... Вот только с чем сравнивать будем?
    You aren't expected to absorb this
    Re: trie_map & trie_set, v0.17
    От: _nn_ www.nemerleweb.com
    Дата: 06.10.05 16:38
    Оценка:
    Здравствуйте, R.K., Вы писали:

    __>>Было бы неплохо сделать более полный тест скорости работы класса.


    RK>Это да... Вот только с чем сравнивать будем?


    Между компиляторами и с std::map/std::set
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    trie_(map|set), v0.19 и тесты
    От: R.K. Украина  
    Дата: 10.10.05 12:47
    Оценка:
    Привет всем!

    trie_(map|set), v0.19 (MSVC 7.1, GCC 3.2, Comeau 4.3):

    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, R.K., Вы писали:


    __>>>Было бы неплохо сделать более полный тест скорости работы класса.


    RK>>Это да... Вот только с чем сравнивать будем?


    __>Между компиляторами и с std::map/std::set


    ОК. Ловите результаты для P4-3.0, 1G RAM (исходники см. speed_test.cpp и speed_test_pq.cpp):

    MSVC 7.1 (PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 34.4867 sec.
    Size: 404463
    *** pat::trie_set<pat::DelusionString>
    Timer: 29.6441 sec.
    Size: 404463
    
    
    MSVC 7.1 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 37.3867 sec.
    Size: 404463
    Timer erase: 0.297726 sec.
    *** std::set
    Timer: 54.5871 sec.
    Size: 404463
    Timer erase: 0.302945 sec.
    *** std::hash_set
    Timer: 28.5497 sec.
    Size: 404463
    *** std::hash_set: to std::vector + std::sort
    Timer: 1.42755 sec.
    Size: 404463
    Full hash timer: 29.9773 sec.
    
    
    GCC 3.4.4 (PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 25.2501 sec.
    Size: 404463
    *** pat::trie_set<pat::DelusionString>
    Timer: 23.0039 sec.
    Size: 404463
    
    
    GCC 3.4.4 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 27.9667 sec.
    Size: 404463
    Timer erase: 0.476102 sec.
    *** std::set
    Timer: 45.1105 sec.
    Size: 404463
    Timer erase: 0.482932 sec.
    *** std::hash_set
    Timer: 16.078 sec.
    Size: 404463
    *** std::hash_set: to std::vector + std::sort
    Timer: 1.94486 sec.
    Size: 404463
    Full hash timer: 18.0229 sec.
    
    
    
    ---------------- [unique_]priority_queue
    
    
    MSVC 7.1 File: 93 М (russian words)
    
    *** std::priority_queue
    Timer: 66.5425 sec.
    *** pat::unique_priority_queue
    Timer: 31.2714 sec.
    *** pat::unique_priority_queue<std::set>
    Timer: 43.163 sec.
    
    
    GCC 3.4.4 File: 93 М (russian words)
    
    *** std::priority_queue
    Timer: 88.7093 sec.
    *** pat::unique_priority_queue
    Timer: 31.46 sec.
    *** pat::unique_priority_queue<std::set>
    Timer: 42.5287 sec.
    You aren't expected to absorb this
    Re: trie_(map|set), v0.19 и тесты
    От: _nn_ www.nemerleweb.com
    Дата: 11.10.05 20:05
    Оценка:
    Здравствуйте, R.K., Вы писали:

    RK>
    RK>MSVC 7.1 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    RK>*** pat::trie_set
    RK>Timer: 37.3867 sec.
    RK>Size: 404463
    RK>Timer erase: 0.297726 sec.
    RK>*** std::set
    RK>Timer: 54.5871 sec.
    RK>Size: 404463
    RK>Timer erase: 0.302945 sec.
    RK>*** std::hash_set
    RK>Timer: 28.5497 sec.
    RK>Size: 404463
    RK>*** std::hash_set: to std::vector + std::sort
    RK>Timer: 1.42755 sec.
    RK>Size: 404463
    RK>Full hash timer: 29.9773 sec.
    
    
    RK>GCC 3.4.4 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    RK>*** pat::trie_set
    RK>Timer: 27.9667 sec.
    RK>Size: 404463
    RK>Timer erase: 0.476102 sec.
    RK>*** std::set
    RK>Timer: 45.1105 sec.
    RK>Size: 404463
    RK>Timer erase: 0.482932 sec.
    RK>*** std::hash_set
    RK>Timer: 16.078 sec.
    RK>Size: 404463
    RK>*** std::hash_set: to std::vector + std::sort
    RK>Timer: 1.94486 sec.
    RK>Size: 404463
    RK>Full hash timer: 18.0229 sec.
    RK>


    Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[2]: trie_(map|set), v0.19 и тесты
    От: R.K. Украина  
    Дата: 12.10.05 05:39
    Оценка: 5 (1)
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, R.K., Вы писали:


    RK>>
    RK>>MSVC 7.1 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    RK>>*** pat::trie_set
    RK>>Timer: 37.3867 sec.
    RK>>Size: 404463
    RK>>Timer erase: 0.297726 sec.
    RK>>*** std::set
    RK>>Timer: 54.5871 sec.
    RK>>Size: 404463
    RK>>Timer erase: 0.302945 sec.
    RK>>*** std::hash_set
    RK>>Timer: 28.5497 sec.
    RK>>Size: 404463
    RK>>*** std::hash_set: to std::vector + std::sort
    RK>>Timer: 1.42755 sec.
    RK>>Size: 404463
    RK>>Full hash timer: 29.9773 sec.
    
    
    RK>>GCC 3.4.4 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    RK>>*** pat::trie_set
    RK>>Timer: 27.9667 sec.
    RK>>Size: 404463
    RK>>Timer erase: 0.476102 sec.
    RK>>*** std::set
    RK>>Timer: 45.1105 sec.
    RK>>Size: 404463
    RK>>Timer erase: 0.482932 sec.
    RK>>*** std::hash_set
    RK>>Timer: 16.078 sec.
    RK>>Size: 404463
    RK>>*** std::hash_set: to std::vector + std::sort
    RK>>Timer: 1.94486 sec.
    RK>>Size: 404463
    RK>>Full hash timer: 18.0229 sec.
    RK>>
    __>


    __>Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?


    Да. Но hash_set предполагается сравнивать с trie_set<DelusionString>:
    MSVC 7.1 (PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 34.4867 sec.
    Size: 404463
    *** pat::trie_set<pat::DelusionString>
    Timer: 29.6441 sec.
    Size: 404463
    
    
    GCC 3.4.4 (PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 25.2501 sec.
    Size: 404463
    *** pat::trie_set<pat::DelusionString>
    Timer: 23.0039 sec.
    Size: 404463

    Ибо именно DelusionString с соответствующим бит-компаратором (и с включённым PAT_SHORTCUTS) эмулирует работу hash_table. Естественно, в результате получается множество, сортированное по хеш-значениям ключей, т.е. хорошо перемешанное, зато временные показатели добавления будут близки к хешированию, что мы и наблюдаем в тестах Для GCC это менее заметно, видимо реализация hash_set там лучше, чем в VC.
    Вот только возможности trie-контейнеров по различным способам перебора элементов намного превышают стандартные, а уж тем более hash-контейнеры, это можно увидеть в предыдущих моих сообщениях.
    Кстати, забыл одну вещь: в версии 0.19 появилась возможность хранить элементы в обратном порядке ключей назначением контейнеру pat::reverse_bit_comparator (что-то вроде std::greater вместо std::less), например:
    pat::trie_map<std::string,unsigned,pat::reverse_bit_comparator<std::string> >
    You aren't expected to absorb this
    Re[3]: trie_(map|set), v0.19 и тесты
    От: _nn_ www.nemerleweb.com
    Дата: 12.10.05 08:38
    Оценка:
    Здравствуйте, R.K., Вы писали:


    __>>Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?


    RK>Да. Но hash_set предполагается сравнивать с trie_set<DelusionString>:


    Все встало на места

    Что-то я не нахожу файлы тестов, куда вы их выложили ?
    Я хочу сравнить trie_map/set с hash_/map/set от STLPort.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[4]: trie_(map|set), v0.19 и тесты
    От: _nn_ www.nemerleweb.com
    Дата: 12.10.05 09:06
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, R.K., Вы писали:



    __>>>Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?


    RK>>Да. Но hash_set предполагается сравнивать с trie_set<DelusionString>:


    __>Все встало на места


    __>Что-то я не нахожу файлы тестов, куда вы их выложили ?

    __>Я хочу сравнить trie_map/set с hash_/map/set от STLPort.

    Вдогонку было бы неплохо использовать один стиль именования, а то у вас их несколько.
    Лучше все в стиле STL
    Кстати лучше не начинать имена с подчеркивания — _Myt, _Pairib, а еще лучше заменить на что-то более информативное, например this_type, pair_type.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[5]: trie_(map|set), v0.19 и тесты
    От: R.K. Украина  
    Дата: 12.10.05 09:45
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, _nn_, Вы писали:


    __>>Здравствуйте, R.K., Вы писали:



    __>>>>Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?


    RK>>>Да. Но hash_set предполагается сравнивать с trie_set<DelusionString>:


    __>>Все встало на места


    __>>Что-то я не нахожу файлы тестов, куда вы их выложили ?


    В архиве с 0.19 версией:
    speed_test.cpp
    speed_test_pq.cpp

    __>>Я хочу сравнить trie_map/set с hash_/map/set от STLPort.


    __>Вдогонку было бы неплохо использовать один стиль именования, а то у вас их несколько.


    Всего два: мой текущий (я их сменил уже с полдесятка;) и STL. Там где стиль вылезает на поверхность в виде интерфейсов — там "like STL".

    __>Лучше все в стиле STL


    Со-омнительно... мне он не нравится

    __>Кстати лучше не начинать имена с подчеркивания — _Myt, _Pairib, а еще лучше заменить на что-то более информативное, например this_type, pair_type.


    Это да. Будет время — исправлю.
    You aren't expected to absorb this
    Re[6]: trie_(map|set), v0.19 и тесты
    От: _nn_ www.nemerleweb.com
    Дата: 12.10.05 11:15
    Оценка:
    Здравствуйте, R.K., Вы писали:

    RK>Здравствуйте, _nn_, Вы писали:


    __>>Здравствуйте, _nn_, Вы писали:


    __>>>Здравствуйте, R.K., Вы писали:



    __>>>>>Что-то я недопонял тест, hash_set получается выходит намного быстрее чем pat::trie_set ?


    RK>>>>Да. Но hash_set предполагается сравнивать с trie_set<DelusionString>:


    __>>>Все встало на места


    __>>>Что-то я не нахожу файлы тестов, куда вы их выложили ?


    RK>В архиве с 0.19 версией:

    RK>speed_test.cpp
    RK>speed_test_pq.cpp

    Я не заметил что 0.17 была скачена
    Тогда скоро будут тесты с STLPort

    __>>>Я хочу сравнить trie_map/set с hash_/map/set от STLPort.


    __>>Вдогонку было бы неплохо использовать один стиль именования, а то у вас их несколько.


    RK>Всего два: мой текущий (я их сменил уже с полдесятка;) и STL. Там где стиль вылезает на поверхность в виде интерфейсов — там "like STL".


    __>>Лучше все в стиле STL


    RK>Со-омнительно... мне он не нравится

    Ну дело вкуса

    __>>Кстати лучше не начинать имена с подчеркивания — _Myt, _Pairib, а еще лучше заменить на что-то более информативное, например this_type, pair_type.


    RK>Это да. Будет время — исправлю.

    Ждем-с
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re: trie_(map|set), v0.19 и тесты
    От: _nn_ www.nemerleweb.com
    Дата: 12.10.05 14:08
    Оценка:
    Здравствуйте, R.K., Вы писали:

    Кстати версия 0.19 не компилируется с STLPort, так как в нем нет hash_compare.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[2]: trie_(map|set), v0.19 и тесты
    От: R.K. Украина  
    Дата: 13.10.05 05:47
    Оценка:
    Здравствуйте, _nn_, Вы писали:

    __>Здравствуйте, R.K., Вы писали:


    __>Кстати версия 0.19 не компилируется с STLPort, так как в нем нет hash_compare.


    Просто закомментировать объявление и употребление string_hash_compare и всё должно пройти. Там и так очень классная хеш-функция, судя по тестам:
    --------------- STLPort
    
    
    MSVC 7.1 + STLPort 4.6.2 (PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 20.7815 sec.
    Size: 404463
    Timer erase: 10.9516 sec.
    *** pat::trie_set<pat::DelusionString>
    Timer: 19.1018 sec.
    Size: 404463
    *** std::set
    
    
    MSVC 7.1 + STLPort 4.6.2 (w/o PAT_SHORTCUTS) File: 93 М (russian words)
    
    *** pat::trie_set
    Timer: 21.983 sec.
    Size: 404463
    Timer erase: 0.156297 sec.
    *** std::set
    Timer: 53.3017 sec.
    Size: 404463
    Timer erase: 0.140155 sec.
    *** std::hash_set
    Timer: 10.9704 sec. // поражает воображение!
    Size: 404463
    *** std::hash_set: to std::vector + std::sort
    Timer: 1.44805 sec.
    Size: 404463
    Full hash timer: 12.4185 sec.


    (с ухмылкой) Однако, всё та же "посредственная реализация", выбранная мною изначально (см. stlport\stl\_hash_fun.h):
    inline size_t __stl_hash_string(const char* __s)
    {
      _STLP_FIX_LITERAL_BUG(__s)
      unsigned long __h = 0; 
      for ( ; *__s; ++__s)
        __h = 5*__h + *__s;
      
      return size_t(__h);
    }


    Видимо-таки реализация самой хеш-тейбл удачная.
    You aren't expected to absorb this
    trie_(map|set), v0.23 и дерево суффиксов
    От: R.K. Украина  
    Дата: 18.10.05 20:05
    Оценка:
    Привет всем!

    trie_(map|set), v0.23 (MSVC 7.1, GCC 3.2, Comeau 4.3):

    Теперь о самом интересном.
    В анонсе суффиксных деревьев
    Автор: R.K.
    Дата: 05.10.05
    говорится:

    контейнеры, аналогичные суффиксным деревьям (время добавления очередного суффикса константно)

    Насчёт времени добавления я немного ошибся: на самом деле сложность индексирования всей строки линейно зависит от её длины; получается, что добавление одного суффикса константно лишь в среднем.
    Но это не меняет сути дела: в текущую версию дополнительных контейнеров STL добавлен прототип шаблона контейнера suffix_set, реализующий динамическое суффиксное дерево на основе PATRICIA trie.
    Интерфейс suffix_set:
    // constructor
    suffix_set(
        key_type keys,            // передается указатель на начало суффиксного буфера (на первый суффикс)
        size_type size,            // размер окна (одновременно индексируемых суффиксов)
        const bit_compare &bitComp=bit_compare(),
        const allocator_type &alloc=allocator_type());
    // в конструкторе сразу добавляется первый узел, он же root
    // инвариант для suffix_set: в контейнере должен быть хотя бы один суффикс
        
    // вставляем очередной суффикс (следующий по возрастанию адресов)
    void push_back();
    
    // удаляем наиболее ранний суффикс (первый по порядку добавления)
    void pop_front(); // именно этот метод делает suffix_set динамическим
    
    bool full() const; // true, если нет места для добавления очередного суффикса
    
    size_type size() const; // возвращает текущее кол-во суффиксов

    Подобный интерфейс, привычный для очереди (push_back/pop_front), обусловлен необходимостью последовательного (без пропусков) добавления/удаления суффиксов, а также произвольного доступа (по порядку добавления) к узлам дерева и к соответствующим им суффиксам, которые играют роль ключей.
    Для реализации внутреннего хранения узлов цифрового дерева был выбран кольцевой буфер (см. ring_buffer.h), как структура, свойства которой наиболее соответствуют требованиям дерева суффиксов.
    Требования к памяти: <индексируемая строка> + <размер окна suffix_set>*sizeof(Node). sizeof(Node) при включенном PAT_ALIGNHACK составляет 16 байт.
    Все возможности, доступные в trie_set, доступны и в suffix_set (пока есть const_(iterator|partimator)), за исключением тех, которые основаны на конечности ключей, ибо суффиксы обязаны быть бесконечными. Ещё одно отличие состоит в том, что, во избежание избыточности, в узлах suffix_set не хранятся указатели на суффиксы, но на внешнем интерфейсе это не отражается.
    Пример работы с suffix_set см. test_suffix.cpp. На моём P4-2.8 1G RAM файл в 33М полностью индексировался (размер окна == длине файла) за 18 сек., исп. ОЗУ — 570М. Файл 75М с окном 4М динамически индексировался за 60 сек., исп. ОЗУ — 140М.
    Основной причиной реализации этого прототипа была необходимость проверить, будут ли работать мои, до сей поры чисто умозрительные, алгоритмы на практике. Так что ещё предстоит довести дерево суффиксов до нормального состояния, обобщив его с trie_* контейнерами, сделать suffix_map (трудно представить, как его можно использовать, но на всякий случай;). Также стоит подумать об уменьшении объема используемого ОЗУ и об алгоритмах, эффективно реализуемых с suffix trie.
    You aren't expected to absorb this
    (trie_|suffix_)(map|set), v0.29, long-expected ;)
    От: R.K. Украина  
    Дата: 03.11.05 12:16
    Оценка:
    Привет всем!

    (trie_|suffix_)(map|set), v0.29 (MSVC 7.1, GCC 3.2, Comeau 4.3).
    Пришлось переписать заново практически всё. По основным пунктам:
    You aren't expected to absorb this
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.