суббота, 31 июля 2010 г.

Библиотека Dlib. Пример использования класса bigint

    Класс bigint позволяет манипулировать с целыми числами без знака, диапазон значений которых ограничивается только доступными ресурсами системы. Есть две реализации больших целых чисел: bigint_kernel_1 и bigint_kernel_2. Единственное отличие bigint_kernel_2, это использование быстрого преобразования Фурье для выполнения операции умножения.

#include <iostream>
#include "../dlib/bigint.h"

typedef dlib::bigint::kernel_2a BigInt;

BigInt factorial(BigInt num);

int main(int ac, char** av)
{
     std::cout << factorial(10000) << std::endl;
     return 0;
}

/*
Для большого значения num лучше использовать один из
алгоритмов приведенных на странице:
http://www.luschny.de/math/factorial/FastFactorialFunctions.htm
*/
BigInt factorial(BigInt num)
{
    BigInt result = 1;
    
    for ( BigInt i=num; 0<i; i-- )
        result *= i;

    return result;
}

Вывод команды ./bigint | wc -m
35672                                                                            

пятница, 30 июля 2010 г.

Библиотека Dlib

     Dlib - это переносимая С++ библиотека общего назначения. Библиотека распространяется под свободной лицензией  Boost Software License и включает в себя много полезных классов и функций. Основные возможности:
  • Потоки (переносимый API для работы с потоками, межпотоковое взаимодействие по средствам pipe, локальные данные потока, пул потоков, механизм запуска глобальных функций в отдельном потоке и др.)
  • Сетевое программирование (переносимый API для работы с TCP сокетами, TCP сервер, HTTP сервер и др.)
  • Графический интерфейс пользователя (переносимый и потокобезопасный GUI API)
  • Численные алгоритмы (матрицы и операции над ними, алгоритмы нелинейной оптимизации, целые числа с диапазоном ограниченным только ресурсами системы, генератор псевдослучайных чисел и др.)
  • Алгоритмы машинного обучения
  • Алгоритмы для вычислений и обучения байесовских сетей.
  • Обработка изображений (чтение и запись формата Windows BMP, выделение границ, компьютерное зрение и др.).
  • Алгоритмы сжатия и проверки целостности (CRC32, MD5, LZP и др.).
  • Тестирование (потокобезопасный класс ведения лога, модельное тестирование, макросы проверки предусловий).
  • Полезные классы общего назначения (разбор XML, разбор параметров командной строки, различные контейнеры, base64 и др.). 
Сайт проекта

Библиотека Dlib. Пример использования шаблона класса binary_search_tree.

    Бинарное дерево поиска имеет две реализации: с использованием AVL бинарных деревьев binary_search_tree_kernel_1 и красно-черные бинарные деревья binary_search_tree_kernel_2

template <typename domain, 
          typename range, 
          typename mem_manager = memory_manager<char>::kernel_1a, 
          typename compare = std::less<domain> 
         > 
class binary_search_tree;

domain — тип ключа, должен позволять использовать специализации swap и  std::less, а также иметь конструктор по умолчанию.
range — тип значения, должен позволять использовать специализации swap и иметь конструктор по умолчанию.

#include <iostream>
#include <stdlib.h>
#include "../dlib/binary_search_tree.h"

//используем реализацию AVL бинарных деревьев
typedef dlib::binary_search_tree<int, int>::kernel_1a bst;


/*Функция печатает информацию о высоте дерева и количестве узлов*/
void printTreeInfo(const bst& tree)
{
   std::cout << "Size: "  << tree.size();
   std::cout << "  Height: " << tree.height() << "\n";
}

int main(int argc, char** argv)
{
    bst tree;

// добавляем в дерево числа от 1 до 99.
    for ( int i = 1; i<100; i++ ){
       int r = 0;
       int d = i;
       tree.add(d, r);
    }
 
// поиск значения по ключу
    int* f = tree[99];
    if ( f ) std::cout << "find\n";
   
    printTreeInfo(tree);

// очистка дерева
    tree.clear();
 
    printTreeInfo(tree);

// добавляем в дерево случайные числа в диапазоне от 0 до 99
    for ( int i = 1; i<100; i++ ){
       int r = 0;
       int d = rand() % 100;
       tree.add(d, r);
    }
   
    printTreeInfo(tree);
   
    return 0;
} 
 
Вывод программы:
find
Size: 99  Height: 7
Size: 0   Height: 0
Size: 99  Height: 8