За последние 24 часа нас посетили 19147 программистов и 1644 робота. Сейчас ищут 914 программистов ...

Нужен алгоритм вставки в массив

Тема в разделе "Прочие вопросы по PHP", создана пользователем Chushkin, 14 сен 2013.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    гораздо важнее, что с двойными кавычками по неосторожности можно накосячить. поэтому пишу двойные только там где они нужны.

    с замерами скорости PHP часто происходят парадоксальные вещи. видимо из-за природы самого интерпретатора. он чего-то там внутри сам пытается оптимизировать. поэтому случается большой разброс результатов в зависимости от контекста. наверное только разрабы самого PHP могут правильно толковать результаты тестов :)
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а я всегда двойные, потому что так удобнее. даже если переменных внутри нет =)
     
  3. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Академический. Тренировка для извилин. :)
    Функция простым перебором (см.выше) обрабатывает порядка 2 млн. записей в массиве в секунду.
    На практике вряд ли будет больше 100 записей в массиве, - это выполняется за 1/20000 сек, что вполне достаточно (по крайней мере пока достаточно).
    Хотя ... если есть более быстрый простой способ, то почему бы и не использовать.
     
  4. kosinus2012

    kosinus2012 Активный пользователь

    С нами с:
    16 июл 2012
    Сообщения:
    137
    Симпатии:
    0
    Я как-то в детстве коту к хвосту привязал нить с солдатиком, ради академического интереса.
    И что же я получил, а то что "производительность" кота выросла почти в двое!
    По факту я был рад, что смог увеличить скорость и реакцию кота на посторонний предмет, который после 10го круга слетел с хвоста, но с другой стороны модель "Барсик" побил купленную мебель, за которую меня чуть не кастрировали как "Барсика".

    После этого я для себя сделал вывод: "Лучше меньше да лучше", и второй вывод: "Привязывать нужно леской".
    Так и вашей ситуации, если массив будет использоваться один раз за всю жизнь, то придумывать для него быстрые алгоритмы не стоит потраченного времени, проще сэкономить свое время и сбегать за леской;-)
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Да нет, это боевая функция. Работает в реальном проекте, вызывается пару раз при каждой генерации страницы.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    может можно исхитриться и не вызывать ее как-то? =) чего она делает в общем плане?
     
  7. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Да можно конечно. Но не нужно. :)
    Создаёт список в нужном порядке, который где-то потом обрабатывается в этом созданном порядке. Создаёт, естественно, вставляя данные поштучно.

    п.с. По поводу "пару раз" я приуменьшил малость - где-то раз 5-6 вызывается (на сегодня).
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    на ум пришла идея делать стуктуру из данны и указателя на следующего члена. тогда при втыкании нового нужно просто добавить в конец, заменив указатель на n-1 месте так чтобы он указывал на только что добавленый, а у добавленного установить указатель на n позицию.
     
  9. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Можно и так (Fell-x27 о подобном варианте говорил). Но это уже будут навороты для PHP. Стандартный обход линейных списков в PHP это foreach(), вот для него и делается.
    Например, так...
    Код (Text):
    1. // Где-то в начале:
    2. ->array = array('yandex','bing')
    3. ...
    4. // Где-то потом
    5. ->array = ArrayInsert($array, 'google', 0) // будет 'yandex','google','bing'
    6. ...
    7. // Совсем потом
    8. foreach(->array as...) {
    9. }
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это будет рекурсивный пхп. Механизм работы массива пхп, воссозданный на языке пхп и на его массивах. :D Жесть, да?

    Добавлено спустя 29 секунд:
    Это как смарти - шаблонизатор на пхп. :D
    простите, я всё о своем.

    Добавлено спустя 46 секунд:
    а может кешить в мемкеше в сериализованном виде? может оно быстро будет?
     
  11. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Кеширование здесь вообще ни к чему.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я же не знаю, какие данные ты сортируешь.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Господа, зачем вы изобретаете двусвязные списки, если я привел ссылку на готовый встроенный пхпшный класс, реализующий все эти радости? О_о
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хз, по инерции
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Плохая привычка:)
     
  16. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Посмотрел я на это ... что-то не нашёл вставки в произвольное место - только в начало и конец.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Блин, ну ок, реально самому такой класс написать можно без проблем :) Со вставками куды угодно.
     
  18. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Можно конечно. Когда-нибудь. Когда будет задача, решение которой потребует такого. А к тому времени может разрабы ПХП доведут до ума уже сделанное, глядишь и велосипед изобретать не придётся. :)
     
  19. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Не пойму, мой вариант не замечен, или он не в тему?
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у тебя цикл. это не труЪ.
     
  21. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Замечен. Но проигнорирован. :)
    Во-первых, у Вас используется глобальная переменная (массив), что очень плохо. Во-вторых, там два цикла перебора, причём во втором вызов процедуры на каждой итерации. Вызов процедуры в ПХП довольно медленная операция (на моём Core i7 где-то 1 млн/сек).
     
  22. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Не плохо и не хорошо.
    Смотря что делать в этой функции. На моём Core 2 Duo E7400 (слабей i3)
    Код (Text):
    1. array_walk_recursive($a, function($item, $key){global $c;$c[]=$item;});
    миллион записей массива $a перебирается за 0.7 сек. Не знаю, куда уж быстрей.
     
  23. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    У тебя на столько большой объем данных для обработки?
     
  24. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Нет (выше я писал). Просто я придерживаюсь правила "Делай хорошо, а плохо само получится".
    Опять же, выше я писал, что простой перебор массива (см. ArrayInsert) обрабатывает миллионный массив (вставляет значение) за ~0.5 сек. У Вас же вдвое дольше будет (два цикла, как минимум), т.е. явно хуже - поэтому и "проигнорирован". :)
    Вот если бы поиметь алгоритм, который обрабатывает не за 0.5, а за 0.2-0.3 это было бы ценно. И не только "академически".
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да напишите уже свой двусвязный список и будет он работать по вставке в мгновение ока.