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

Поиск:

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


Опытный
**


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

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



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

Сама задача такая, есть пирамида:



Код

                              [1]
                          [2]    [3]
                      [4] [5]    [6] [7]
            [8] [9] [10] [11]    [12] [13] [14] [15]



тоесть ячейки: 1,2,4,8,16   и тд. 


когда заполняются все поля, то пирамида делится на еще 2 пирамиды и к ним в конец добавляется еще 8 ячеек.


Код

                              
                          [2]   
                        [4] [5]   
                   [8] [9]  [10] [11]   
          [-] [-] [-] [-]  [-] [-] [-] [-]   



Код

                      
                         [3]
                      [6] [7]
                [12] [13] [14] [15]
          [-] [-] [-] [-]  [-] [-] [-] [-]   



дальше, как только последние 8 ячеек (их может быть и 16, не важно) заполняются, то эти 2 пирамиды делятся еще, каждая по две 
(и так же в конец 8 ячеек )







1 пирамида 

Код

                      
                    
                      [4]                                      [5]
                  [8] [9]                                  [10] [11]
              [-] [-] [-] [-]                            [-] [-] [-] [-]   
       [-] [-] [-] [-] [-] [-] [-] [-]         [-] [-] [-] [-]  [-] [-] [-] [-]






2 пирамида 

Код

                      
                    
                      [6]                                      [7]
                  [12] [13]                                [14] [15]
              [-] [-] [-] [-]                            [-] [-] [-] [-]   
       [-] [-] [-] [-] [-] [-] [-] [-]         [-] [-] [-] [-]  [-] [-] [-] [-]



Ну и так деление пирамид и добавление ячеек до бесконечности. 


Я долго думал как это реализовать и вот появилась идея:

 1) База данных, где записи о каждой  существующей ячейке. 
 2) сами пирамиды представлены в виде массива 



К примеру мы составим массив 1 пирамиды 

Код

$data[0] = array(array('cell_id' => 1,'user_id' => 23));

$data[1] = array(
                 '0' => array('cell_id' => 2,'user_id' => 43),
                 '1' => array('cell_id' => 3,'user_id' => 233)
                );
                
$data[2] = array(
                 '0' => array('cell_id' => 4,'user_id' => 32),
                 '1' => array('cell_id' => 5,'user_id' => 343),
                 '2' => array('cell_id' => 6,'user_id' => 24),
                 '3' => array('cell_id' => 7,'user_id' => 543)
                );
                
$data[3] = array(
                 '0' => array('cell_id' => 8,'user_id' => 0),
                 '1' => array('cell_id' => 9,'user_id' => 0),
                 '2' => array('cell_id' => 10,'user_id' => 0),
                 '3' => array('cell_id' => 11,'user_id' => 0),
                 '4' => array('cell_id' => 12,'user_id' => 0),
                 '5' => array('cell_id' => 13,'user_id' => 0),
                 '6' => array('cell_id' => 14,'user_id' => 0),
                 '7' => array('cell_id' => 15,'user_id' => 0)
                );




Вид он получит такой: 

Код

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [cell_id] => 1
                    [user_id] => 23
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [cell_id] => 2
                    [user_id] => 43
                )

            [1] => Array
                (
                    [cell_id] => 3
                    [user_id] => 233
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [cell_id] => 4
                    [user_id] => 32
                )

            [1] => Array
                (
                    [cell_id] => 5
                    [user_id] => 343
                )

            [2] => Array
                (
                    [cell_id] => 6
                    [user_id] => 24
                )

            [3] => Array
                (
                    [cell_id] => 7
                    [user_id] => 543
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [cell_id] => 8
                    [user_id] => 0
                )

            [1] => Array
                (
                    [cell_id] => 9
                    [user_id] => 0
                )

            [2] => Array
                (
                    [cell_id] => 10
                    [user_id] => 0
                )

            [3] => Array
                (
                    [cell_id] => 11
                    [user_id] => 0
                )

            [4] => Array
                (
                    [cell_id] => 12
                    [user_id] => 0
                )

            [5] => Array
                (
                    [cell_id] => 13
                    [user_id] => 0
                )

            [6] => Array
                (
                    [cell_id] => 14
                    [user_id] => 0
                )

            [7] => Array
                (
                    [cell_id] => 15
                    [user_id] => 0
                )

        )

)





[cell_id]   => id ячейки пирамиды в базе 
[user_id] => id пользователя, который состоит в данной ячейке, если 0, то она пустая. 



К примеру делим пирамиду на две 


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

Код

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [cell_id] => 1
                    [user_id] => 23
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [cell_id] => 2
                    [user_id] => 43
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [cell_id] => 4
                    [user_id] => 32
                )

            [1] => Array
                (
                    [cell_id] => 5
                    [user_id] => 343
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [cell_id] => 8
                    [user_id] => 11
                )

            [1] => Array
                (
                    [cell_id] => 9
                    [user_id] => 12
                )

            [2] => Array
                (
                    [cell_id] => 10
                    [user_id] => 13
                )

            [3] => Array
                (
                    [cell_id] => 11
                    [user_id] => 14
                )

        )

    [4] => Array
        (
            [0] => Array
                (
                    [cell_id] => 8
                    [user_id] => 0
                )

            [1] => Array
                (
                    [cell_id] => 9
                    [user_id] => 0
                )

            [2] => Array
                (
                    [cell_id] => 10
                    [user_id] => 0
                )

            [3] => Array
                (
                    [cell_id] => 11
                    [user_id] => 0
                )

            [4] => Array
                (
                    [cell_id] => 12
                    [user_id] => 0
                )

            [5] => Array
                (
                    [cell_id] => 13
                    [user_id] => 0
                )

            [6] => Array
                (
                    [cell_id] => 14
                    [user_id] => 0
                )

            [7] => Array
                (
                    [cell_id] => 15
                    [user_id] => 0
                )

        )

)




Подскажите пожалуйста, в правильном ли направлении идут мысли и как можно будет осуществить подобное деление пирамиды из массива. 
PM MAIL   Вверх
Чучмек
Дата 1.8.2012, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



А если не секрет, зачем такое надо?


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


Опытный
**


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

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



вероятнее всего строят финансовую пирамиду.  Мне предложили разработать для них вот такую систему. Но прежде чем браться за работу, я решил подумать действительно ли я смогу сделать подобное. Вот и собственно написал свои идеи по реализации. 

Вообще для чего и зачем меня мало волнует, мне нравится разрабатывать какие-то сложные вещи, а с таким я не сталкивался, даже интерес возник.  
PM MAIL   Вверх
Sanchezzz
Дата 1.8.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



скорее всего это не фин пирамида, так как если основываясь на принципах пирамиды то один человек может привести в систему от одного человека до 5-10 как тогда должна выглядить пирамида в виде лесинки
Код

                         [3]
                      [6] [7]
                [12] [13] [14] [15]
          [-] [-] [-] [-]  [-] [-] [-] [-]   




--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
baldina
Дата 1.8.2012, 19:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


Опытный
**


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

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



Цитата

какие операции с этими пирамидами предусматриваются ? 


на столько детально я не знаю. Но суть такая, что как только в пирамиде заполняются последние 8 ячеек, то она делится на 2 и к каждой добавляются еще по 8 ячеек. 


тоесть вот к примеру идет 1 пирамида 


Код

                              [1]
                          [2]    [3]
                      [4] [5]    [6] [7]
            [8] [9] [10] [11]    [12] [13] [14] [15]



хоп она разделилась на 2 

Код

                           [2]   
                        [4] [5]   
                   [8] [9]  [10] [11]   
          [-] [-] [-] [-]  [-] [-] [-] [-]   


               [3]
                      [6] [7]
                [12] [13] [14] [15]
          [-] [-] [-] [-]  [-] [-] [-] [-] 



а вот пользователь, который был в верху (тоесть юзер в ячейке 1, вообще исчезает из пирамиды). Скорее всего ему выплатили деньги и он вне игры. 



А вот как "валидно" разделить массив на 2, я еще не придумал.

Добавлено через 13 секунд
Но так понял, мыслю пока верно !? 
PM MAIL   Вверх
Fortop
Дата 2.8.2012, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nepster @  1.8.2012,  16:46 Найти цитируемый пост)
Ну и так деление пирамид и добавление ячеек до бесконечности.

Кто сказал что это деление пирамид?

Добавлено через 1 минуту
Куда исчезает ячейка №1 после вашего "деления"?
Куда исчезают ячейки №2 и №3 на втором цикле? Ну и т.д.


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


Опытный
**


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

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



к примеру есть юзер  Вася, он стоит в ячейке номер 1. 
Когда Вася пригласит всех людей и пирамида заполнится,  скорее всего он получит выплату или что то там получит и больше не является участником системы. Тоесть исчезает из пирамиды. А пирамида делится на 2 части. Где  юзеры Иванов и Петров с ячейками 2 и 3  стали вместо него.  И так же само, когда пирамиды заполнятся, то они выйдут из системы и пирамиды разделятся. 
PM MAIL   Вверх
baldina
Дата 2.8.2012, 02:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



используйте двоичное дерево. оно будет расти само как надо, просто добавляйте в конец. для удаления корней (и "деления") просто помечайте узлы, что они не активны. узлы, у которых родитеь удален (неактивен), будут являться вершинами ваших пирамид.

Добавлено через 8 минут и 3 секунды
если пирамиды заполняются равномерно, и дерево полное, все удаленные узлы будут находиться в начале массива. т.е. найти все пирамиды можно будет легко, найдя первый активный узел и посчитав по дороге на каком уровне начинаются активные: если первый активный узел имеет индекс $i, то мы имеем $n = 2*$i пирамиды, корни которых находятся в соседних ячейках. восстановить пирамиду можно пользуясь фактом, что дочерние узлы узла $k находятся в ячейках 2*$k и 2*$k+1, далее рекурсивно.

Добавлено через 10 минут и 46 секунд
Цитата(nepster @  1.8.2012,  23:12 Найти цитируемый пост)
 Скорее всего ему выплатили деньги и он вне игры. 

Скорее всего его где-то прикопали, и он вне игры. Деньги из пирамид не уходят)))
PM MAIL   Вверх
nepster
Дата 2.8.2012, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Скорее всего его где-то прикопали, и он вне игры. Деньги из пирамид не уходят)))


НУ это уже как говориться не мои проблемы =)



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

К примеру на верхушке пользователь Вася,  а пользователь иванов в 3 ячейке к примеру. 

Когда иванов заходит в свой профиль, он видит пирамиду Васи, так как Вася на верхушке.  А вот когда пирамида делится и Иванов становится на верхушке и скажем после 10 таких делений, будет уже за 20  пирамид, то каждый юзер должен попадать в свою пирамиду.  Вот тут я еще не придумал как для нужного юзера воспроизводить его пирамиду.  Вероятно каждая пирамидка должна бегать с массивов, где хранятся все ее ячейки !? 
PM MAIL   Вверх
MoLeX
Дата 2.8.2012, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



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

nepster, стукни в личку/асю - поговорим)

Это сообщение отредактировал(а) MoLeX - 2.8.2012, 06:39


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
baldina
Дата 2.8.2012, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MoLeX @  2.8.2012,  06:37 Найти цитируемый пост)
Там два дерево должно быть

второе зачем?
ТС не огласил задачу, ибо сам не знает. пока очевидно только, что пирамиды нужно идентифицировать.

Цитата(nepster @  2.8.2012,  02:22 Найти цитируемый пост)
Когда иванов заходит в свой профиль, он видит пирамиду Васи, так как Вася на верхушке.  А вот когда пирамида делится и Иванов становится на верхушке и скажем после 10 таких делений, будет уже за 20  пирамид, то каждый юзер должен попадать в свою пирамиду.  Вот тут я еще не придумал как для нужного юзера воспроизводить его пирамиду.  Вероятно каждая пирамидка должна бегать с массивов, где хранятся все ее ячейки !? 

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

while ($i>0 and is_active ($tree[$i])) {
  $rem = $i%2;
  $i = (int)($i/2);
}
$my_root=2*$i+$rem;


Это сообщение отредактировал(а) baldina - 2.8.2012, 09:03
PM MAIL   Вверх
MoLeX
Дата 2.8.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Все придумано уже давно, не лепите огород. Берем обычное Nested Sets дерево, немного модернизируем его и все


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
baldina
Дата 2.8.2012, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



давно придумано много чего. например, стрелять из пушки по воробьям
PM MAIL   Вверх
Fortop
Дата 2.8.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Солидарен с baldina.
И вообще не понимаю, как можно вразумительно сделать задачу не понимая ее условий.
Хорошо если задачу вам ставил тим-лид, который знает что нужно...
А если это был клиент?

Добавлено через 2 минуты и 15 секунд
Цитата(nepster @  2.8.2012,  01:33 Найти цитируемый пост)
Тоесть исчезает из пирамиды. А пирамида делится на 2 части.

Ничего никуда не исчезает и ничего не делится.
Другой вопрос, что статусы могут меняться. И таки, как и писал выше baldina, бинарное дерево полностью подходит под эти намеки.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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