Другие языки программирования и технологии

Как будет лучше?

Сначала добавлять элементы в массив в конец и потом развернуть его reverse или просто сразу добавлять элементы в начало?
Если у тебя именно массив (непрерывный диапазон памяти, в котором по последовательным адресам хранятся элементы или ссылки на них), то нужно избегать добавления в середину или в начало (и удаления, соответственно).

N добавлений в начало, начиная с пустого массива:
 1 запись + 0 элементов сдвинуто
1 запись + 1 элемент сдвинут
1 запись + 2 элемента сдвинуто
1 запись + 3 элемента сдвинуто
...
1 запись + N-1 элементов сдвинуто
Итого: 1 + ... + N = N * (N + 1) / 2 операций

N добавлений в конец и переворот массива:
 1 запись
1 запись
1 запись
...
1 запись + расширение массива (перенос k1 записей в новый массив)
1 запись
1 запись
...
1 запись + расширение массива (перенос k2 записей в новый массив)
1 запись
1 запись
...
В языках вроде Java, C++ можно сразу выделить место под N элементов, и тогда переносов не будет. Это -
 N операций 
(и переворот - ещё N операций)
В языках вроде Python лучше сразу создать список нужной длины [0] * N и менять в /нём элементы, но за это придётся заплатить лишними N операциями на инициализацию массива, так что всего получится 3N.

Если заранее место не резервировать, то получим в точках ki расширения с переносом элементов, количество которых зависит от политики расширения массива. Один из самых худших вариантов - линейное расширение (на одно и то же количество элементов k). Оно даст примерно N/k расширений, с перемещением в среднем N/2 элементов.
 N / k * N / 2 = N * N / (2 * k)
Всего: N * N / (2 * k) + 2N операций
Видим тут то же квадратичное количество операций, только с меньшей константой, чем при добавлении в начало массива.
Если политика расширения экспоненциальная, например, всегда - в два раза, то получим линейное количество операций. Расширений будет log2(N/k) (для простоты представим, что это - целое число), и перенесено будет
 (1 + 2 + 4 + ... + N/2) = N - 1
Всего: 3N - 1 операций
Т.е. тут будет линейное количество операций. Чем больше коэффициент расширения массива, тем меньше константный множитель.

И ещё вариант - можно сразу создать массив нужной длины и писать в него с конца. Это гарантирует
 в Питоне, Java: 2N операций
в C, C++: N операций
(второй N появляется, если язык обязывает инициализировать весь массив)
МГ
Максим Галицкий
54 053
Лучший ответ
В зависимости от того, какой язык программирования вы используете, один из этих способов может быть более эффективным. Например, в Python добавление элементов в начало списка с помощью метода insert может быть медленнее, чем добавление элементов в конец списка с помощью метода append, а затем использование метода reverse для разворота списка. Однако в других языках программирования, таких как C++ или Java, добавление элементов в начало массива может быть более эффективным, если вы используете соответствующие структуры данных, такие как deque или LinkedList.
Demi God
Demi God
25 860
сразу добавлять элементы в начало
В середину
Д*
Дмитрий ******
1 327
Почитай о стеках в программировании.
в конец
в начало
а зачем понадобилось добавлять элементы в начало?
Delavar Delavaras
Delavar Delavaras
139

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