Skip to content

Commit 182827b

Browse files
KhArtNJavaenhorse
authored andcommitted
Добавлены уточнения названия времён и добавлен пример бинарного поиска.
1 parent 415da09 commit 182827b

1 file changed

Lines changed: 67 additions & 8 deletions

File tree

jcf.md

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,18 +253,18 @@ FILO, First-In-Last-Out («первым пришел, последним уше
253253

254254
`ArrayList`:
255255

256-
+ доступ к произвольному элементу по индексу за время _O(1)_;
257-
+ доступ к элементам по значению за линейное время _O(N)_;
258-
+ вставка в конец в среднем производится за время _O(1)_;
256+
+ доступ к произвольному элементу по индексу за _константное_ время _O(1)_;
257+
+ доступ к элементам по значению за _линейное_ время _O(N)_;
258+
+ вставка в конец в среднем производится за _константное_ время _O(1)_;
259259
+ удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
260260
+ вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо;
261261
+ минимум накладных расходов при хранении.
262262

263263
`LinkedList`:
264264

265-
+ на получение элемента по индексу или значению потребуется линейное время _O(N)_;
266-
+ на добавление и удаление в начало или конец списка потребуется _O(1)_;
267-
+ вставка или удаление в/из произвольного место _O(N)_;
265+
+ на получение элемента по индексу или значению потребуется _линейное_ время _O(N)_;
266+
+ на добавление и удаление в начало или конец списка потребуется _константное_ _O(1)_;
267+
+ вставка или удаление в/из произвольного место _константное_ _O(N)_;
268268
+ требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
269269

270270
В целом, `LinkedList` в абсолютных величинах проигрывает `ArrayList` и по потребляемой памяти и по скорости выполнения операций. `LinkedList` предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
@@ -608,7 +608,66 @@ PhantomReference при вызове метода `get()` возвращает
608608
## Какова оценка временной сложности операций над элементами из `HashMap`? Гарантирует ли `HashMap` указанную сложность выборки элемента?
609609
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
610610

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+
package test2;
616+
617+
import java.util.HashMap;
618+
import java.util.IdentityHashMap;
619+
import java.util.Map;
620+
621+
public class Q {
622+
623+
public static void main(String[] args) {
624+
625+
Q q = new Q();
626+
q.binSearch();
627+
628+
}
629+
630+
private void binSearch() {
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);
637+
638+
System.out.println("Found at position " + result);
639+
640+
}
641+
642+
private Integer binSearchF(int inpArr[], int searchValue, int low, int high) {
643+
644+
Integer index = null;
645+
while (low <= high) {
646+
System.out.println("New iteration, low = " + low + ", high = " + high);
647+
648+
int mid = (low + high) / 2;
649+
System.out.println("trying mid = " + mid + " inpArr[mid] = " + inpArr[mid]);
650+
651+
if (inpArr[mid] < searchValue) {
652+
low = mid + 1;
653+
System.out.println("inpArr[mid] (" + inpArr[mid] + ") < searchValue(" + searchValue + "), mid = " + mid
654+
+ ", setting low = " + low);
655+
} else if (inpArr[mid] > searchValue) {
656+
high = mid - 1;
657+
System.out.println("inpArr[mid] (" + inpArr[mid] + ") > searchValue(" + searchValue + "), mid = " + mid
658+
+ ", setting high = " + high);
659+
} else if (inpArr[mid] == searchValue) {
660+
index = mid;
661+
System.out.println("found at index " + mid);
662+
break;
663+
}
664+
665+
}
666+
667+
return index;
668+
}
669+
}
670+
```
612671

613672
[к оглавлению](#java-collections-framework)
614673

@@ -684,7 +743,7 @@ __Один__ новый объект статического вложенног
684743
[к оглавлению](#java-collections-framework)
685744

686745
## В чем отличия `TreeSet` и `HashSet`?
687-
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(lg(N))_.
746+
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(log(N))_ (_Логарифмическое время_).
688747

689748
`HashSet` использует для хранения элементов такой же подход, что и `HashMap`, за тем отличием, что в `HashSet` в качестве ключа и значения выступает сам `элемент`, кроме того `HashSet` не поддерживает упорядоченное хранение элементов и обеспечивает временную сложность выполнения операций аналогично `HashMap`.
690749

0 commit comments

Comments
 (0)