Добавлены уточнения названия времён и добавлен пример бинарного поиска.
This commit is contained in:
parent
415da099dd
commit
182827bfc2
75
jcf.md
75
jcf.md
|
@ -253,18 +253,18 @@ FILO, First-In-Last-Out («первым пришел, последним уше
|
|||
|
||||
`ArrayList`:
|
||||
|
||||
+ доступ к произвольному элементу по индексу за время _O(1)_;
|
||||
+ доступ к элементам по значению за линейное время _O(N)_;
|
||||
+ вставка в конец в среднем производится за время _O(1)_;
|
||||
+ доступ к произвольному элементу по индексу за _константное_ время _O(1)_;
|
||||
+ доступ к элементам по значению за _линейное_ время _O(N)_;
|
||||
+ вставка в конец в среднем производится за _константное_ время _O(1)_;
|
||||
+ удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется);
|
||||
+ вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо;
|
||||
+ минимум накладных расходов при хранении.
|
||||
|
||||
`LinkedList`:
|
||||
|
||||
+ на получение элемента по индексу или значению потребуется линейное время _O(N)_;
|
||||
+ на добавление и удаление в начало или конец списка потребуется _O(1)_;
|
||||
+ вставка или удаление в/из произвольного место _O(N)_;
|
||||
+ на получение элемента по индексу или значению потребуется _линейное_ время _O(N)_;
|
||||
+ на добавление и удаление в начало или конец списка потребуется _константное_ _O(1)_;
|
||||
+ вставка или удаление в/из произвольного место _константное_ _O(N)_;
|
||||
+ требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка.
|
||||
|
||||
В целом, `LinkedList` в абсолютных величинах проигрывает `ArrayList` и по потребляемой памяти и по скорости выполнения операций. `LinkedList` предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
|
||||
|
@ -608,7 +608,66 @@ PhantomReference при вызове метода `get()` возвращает
|
|||
## Какова оценка временной сложности операций над элементами из `HashMap`? Гарантирует ли `HashMap` указанную сложность выборки элемента?
|
||||
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
|
||||
|
||||
Данная сложность не гарантируется, т.к. если хэш-функция распределяет элементы по корзинам равномерно, временная сложность станет не хуже _O(lg(N))_, а в случае, когда хэш-функция постоянно возвращает одно и то же значение `HashMap` превратится в связный список со сложностью О(n) .
|
||||
Данная сложность не гарантируется, т.к. если хэш-функция распределяет элементы по корзинам равномерно, временная сложность станет не хуже _Логарифмическое время_ _O(log(N))_, а в случае, когда хэш-функция постоянно возвращает одно и то же значение `HashMap` превратится в связный список со сложностью О(n) . Говорят, что алгоритм выполняется за логарифмическое время, если T(n)=O(log n). Поскольку в компьютерах принята двоичная система счисления, в качестве основания логарифма используется 2 (то есть log2n). Однако при замене основания логарифма logan и logbn отличаются лишь на постоянный множитель logba, который в записи O-большое отбрасывается. Таким образом, O(log n) является стандартной записью для алгоритмов логарифмического времени независимо от основания логарифма.
|
||||
|
||||
Пример кода двоичного поиска:
|
||||
```java
|
||||
package test2;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Q {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
Q q = new Q();
|
||||
q.binSearch();
|
||||
|
||||
}
|
||||
|
||||
private void binSearch() {
|
||||
|
||||
int inpArr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
|
||||
Integer result = binSearchF(inpArr, 1, 0, inpArr.length - 1);
|
||||
System.out.println("-----------------------");
|
||||
result = binSearchF(inpArr, 2, 0, inpArr.length - 1);
|
||||
|
||||
System.out.println("Found at position " + result);
|
||||
|
||||
}
|
||||
|
||||
private Integer binSearchF(int inpArr[], int searchValue, int low, int high) {
|
||||
|
||||
Integer index = null;
|
||||
while (low <= high) {
|
||||
System.out.println("New iteration, low = " + low + ", high = " + high);
|
||||
|
||||
int mid = (low + high) / 2;
|
||||
System.out.println("trying mid = " + mid + " inpArr[mid] = " + inpArr[mid]);
|
||||
|
||||
if (inpArr[mid] < searchValue) {
|
||||
low = mid + 1;
|
||||
System.out.println("inpArr[mid] (" + inpArr[mid] + ") < searchValue(" + searchValue + "), mid = " + mid
|
||||
+ ", setting low = " + low);
|
||||
} else if (inpArr[mid] > searchValue) {
|
||||
high = mid - 1;
|
||||
System.out.println("inpArr[mid] (" + inpArr[mid] + ") > searchValue(" + searchValue + "), mid = " + mid
|
||||
+ ", setting high = " + high);
|
||||
} else if (inpArr[mid] == searchValue) {
|
||||
index = mid;
|
||||
System.out.println("found at index " + mid);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
[к оглавлению](#java-collections-framework)
|
||||
|
||||
|
@ -684,7 +743,7 @@ __Один__ новый объект статического вложенног
|
|||
[к оглавлению](#java-collections-framework)
|
||||
|
||||
## В чем отличия `TreeSet` и `HashSet`?
|
||||
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(lg(N))_.
|
||||
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(log(N))_ (_Логарифмическое время_).
|
||||
|
||||
`HashSet` использует для хранения элементов такой же подход, что и `HashMap`, за тем отличием, что в `HashSet` в качестве ключа и значения выступает сам `элемент`, кроме того `HashSet` не поддерживает упорядоченное хранение элементов и обеспечивает временную сложность выполнения операций аналогично `HashMap`.
|
||||
|
||||
|
|
Loading…
Reference in New Issue