Временная сложность pop с аргументом в python? [Дубликат]

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

                    |
               ---------->
              HTTP request
                    |
+--------------+    |    +--------------+
|              |    |    |              |
|    browser   |    |    |  web  server |
| (JavaScript) |    |    |  (PHP etc.)  |
|              |    |    |              |
+--------------+    |    +--------------+
                    |
  client side       |      server side
                    |
               <----------
          HTML, CSS, JavaScript
                    |

Обе стороны общаются через HTTP-запросы и ответы. PHP выполняется на сервере и выводит код HTML и, возможно, JavaScript, который отправляется как ответ клиенту, где интерпретируется HTML, и выполняется JavaScript. Когда PHP завершит вывод ответа, сценарий закончится, и на сервере ничего не произойдет, пока не появится новый HTTP-запрос.

Пример кода выполняется следующим образом:


Шаг 1, PHP выполняет весь код между тегами . В результате получилось следующее:


Вызов file_put_contents не привел ни к чему, он просто написал «+ foo +» в файл. Вызов привел к выводу «42», который теперь находится в том месте, где этот код использовался.

Этот итоговый код HTML / JavaScript теперь отправляется клиенту, где он получает оценку , Вызов alert работает, а переменная foo нигде не используется.

Весь PHP-код выполняется на сервере до того, как клиент даже начнет выполнение какого-либо JavaScript. В ответе JavaScript, с которым может взаимодействовать JavaScript, нет кода PHP.

Чтобы вызвать некоторый код PHP, клиент должен будет отправить новый HTTP-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:

  1. Ссылка, которая заставляет браузер загружать новую страницу.
  2. Подача формы, которая передает данные на сервер и загружает новую страницу.
  3. Запрос AJAX , который является техникой Javascript, чтобы сделать обычный HTTP-запрос на сервер (например, 1. и 2. будет), но без оставляя текущую страницу.

Вот более подробный изложение этого метода

Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location или отправить форму, подражая возможностям 1 и 2.

29
задан Haldun 11 February 2009 в 02:52
поделиться

4 ответа

Pop() для последнего элемента должен быть O (1), так как вам нужно вернуть элемент, на который ссылается последний элемент в массиве, и обновить индекс последнего элемента. Я ожидал бы, что pop() для произвольного элемента будет O (N) и потребует в среднем N / 2 операций, так как вам нужно будет перемещать любые элементы за пределами элемента, который вы удаляете по одной позиции в массиве указателей.

22
ответ дан tvanfosson 27 August 2018 в 23:09
поделиться
  • 1
    Я согласен с ответом, но объяснение неверно. Вы можете удалить любой объект из списка в момент O (1) (по существу, сделать предыдущую точку указателя следующей и удалить это). Проблема заключается в том, что для того, чтобы НАЙТИ объект в этой позиции, вам нужно пройти список до этого point (занимает время O (N), не требуется никакого усреднения.) Наконец, примечание специального случая :, pop (0) примет O (1), а не O (0). – ntg 11 December 2017 в 11:07
  • 2
    @ntg список - это массив указателей. чтобы удалить указатель из массива посередине, все указатели, следующие за ним, должны быть перемещены в массиве с количеством времени, пропорциональным размеру списка (который мы обозначим как N), таким образом, это O (N) , Чтобы прояснить N в нотации Big-O, это НЕ индекс возвращаемого элемента, а функция, ограничивающая время работы алгоритма с O (1) постоянным временем, то есть оно не зависит от размера список. O (N) означает, что ограничивающая функция является некоторой константой, умноженной на размер списка, f (n) = c * n + b. – tvanfosson 11 December 2017 в 17:38
  • 3
    Я стою исправлено :) Действительно, реализация списка представляет собой массив указателей. Так что ваш ответ правильный. По pop (N) в вашем ответе вы имеете в виду pop (k), N где k - позиция элемента для удаления, а размер указанного массива равен N. Тогда k может варьироваться от 0 до N-1, таким образом, на среднее значение N / 2 для перемещения элементов k + 1, ...., N-1 на одну позицию назад. – ntg 12 December 2017 в 10:12
  • 4
    @ntg pop (0) - O (N), а не O (1) – Bill Yang 30 July 2018 в 15:59
  • 5
    @BillYang Appologies, как сказано, я исправляю. Я думал о реализации классического связанного списка (например, en.wikipedia.org/wiki/Linked_list ). Однако список python в основном представляет собой массив указателей ... – ntg 14 August 2018 в 13:37

Да, это O (1), чтобы поместить элемент last в список Python и O (N), чтобы поместить произвольный элемент (так как весь остаток список должен быть сдвинут).

Вот отличная статья о том, как хранятся и обрабатываются списки Python: http://effbot.org/zone/python-list.htm ]

31
ответ дан Dan Lenski 27 August 2018 в 23:09
поделиться

Ниже приведен короткий ответ: https://wiki.python.org/moin/TimeComplexity

Без аргументов, чтобы поп его O (1)

С аргументом pop:

  • Среднее время Сложность O (k) (k представляет число, переданное в качестве аргумента для pop
  • Амортизированное наихудшее временное время сложность O (k)
  • Худшая временная сложность O (n)

Средняя временная сложность:

  • Каждый раз, когда вы вводите значение временной сложности этой операции - O (n - k).
  • Например, если у вас есть список из 9 элементов, кроме удаления из конца списка, это 9 операций и удаление с самого начала из списка - 1 операция (удаление 0-го индекса и перемещение всех остальных элементов в их текущий индекс - 1)
  • Так как n - k для среднего элемента списка - это k операций, среднее может быть сокращено к O (k).
  • Другой способ подумать об этом заключается в том, что представьте, что каждый индекс был удален из вашего списка из 9 элементов один раз. f 45 операций. (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45)
  • 45 равно O (nk), и поскольку поп-операция произошла O (n) раз, вы делите nk по n, чтобы получить O (k)

Амортизированная худшая временная сложность случая

  • Представьте, что у вас есть список из 9 пунктов снова. Представьте, что вы удаляете каждый элемент списка, и возникает наихудший случай, и вы каждый раз удаляете первый элемент списка.
  • Поскольку список уменьшается на 1 каждый раз, когда количество операций уменьшается каждый раз от 9 до 1.
  • 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45. 45 равно O (nk). Поскольку вы сделали 9 операций, а 9 - O (n), чтобы рассчитать амортизированный сценарий наихудшего случая, вы выполняете O (nk) / O (n), который равен O (k)
  • . Указывая, что это O (n) для средняя и амортизированная худшая временная сложность также является правильной. Отметим, что O (k) приблизительно равно O (1 / 2n), а падение константы равно O (n)

Худшая временная сложность случая

  • В отличие от амортизированная наихудшая временная сложность, вы не учитываете состояние структуры данных и не задумываетесь о наихудшем случае для любой отдельной операции.
  • В этом случае в худшем случае вам нужно удалить 1-й элемент из списка, который является O (n).

Вот что я подумать об этом, если это поможет:

2
ответ дан MattGoldwater 27 August 2018 в 23:09
поделиться

Это должно быть O (1) с L.pop (-1), а O (n) с L.pop (0)

см. следующий пример:

from timeit import timeit
if __name__ == "__main__":
    L = range(100000)
    print timeit("L.pop(0)",  setup="from __main__ import L", number=10000)
    L = range(100000)
    print timeit("L.pop(-1)", setup="from __main__ import L", number=10000)

>>> 0.291752411828
>>> 0.00161794329896
0
ответ дан Pythoner 27 August 2018 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: