Slide 1

Slide 1 text

АЛГОРИТМЫ НА JAVA ЧАСТЬ 1 Орловский Виктор

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

«… хороший алгоритм позволяет значительно экономить ресурсы, вплоть до того, что становится возможным выполнять задачи, которые иначе были бы недоступны»

Slide 4

Slide 4 text

• Задача о нулевых парах • Оценка времени и памяти • Классические алгоритмы сортировки и поиска • Оптимальная реализация задачи о нулевых парах

Slide 5

Slide 5 text

ПРОСТАЯ ЗАДАЧА для начала

Slide 6

Slide 6 text

Поиск нулевых пар в массиве с различными элементами 1 20 34 4 -1 43 8 …

Slide 7

Slide 7 text

1 20 34 4 -1 43 8 … 1 20 34 4 -1 43 8 … 1 20 34 4 -1 43 8 … 1 20 34 4 -1 43 8 … …

Slide 8

Slide 8 text

1 20 34 4 -1 43 8 … …и так далее для всех n

Slide 9

Slide 9 text

public static int count(int a[]) {
 int n = a.length;
 int cnt = 0;
 for (int i = 0; i < n; i++) {
 for (int j = i + 1; j < n; j++) {
 if (a[i] + a[j] == 0) {
 cnt++;
 }
 }
 }
 return cnt;
 } Brute-forсe

Slide 10

Slide 10 text

ПРИ N = 10 000 000 ВРЕМЯ ВЫПОЛНЕНИЯ ~ 24 Ч Что делать?

Slide 11

Slide 11 text

• Задача о нулевых парах • Оценка времени и памяти • Классические алгоритмы сортировки и поиска • Правильная реализация задачи о нулевых парах

Slide 12

Slide 12 text

КАК И ЧТО ОЦЕНИВАТЬ? Сколько времени потребует программа? Почему программе не хватает памяти?

Slide 13

Slide 13 text

ОЦЕНКА ПАМЯТИ

Slide 14

Slide 14 text

Примитивные типы Объекты

Slide 15

Slide 15 text

int 232 ~ 4 байт аналогично для других

Slide 16

Slide 16 text

Integer ~ 24 байта 16 байт заголовка объекта 4 байта int 4 байта дополнительно

Slide 17

Slide 17 text

А МАССИВЫ? int[ ] в зависимости от N

Slide 18

Slide 18 text

int [ ] ~ 24 + 4N байтов 16 байт заголовка объекта 4 байта длина 4 байта дополнительно 4 * N элементов int

Slide 19

Slide 19 text

public static int count(int a[]) {
 int n = a.length;
 int cnt = 0;
 for (int i = 0; i < n; i++) {
 for (int j = i + 1; j < n; j++) {
 if (a[i] + a[j] == 0) {
 cnt++;
 }
 }
 }
 return cnt;
 } Brute-forсe

Slide 20

Slide 20 text

ОЦЕНКА ВРЕМЕНИ Научный подход Математические модели

Slide 21

Slide 21 text

НАУЧНЫЙ ПОДХОД Наблюдение Предложение Предсказание Проверка Обоснование

Slide 22

Slide 22 text

МАТЕМАТИЧЕСКИЕ МОДЕЛИ Стоимость выполнения каждого оператора Частота выполнения каждого оператора O(?)

Slide 23

Slide 23 text

ПОРЯДКИ РОСТА а какие вы знаете?

Slide 24

Slide 24 text

Линейный O(N) Постоянный O(1) Размер задачи Время Квадратичный O(N2) Логарифмический O(logN) Линейно-логарифмический O(NlogN)

Slide 25

Slide 25 text

для нашей задачи O(?)

Slide 26

Slide 26 text

public static int count(int a[]) {
 int n = a.length;
 int cnt = 0;
 for (int i = 0; i < n; i++) {
 for (int j = i + 1; j < n; j++) {
 if (a[i] + a[j] == 0) {
 cnt++;
 }
 }
 }
 return cnt;
 } Brute-forсe

Slide 27

Slide 27 text

1 20 34 4 -1 43 8 … … 1 20 34 4 -1 43 8 … N - 1 N - 2 1 1 20 34 … N-1 N

Slide 28

Slide 28 text

(N - 1) + (N - 2) + … + 1 = (N - 1)N / 2 O(N2)

Slide 29

Slide 29 text

• Задача о нулевых парах • Оценка времени и памяти • Классические алгоритмы сортировки и поиска • Оптимальная реализация задачи о нулевых парах

Slide 30

Slide 30 text

ЛИНЕЙНЫЙ ПОИСК или метод перебора

Slide 31

Slide 31 text

public static int count(int a[]) {
 int n = a.length;
 int cnt = 0;
 for (int i = 0; i < n; i++) {
 for (int j = i + 1; j < n; j++) {
 if (a[i] == - a[j]) {
 cnt++;
 }
 }
 }
 return cnt;
 } Brute-forсe

Slide 32

Slide 32 text

O(N)

Slide 33

Slide 33 text

БИНАРНЫЙ ПОИСК или двоичный поиск

Slide 34

Slide 34 text

public static int binarySearch(int[] mas, int x) {
 int low = 0;
 int high = mas.length - 1;
 int mid;
 
 while (low <= high) {
 mid = (low + high) / 2;
 if (mas[mid] < x) {
 low = mid + 1;
 } else if (mas[mid] > x) {
 high = mid - 1;
 } else {
 return mid;
 }
 }
 //элемент не нашли:
 return -1;
 }

Slide 35

Slide 35 text

N N/2 N/2i 1 … …

Slide 36

Slide 36 text

O(logN) применим только к сортированным массивам 1 = N/2n N = 2n

Slide 37

Slide 37 text

СОРТИРОВКИ

Slide 38

Slide 38 text

Устойчивые Неустойчивые Используют дополнительную память Не используют дополнительную память и другие…

Slide 39

Slide 39 text

МЕТОД ПУЗЫРЬКА старый добрый

Slide 40

Slide 40 text

public static int[] bubbleSort(int[] mas) {
 boolean isSorted = false;
 int n = mas.length;
 while (!isSorted) {
 isSorted = true;
 
 for (int i = 0; i < n - 1; i++) {
 if (mas[i] > mas[i + 1]) {
 isSorted = false;
 swap(mas, i, i + 1);
 }
 }
 n = n - 1;
 }
 return mas;
 }

Slide 41

Slide 41 text

линейный алгоритм сортировки O(N2)

Slide 42

Slide 42 text

БЫСТРАЯ СОРТИРОВКА простая реализация

Slide 43

Slide 43 text

public static void quickSort(int[] array, int left, int right) {
 if (left >= right) {
 return;
 }
 int index = partition(array, left, right);
 quickSort(array, left, index - 1);
 quickSort(array, index + 1, right);
 }
 
 private static int partition(int[] array, int left, int right) {
 // Левый и правый индексы просмотра
 int i = left, j = right + 1;
 // Опорный элемент
 int v = array[left];
 // Просмотр справа, просмотр слева, проверка на завершение и обмен
 while (true) {
 while (array[++i] < v) {
 if (i == right) {
 break;
 }
 }
 while (v < array[--j]) {
 if (j == left) {
 break;
 }
 }
 if (i >= j) {
 break;
 }
 swap(array, i, j);
 }
 swap(array, left, j);
 return j;
 }
 }

Slide 44

Slide 44 text

N N N logN

Slide 45

Slide 45 text

O(NlogN) в худшем случае O(N2)

Slide 46

Slide 46 text

• Задача о нулевых парах • Оценка времени и памяти • Классические алгоритмы сортировки и поиска • Оптимальная реализация задачи о нулевых парах

Slide 47

Slide 47 text

В РЕЗУЛЬТАТЕ

Slide 48

Slide 48 text

Сортировка Бинарный поиск &

Slide 49

Slide 49 text

public static int сount(int a[]) {
 int n = a.length;
 int cnt = 0;
 Arrays.sort(a);
 for (int i = 0; i < n; i++) {
 //> i для того, чтобы не считать дважды
 if (Arrays.binarySearch(a, -a[i]) > i) {
 cnt++;
 }
 }
 return cnt;
 }

Slide 50

Slide 50 text

O(NlogN)

Slide 51

Slide 51 text

Размер задачи Время Квадратичный O(N2) Линейно-логарифмический O(NlogN)

Slide 52

Slide 52 text

ПРОГРАММА ВЫПОЛНИТСЯ за приемлемое время

Slide 53

Slide 53 text

• Алгоритмы и структуры данных JDK: https://habrahabr.ru/post/182776/ • Сортировки в JAVA: http://www.javaspecialist.ru/2012/02/java.html • Введение в анализ сложности алгоритмов: https://habrahabr.ru/post/195996/