Skip to content

Commit 979484b

Browse files
Pavel Lyubinskiyenhorse
authored andcommitted
boost ArrayList remove range
1 parent 9f70a99 commit 979484b

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

jcf.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ _O(N)_. Вставка элемента в конец списка осущес
312312
[к оглавлению](#java-collections-framework)
313313

314314
## Предложите эффективный алгоритм удаления нескольких рядом стоящих элементов из середины списка, реализуемого `ArrayList`.
315-
Допустим нужно удалить `n` элементов с позиции `m` в списке. Вместо выполнения удаления одного элемента `n` раз (каждый раз смещая на 1 позицию элементы, стоящие «правее» в списке), нужно выполнить смещение всех элементов, стоящих «правее» `n + m` позиции на `n` элементов «левее» к началу списка. Таким образом, вместо выполнения `n` итераций перемещения элементов списка, все выполняется за 1 проход.
315+
Допустим нужно удалить `n` элементов с позиции `m` в списке. Вместо выполнения удаления одного элемента `n` раз (каждый раз смещая на 1 позицию элементы, стоящие «правее» в списке), нужно выполнить смещение всех элементов, стоящих «правее» `n + m` позиции на `n` элементов «левее» к началу списка. Таким образом, вместо выполнения `n` итераций перемещения элементов списка, все выполняется за 1 проход. Но если говорить об общей эффективности - то самый быстрый способ будет с использованием `System.arraycopy()`, и получить к нему доступ можно через метод - `subList(int fromIndex, int toIndex)`
316316

317317
Пример:
318318

@@ -369,6 +369,15 @@ public class Main {
369369
finish = System.currentTimeMillis() - start;
370370
System.out.println("Время удаления путём смещения: " + finish);
371371
System.out.println("Размер копии списка:" + copyList.size());
372+
373+
System.out.println("\nВыполняем удаление через SubList...\n");
374+
start = System.currentTimeMillis();
375+
376+
initList.subList(m - 1, m + n).clear();
377+
378+
finish = System.currentTimeMillis() - start;
379+
System.out.println("Время удаления через саблист: " + finish);
380+
System.out.println("Размер копии списка:" + copyList.size());
372381
}
373382

374383
private static void removeEfficiently(){
@@ -413,12 +422,17 @@ run:
413422
Сколько удаляем? > 20000
414423
415424
Выполняем удаление вызовом remove()...
416-
Время удаления с помощью вызова remove(): 22359
425+
Время удаления с помощью вызова remove(): 928
417426
Размер исходного списка после удаления: 980000
418427
419428
Выполняем удаление путем перезаписи...
420429
421-
Время удаления путём смещения: 62
430+
Время удаления путём смещения: 17
431+
Размер копии списка:980000
432+
433+
Выполняем удаление через SubList...
434+
435+
Время удаления через саблист: 1
422436
Размер копии списка:980000
423437
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 33 секунды)
424438
```

0 commit comments

Comments
 (0)