Объединенный Открытый Проект - Сайт для Настоящих Компьютерщиков

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

; Логин:
  Пароль:
Обычный
Безопасный
Запомнить пользователя



Зарегистрироваться
Забыли пароль?
 
 
 
Объединенный Открытый Проект »   Программирование »   Perl »   Binary Tree
RSS

Binary Tree

Текущий рейтинг темы: Нет

<<Назад  Вперед>>Печать
 
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Как построить бинарное дерево на основе 4 октетных данных вида "127.0.0.1"(например, но их множество) и обойти его при помощи логики двоичного логарифма?

ессно дело юзается Перл.

точнее сказать есть строка вида 10.0.0.52 надо найти аналогичное значение в этом дереве, тоесть например если в нём есть 10.0.0.0/24, то срабатывает процедура, если же ни чего не найдено то срабатывает другая процедура.

Массивы не предлагать, т.к. они будут отрабатываться дольше, а время - критично;
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Оффтопик: Тут я тебе вряд ли чем смогу помочь: с бинарными деревьями сам не очень хорошо знаком...

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Вот, кое что нашёл. Но пока разобраться не могу, как это можно использовать...



use Tree::Binary;

  

  # a tree representaion of the expression:

  #     ((2 + 2) * (4 + 5))

  my $btree = Tree::Binary->new("*")

                          ->setLeft(

                              Tree::Binary->new("+")

                                          ->setLeft(Tree::Binary->new("2"))

                                          ->setRight(Tree::Binary->new("2"))

                          )

                          ->setRight(

                              Tree::Binary->new("+")

                                          ->setLeft(Tree::Binary->new("4"))

                                          ->setRight(Tree::Binary->new("5"))

                          );  

  # Or shown visually:

  #     +---(*)---+

  #     |         |

  #  +-(+)-+   +-(+)-+

  #  |     |   |     |

  # (2)   (2) (4)   (5)

  

  # get a InOrder visitor

  my $visitor = Tree::Binary::Visitor::InOrderTraversal->new();

  $btree->accept($visitor);    

  

  # print the expression in infix order

  print $visitor->getAccumulation(); # prints "2 + 2 * 4 + 5"

  

  # get a PreOrder visitor

  my $visitor = Tree::Binary::Visitor::PreOrderTraversal->new();

  $btree->accept($visitor);    



  # print the expression in prefix order  

  print $visitor->getAccumulation(); # prints "* + 2 2 + 4 5"

  

  # get a PostOrder visitor

  my $visitor = Tree::Binary::Visitor::PostOrderTraversal->new();

  $btree->accept($visitor);    

  

  # print the expression in postfix order  

  print $visitor->getAccumulation(); # prints "2 2 + 4 5 + *"    

  

  # get a Breadth First visitor

  my $visitor = Tree::Binary::Visitor::BreadthFirstTraversal->new();

  $btree->accept($visitor);    



  # print the expression in breadth first order  

  print $visitor->getAccumulation(); # prints "* + + 2 2 4 5"    

  

  # be sure to clean up all circular references

  $btree->DESTROY();





http://search.cpan.org/~stevan/Tree-Binary-0.07/lib/Tree/Binary.pm



Пожалуй пока на массивах сделаю, тачка выдержит, а затем уже потихоньку на бинарное дерево буду переделывать.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Тебе для твоей задачи, видимо, больше подойдет не Tree::Binary, а Tree::Binary::Search.
А процедуру, которая будет преобразоывать конкретный IP-адрес в адрес подсети, скорее всего, придется писать самому, или искать отдельный модуль, напрямую с Tree не связаный....
Оффтопик: А я-то думал, ты сам собираешься дерево реализовывать...

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Я похож на извращенца ? Процедуру я уже пишу, точнее пишу функции нахождения минимлаьного и максимального ИП адреса в заданной сети(заданная сеть пример: 10.1.1.1/29)

Ок, сейчас гляну что к чему.Я вот ещё думаю, а может быть ХЕШ по генереить? не будет лиэто проще для дерева или всё таки затраты на вычисления хеша(аля сдвигов) будут слишком велики?
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
На извращенца как раз иногда бываю похож я, т.к. терпеть не могу использовать чужой код (за исключением функций, изначально встроенных в язык).
Оффтопик: Вот поэтому я и люблю PHP — там их много...

Зачем тебе хеш? Я тут посмотрел документацию на Tree::Binary::Search и пришел к выводу, что тебе нужно сделать вот что: написать процедуру, которая берет конкретный IP-адрес и адрес сети и сравнивает их (причем не только на равенство, но и на больше/меньше) и "подвесить" ее к дереву с помощью setComparisionFunction (или что-то в этом роде). И тогда все будет работать как надо...

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
<<Назад  Вперед>>Печать
Объединенный Открытый Проект »   Программирование »   Perl »   Binary Tree
RSS
Быстрый переход в раздел:


Время выполнения скрипта: 0.0670. Количество выполненных запросов: 18, время выполнения запросов 0.0264