Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Убираем рекурсию 
:(
    Опции темы
PROme
  Дата 8.1.2004, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Значит так.

Есть функция с несколькими входными параметрами.

Она служит для построения двоичного дерева, инфа о котором хранится в файле: строчка-ветка, попорядку (левая ветка, правая ветка, предки, инфу разделяют пробелы). Например
1
/ \
2 4
/ \
3 5
/
6

будет выглядеть так:
2 4 -
3 5 1
- - 2
- - 1
6 - 2
- - 5

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

Сразу после вызова из функции идет exit; чтоб после выполнения копии себя сразу выйти, так как дальше уже нечего делать.

Проблема в том что количество веток может достигать 10 000 и более. При таком количестве, боюсь пользователь будет дооооолго ждать выполнения скрипта (если такое вобще будет возможно).

Может в данном случае можно как-то избежать рекурсииconfused.gif Идея то в том что она совсем и не нужна фактически - т.е. после выполнения функции n и возврата ф функцию (n-1) происходит выход из нее (ну недоходчиво объясняю, скажу еще другими словами - после того как функция отработала свое и вызвала себя рекурсивно, то те пересенные, которые в ней будут храниться, пока все вышестоящие рекурсивные функции не выполнятся будут занимать лишнюю память при том что в дальнейшем они вовсе будут НЕНУЖНЫ).

Т.е. может можно как-то вызвать себя и сразу после этого (или вовремя или как еще) уничтожить свои переменныеconfused.gif

ЗЫ: если у кого есть идеи, алгоритмы или скрипты на данную тему, плиз подкиньте.


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 9.1.2004, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Есть теорема, что любую рекурсию можно заменить рядом простых циклов.

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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 9.1.2004, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Обычное бинарное дерево.
С обной ветки идет не больше 2-х (может одна, может не обной), ветка сама по себе быть не может, должна быть связана с деревом.
В общем в таком духе:
Код

       1
      / \
     2   3
    / \    \
   4   5    6
              \
               7
              / \
              8  9


Это сообщение отредактировал(а) PROme - 9.1.2004, 09:03


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 9.1.2004, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



С веткой понятно.
Как данные хранятся, и что в итоге получить нужно? Изображение всего дерева, одну ветку,.... confused.gif?

Подробно опиши задачу: исходные данные, вычесления, конечный результат.

Это сообщение отредактировал(а) Secandr - 9.1.2004, 17:30


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
PROme
Дата 9.1.2004, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Как хранятся данные я писал.
Каждая ветка имеет свой номер.
Новер ветки - новер рядка в файле.
3 значения в строчке разделяет пробел, значения обозначают:
ветка1 ветка2 предок
Для последнего примера файл:

2 3 -
4 5 1
- 6 1
- - 2
- - 2
- 7 3
8 9 6
- - 7
- - 7

Что нужно? Ну хотябы по этим данным скрипт строил то дерево, которому они соответствуют.

ЗЫ: повторюсь, я не изучал двоичные деревья, а данный метод сохранения двоичных деревьев придуман мной лишь на основании своих наблюдений, как самый економичный и удобный одновременно smile.gif
но это не значит что не существует лучшего алгоритма
может кто знаетconfused.gif

ПОМОГИТЕ ПЛИЗ!!!


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Secandr
Дата 11.1.2004, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Предлогаю хранить данные в таком виде:

;предок-потомок;предок-потомок;предок-потомок;предок-потомок;
;1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;

Тогда просто добавить потомка:
";1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;" . "8-10;"

Удалить:
ereg_replace( ';[0-9]+-5;' , ';' , ';1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;');

Переместить ветку 6-7-... и поставить её после 4

ereg_replace( ';[0-9]+-5;' , ';4-5;' , ';1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;');



--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 11.1.2004, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Теперь вопрос посложнее: находим ветку от 9 до 1:
Код
$fl=";1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;";
$p=9;
$line[]=$p;
while ($p!=1){
 eregi(";([0-9]+)-$p;",$fl,$tmp);
 $p=$tmp[1];
 if ($p<1){print"битое дерево";exit;}
 $line[]=$p;
}
print join('-',$line);


P.S.Блин, свет вырубили и всё что написал пропало sad.gif
P.P.S. Это не готовый код, а только принцип по которому можно организовать работу.



--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 11.1.2004, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Код
$level[1]=0;
$map=',1,';

$all=split(';' , ";1-2;1-3;2-4;2-5;3-6;6-7;7-8;7-9;");

while (is_array($all)){
 unset($next);
 foreach($all as $one){
   $tmp=split('-',$one)
   $parent=$tmp[0];//предок
   $this=$tmp[1];//текущее значение

   if (strrpos($mystring, ",$parent,")>0){//предок уже записан

      eregi_replace(",$parent,",",$parent,$this,",$map);//добавим потомка в строку за предком
      $level[$this]=$level[$parent]+1;//Уровень потомка на 1 выше уровня предка

    }else{//предок ещё не внесён, отложим обработку до внесения предка
      $next[]=$one;
    }
 }
 $all=$next;// будем проверять отложеные
}
//теперь мы получили строку вида 1,2,4,5,3,6,7,8,9 и амссив с уровнем каждого элемента.
// Это можно превратить в дерево.
$all=split(',',$map);

echo '<table border=0>'
foreach ($all as one){
 if ($one>0){
   echo '<tr>'
   for(i=0;$level[$one];$i++){echo'<td>+</td>'}
   echo"<td>$a</td>";
   echo "</tr>";
 }
}
echo"</table>";

получишь:
Код

1
+2
++4
++5
+3
++6
+++7
++++8
++++9


Это сообщение отредактировал(а) Secandr - 11.1.2004, 14:04


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 11.1.2004, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



Если проапгрейдить скрипт можно сделать что-то вида:
Код

1
+2
i+4
i\5
+3
+6
 +7
  +8
  \9
Только заменить картинками, и получить красивое дерево.

P.S. Код писал с головы, так что могут быть очепятки sad.gif

Это сообщение отредактировал(а) Secandr - 11.1.2004, 14:09


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.