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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бесконечное деление пирамиды 
:(
    Опции темы
nepster
Дата 2.8.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



как вы думаете, сколько бы стоила разработка скрипта финансовой пирамиды ? 
PM MAIL   Вверх
baldina
Дата 2.8.2012, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



а задача уже поставлена? огласите весь список, пожалуйста

Добавлено через 6 минут и 57 секунд
операции на основе двоичных деревьев займут строк 20.
если запихнуть это в класс и добавить комментарии - может до 100-150 вырасти.
а уж что бы решить всю задачу (про которую мы так ничего и не знаем) может и 1000, и 10000 придется написать.
Вы определяете сколько взять с заказчика? Сначала определитесь с требованиями к скрипту.
ЗЫ: Можно заделать на основе Nested Sets, там одних скриптов на sql строк 500 будет))

Добавлено через 12 минут и 3 секунды
Цитата

— За сколько сделаешь?
— За день сделаю.
— А за два?
— Ну… За… Сделаем и за два.
— А за пять дней?
— Ну, ежели постараться — можно и за пять.
— А за десять?
— Ну, барин, ты задачи ставишь! За десять дён одному не справиться, тут помощник нужен — хомо сапиенс!

PM MAIL   Вверх
nepster
Дата 3.8.2012, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пирамида пользователей. Подтвердить пользователя, удалить пользователя их пирамиды. 
История пирамид. К примеру юзер выбыл, но он пожет посмотреть свою пирамиду и пирамиды тех кого пригласил. Тоесть можно воспроизводить пирамиды определенного юзера.  Все это модуль к джумле( джумла - это не моя идея =) ).

Собственно вот. Как думаете какая будет цена данной работы ? 

Видел классы, там сайт автора не работает, при том тут нет порядка вложенности. Сегодня почти доделал скрипт воспроизведения пирамиды (html таблице) из массива данных.  Как доделаю кину на заценить =).
PM MAIL   Вверх
baldina
Дата 3.8.2012, 11:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(nepster @  3.8.2012,  03:05 Найти цитируемый пост)
Видел классы, там сайт автора не работает, при том тут нет порядка вложенности. 

переведи

Добавлено через 2 минуты и 59 секунд
Цитата(nepster @  3.8.2012,  03:05 Найти цитируемый пост)
История пирамид. К примеру юзер выбыл, но он пожет посмотреть свою пирамиду и пирамиды тех кого пригласил.

это как может быть? согласно предыдущему разговору они либо в одной пирамиде, либо тот кто пригласил уже вне пирамид, неактивен (прикопан=).
если последнее, то все так же просто, т.к. ничего не удаляется, а просто помечается, т.е. историю можно восстановить 
PM MAIL   Вверх
Чучмек
Дата 3.8.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

Репутация: 4
Всего: 41



Должно быть два массива: массив  users и массив верхушек пирамид tops

Массив users в виде дерева:
                                                                                                     [0]
                                                  [1]                                                                                                   [2]
                         [3]                                              [4]                                                [5]                                               [6]
            [7]                    [8]                      [9]                    [10]                   [11]                    [12]                  [13]                     [14]
    [15]      [16]      [17]      [18]       [19]      [20]       [21]      [22]      [23]       [24]       [25]      [26]      [27]       [28]      [29]       [30]
[31][32][33][34][35][36][37][38][39][40][41][42][43][44][45][46][47][48][49][50][51][52][53][54][55][56][57][58][59][60][61][62]

Очевидно что уровень n - будет содержать  2^n элементов
Индекс 1го элемента на уровне n ,будет (I+1)*2^n-1 где I-индекс вершины
Так если вершина - элемент с индексом 10
То на 0 уровне  (10+1)*1-1=10
    на 1 уровне   (10+1)*2-1=21
    на 2  уровне  (10+1)*4-1=43

Перебор элементов пирамиды
Код

//$I - содержит индекс вершины
//$ncount - содержит число уровней в пирамиде
for ($n=0;$n<$ncount;$n++)
 {
 $lcount=1 << $n;
 $i0=($I+1)* $lcount-1;
 for($il=$i0;$il<$i0+$lcount;$il++)
   {
   //что-нибудь делаем с $users[$il]
   }
 }  


Определение пирамиды(индекс вершины) , к которой принадлежит элемент с индексом $i
Код

$I=$i;
while (!in_array($I,$tops))
  {
  $I= ($I-1) >>1;
  } 

По заполнении пирамиды индекс ее вершины удаляется из $tops, а индексы ее элементов  с уровня 1 добавляются в конец $tops

Это сообщение отредактировал(а) Чучмек - 3.8.2012, 22:05


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Fortop
Дата 4.8.2012, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Чучмек @  3.8.2012,  21:55 Найти цитируемый пост)
Должно быть два массива: массив  users и массив верхушек пирамид tops


Цитата(Чучмек @  3.8.2012,  21:55 Найти цитируемый пост)
о заполнении пирамиды индекс ее вершины удаляется из $tops, а индексы ее элементов  с уровня 1 добавляются в конец $tops

Блин, а зачем?

Кто мешает хранить атрибут сразу вместе с элементом?
Выбрать любой произвольный элемент с его иерархией можно простой итерацией.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
nepster
Дата 4.8.2012, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

таблица users и pyramid 

pyramid

Код

+--------+----------+---------+------+
| id | top_user | set     | status | 
+--------+----------+---------+------+
| 0  | 23           | json   | 1           |       
| 1  | 26           | json   | 0           |       
| 2  | 12           | json   | 1           |       
| 3  | 76           | json   | 0           |       
+--------+----------+---------+------+



top_user  - id пользователя, который на верху 
         set  - json со списком юзеров 
    status  - 1 пирамида в действии, 0 - закончена. 


json данные будут выглядеть примерно так 

Код

[[{"cell_id":2,"user_id":43}],[{"cell_id":4,"user_id":32},{"cell_id":5,"user_id":343},{"cell_id":5,"user_id":343}],[{"cell_id":8,"user_id":11},
{"cell_id":9,"user_id":12},{"cell_id":10,"user_id":13},{"cell_id":11,"user_id":14},{"cell_id":11,"user_id":14},{"cell_id":11,"user_id":14},
{"cell_id":11,"user_id":14},{"cell_id":11,"user_id":14},{"cell_id":11,"user_id":14}],[{"cell_id":8,"user_id":0},{"cell_id":9,"user_id":0},
{"cell_id":10,"user_id":0},{"cell_id":11,"user_id":0},{"cell_id":12,"user_id":0},{"cell_id":13,"user_id":0},{"cell_id":14,"user_id":0},{"cell_id":15,"user_id":0},
{"cell_id":15,"user_id":0},{"cell_id":16,"user_id":0},{"cell_id":17,"user_id":54},{"cell_id":18,"user_id":0},{"cell_id":19,"user_id":0},{"cell_id":20,"user_id":0},
{"cell_id":21,"user_id":0},{"cell_id":22,"user_id":0},{"cell_id":23,"user_id":0},{"cell_id":24,"user_id":0},{"cell_id":25,"user_id":0},{"cell_id":26,"user_id":0},
{"cell_id":27,"user_id":0},{"cell_id":28,"user_id":0},{"cell_id":29,"user_id":0},{"cell_id":30,"user_id":0},{"cell_id":31,"user_id":0},{"cell_id":32,"user_id":0},
{"cell_id":33,"user_id":0}]]





Теперь как мы делаем,  если нужно показать пирамиду  пользователя, который номер 1 в ней,  мы достаем запись где top_user равен указанному id достаем json данные декодируем их в массив и передаем в класс, который сгенерирует нам нашу пирамидку. 

Единственное, что вижу проблему, как мы думаете:

Если нужно показать пирамиду юзера, который скажем не 1, а где то в центре пирамиды. Тоесть его id мелькает в json данных, как скрипт справиться примерно с такой задачей: 

  - достать все  записи из таблицы Пирамида 
  - открыть циклы, который проходится по каждой записи и достает данные json 
  - еще 1 цикл, который проходится в данных json и ищет нужный id. 

На глаз примерно так:

нужно найти этого юзера (id 54), он где то залез в джейсоне

Код


SELECT * FROM pyramid WHERE status = 1; // получаем, все действующие пирамиды пусть они будут в переменной $data

foreach ($data as $item){ // пройдемся по всем записям 
 
    $item['set'] = json_decode($item['set'] ,true); // декодируем джейсон в массив 
   // массивчик у нас многомерный


   for($i=1; $i<count($item['set'] ); $i++) { // пробираемся по все уровням массива (их 4). 1 уровень это 1 юзер, 2 уровень это 3 юзера, 3 уровень это 9 юзеров и 4 уровень 27 юзеров. (заданице немного поменяли на "троичную пирамиду" ). Поставим даже $i =1 , что бы 1 уровень не проверять. 

       // ну а тут мы бегаем уже по юзерам, которые в уровне 
        for($z=0; $z<count($item['set'][$i]); $z++) {

            if(id нужного нам юзера == $item['set'][$i][$z]['user_id']) {
                     
                   // юзера нашли, ставим метку и выходим из циклов. 
                   break; 
           }

       }


  }
    

}




Конечно это будет функция к примеру если юзер найдет она возвращает id записи, если нет то false. Как думаете, логично будет использовать такой вариант ?   



Это сообщение отредактировал(а) nepster - 4.8.2012, 03:22
PM MAIL   Вверх
Чучмек
Дата 4.8.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

Репутация: 4
Всего: 41



Цитата(Fortop @  4.8.2012,  03:17 Найти цитируемый пост)
Кто мешает хранить атрибут сразу вместе с элементом?

Объем данных +50% При неиндексированном статусе замедлится поиск на несколько порядков, при индексированном - еще +50%.
Mеняем tops (количество элементов = количестово пирамид) на индекс (количество элементов=количество пользователей)
Цитата(nepster @  4.8.2012,  03:21 Найти цитируемый пост)
Теперь как мы делаем,  если нужно показать пирамиду  пользователя, который номер 1 в ней,  мы достаем запись где top_user равен указанному id достаем json данные декодируем их в массив и передаем в класс, который сгенерирует нам нашу пирамидку. 

А какой механизм добавления нового пользователя в пирамиду? 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
nepster
Дата 4.8.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



об этом я еще не думал, но на вскидку такой: 

 к примеру есть пирамида она заполнена вся кроме последнего юзера. Тоесть на 4 уровне заполнено 26 ячеек из 27. 
 есть пользователь Вася, который хочет пригласить друга. Вот он приглашает друга, друг становится на 27 место. 

 к примеру каждый раз когда мы добавляем юзера, мы проверяем сколько мест осталось. 



Код

if(оставшихся мест == 0) {
         // тут запустим класс, который завершит пирамиду статусом 0
         // создаст еще 3 записи в таблицу pyramid, это и будут наши новые 3 мирамиды. 
         // так же еще 1 скрипт сгенерирует нужной json,  для поля set
}


Добавлено через 41 секунду
на самом деле интересненькое такое заданице. 
PM MAIL   Вверх
Чучмек
Дата 4.8.2012, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

Репутация: 4
Всего: 41



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


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
nepster
Дата 5.8.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я не понял, а как мы в вашем варианте воспроизведем пирамиду определенного юзера ? 
PM MAIL   Вверх
Чучмек
Дата 5.8.2012, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

Репутация: 4
Всего: 41



Таблица users
Код

+------+----------+
| ind  |  user_id |
+------+----------+ 

ind - индекс в дереве
Получаем индекс пользователя по user_id 
Код

$query='SELECT ind FROM users WHERE user_id='.$user_id; 


Таблица tops
Код

+---------+-------------+
| status  | users_ind   |
+---------+-------------+

status, например, 1 (not_full)- не заполненная пирамида, 0(full) -  заполненная пирамида
Получаем пирамиду  пользователя (вершину) по индексу
Код

if ($list=$ind)
  {
  do
    {
    $ind=($ind-1)>>1;
    $list.=','.$ind;
    }while($ind);
  }
$query='SELECT users_ind FROM tops WHERE status=1 AND  users_ind IN ('.$list.')';


Получаем всех пользователей из пирамиды
Код

$list='ind='.$ind;
for ($n=1;$n<$ncount;$n++)
 {
 $lcount=1 << $n;
 $i0=($ind+1)* $lcount-1;
 $list.=' OR ind BETWEEN '.$i0.' AND '.($i0+$lcount-1);
 }  
$query='SELECT * FROM users WHERE '.$list;







Это сообщение отредактировал(а) Чучмек - 5.8.2012, 08:44


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Fortop
Дата 5.8.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Чучмек @  4.8.2012,  11:06 Найти цитируемый пост)
Объем данных +50% При неиндексированном статусе замедлится поиск на несколько порядков, при индексированном - еще +50%.
Mеняем tops (количество элементов = количестово пирамид) на индекс (количество элементов=количество пользователей)

Как ты думаешь, что такое твой второй массив вершин и что в нем окажется?



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Чучмек
Дата 5.8.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

Репутация: 4
Всего: 41



Цитата(Fortop @  5.8.2012,  09:39 Найти цитируемый пост)
Как ты думаешь, что такое твой второй массив вершин и что в нем окажется?

Если из него  заполненные  не удалять, а помечать, то (при условии равномерного заполнения дерева) count(tops) * 2^n = count(users) , где n - число уровней в пирамиде.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
nepster
Дата 5.8.2012, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чучмек


Код

Получаем всех пользователей из пирамидыкод PHP

$list='ind='.$ind;
for ($n=1;$n<$ncount;$n++)
 {
 $lcount=1 << $n;
 $i0=($ind+1)* $lcount-1;
 $list.=' OR ind BETWEEN '.$i0.' AND '.($i0+$lcount-1);
 }  
$query='SELECT * FROM users WHERE '.$list;



Как я понял на выходе мы получим массив со всеми id пользователей для какой-то пирамиды.

Тогда в любом случае нам нужно собрать ее в массив, что бы передать классу, который соберет массив в таблицу и оформит дизайн. 
+ мы можем не восстановить нужный порядок пользователей в пирамиде, и на каком уровне пользователь. 
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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