You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: jcf.md
+67-8Lines changed: 67 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -253,18 +253,18 @@ FILO, First-In-Last-Out («первым пришел, последним уше
253
253
254
254
`ArrayList`:
255
255
256
-
+ доступ к произвольному элементу по индексу за время _O(1)_;
257
-
+ доступ к элементам по значению за линейное время _O(N)_;
258
-
+ вставка в конец в среднем производится за время _O(1)_;
256
+
+ доступ к произвольному элементу по индексу за _константное_время _O(1)_;
257
+
+ доступ к элементам по значению за _линейное_ время _O(N)_;
258
+
+ вставка в конец в среднем производится за _константное_время _O(1)_;
259
259
+ удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
260
260
+ вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо;
261
261
+ минимум накладных расходов при хранении.
262
262
263
263
`LinkedList`:
264
264
265
-
+ на получение элемента по индексу или значению потребуется линейное время _O(N)_;
266
-
+ на добавление и удаление в начало или конец списка потребуется _O(1)_;
267
-
+ вставка или удаление в/из произвольного место _O(N)_;
265
+
+ на получение элемента по индексу или значению потребуется _линейное_ время _O(N)_;
266
+
+ на добавление и удаление в начало или конец списка потребуется _константное__O(1)_;
267
+
+ вставка или удаление в/из произвольного место _константное__O(N)_;
268
268
+ требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
269
269
270
270
В целом, `LinkedList` в абсолютных величинах проигрывает `ArrayList` и по потребляемой памяти и по скорости выполнения операций. `LinkedList` предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
@@ -608,7 +608,66 @@ PhantomReference при вызове метода `get()` возвращает
608
608
## Какова оценка временной сложности операций над элементами из `HashMap`? Гарантирует ли `HashMap` указанную сложность выборки элемента?
609
609
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
610
610
611
-
Данная сложность не гарантируется, т.к. если хэш-функция распределяет элементы по корзинам равномерно, временная сложность станет не хуже _O(lg(N))_, а в случае, когда хэш-функция постоянно возвращает одно и то же значение `HashMap` превратится в связный список со сложностью О(n) .
611
+
Данная сложность не гарантируется, т.к. если хэш-функция распределяет элементы по корзинам равномерно, временная сложность станет не хуже _Логарифмическое время_ _O(log(N))_, а в случае, когда хэш-функция постоянно возвращает одно и то же значение `HashMap` превратится в связный список со сложностью О(n) . Говорят, что алгоритм выполняется за логарифмическое время, если T(n)=O(log n). Поскольку в компьютерах принята двоичная система счисления, в качестве основания логарифма используется 2 (то есть log2n). Однако при замене основания логарифма logan и logbn отличаются лишь на постоянный множитель logba, который в записи O-большое отбрасывается. Таким образом, O(log n) является стандартной записью для алгоритмов логарифмического времени независимо от основания логарифма.
612
+
613
+
Пример кода двоичного поиска:
614
+
```java
615
+
packagetest2;
616
+
617
+
importjava.util.HashMap;
618
+
importjava.util.IdentityHashMap;
619
+
importjava.util.Map;
620
+
621
+
publicclassQ {
622
+
623
+
publicstaticvoidmain(String[] args) {
624
+
625
+
Q q =newQ();
626
+
q.binSearch();
627
+
628
+
}
629
+
630
+
privatevoidbinSearch() {
631
+
632
+
int inpArr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
633
+
634
+
Integer result = binSearchF(inpArr, 1, 0, inpArr.length -1);
635
+
System.out.println("-----------------------");
636
+
result = binSearchF(inpArr, 2, 0, inpArr.length -1);
@@ -684,7 +743,7 @@ __Один__ новый объект статического вложенног
684
743
[к оглавлению](#java-collections-framework)
685
744
686
745
## В чем отличия `TreeSet` и `HashSet`?
687
-
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(lg(N))_.
746
+
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(log(N))_ (_Логарифмическое время_).
688
747
689
748
`HashSet` использует для хранения элементов такой же подход, что и `HashMap`, за тем отличием, что в `HashSet` в качестве ключа и значения выступает сам `элемент`, кроме того `HashSet` не поддерживает упорядоченное хранение элементов и обеспечивает временную сложность выполнения операций аналогично `HashMap`.
0 commit comments