From 182827bfc2d9038b95997cb7430dd7837689a6c8 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 21 Feb 2020 16:52:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D1=91=D0=BD=20=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=20=D0=B1=D0=B8=D0=BD=D0=B0=D1=80=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jcf.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/jcf.md b/jcf.md index db0fe2d..bbc6727 100644 --- a/jcf.md +++ b/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`.