Skip to the content.

Технологии программирования

Назад к списку лекций

Оценка сложности алгоритма, ssh-ключи, git, тестирование.

Оценка сложности алгоритма

Виды оценок

Можно выделить по сути 2 основных “вида” оценок алгоритма:

Временная сложность алгоритма

Примеры

public class Test {
    // Если количество шагов не зависит от входных данных -> скорее всего это O(1)
    public int foo1(int a, int b) { // f(n) = 1 --> O(const * 1) -> O(1)
        int c = a + b; // 1 шаг, его время const == 1
        return c;
    }

    public int foo2(int a, int b) { // O(2 * 1) ? O(const * 1) -> O(1)
      int c = a + b;      // 1 шаг, его время const == 1
      int result = c * c; // 1 шаг
      return c;
    }
  
    // Если у нас есть цикл по входным (но без вложенного цикла) -> скорее всего это O(n) // линейная сложность
    public int foo3(int n) { //    O(n), f(n) = n
      int sum = 0;
      
      for (int i = 0; i < n; i++) {
        sum += 1;                  // 1 шаг * n раз
      }
      
      return sum;
    }
    
    // Если у нас есть вложенный цикл по входным данным, скорее всего это O(n^2) // квадратичная сложность
    public int foo4(int n) {  //  f(n) = n * n  -> O(n^2)
      int sum = 0;

      for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
          sum += 1;                // 1 шаг * n * n раз
        }
      }
    }
    
    // Еще бывает логарифмическая сложность O(logn); Сортировка слиянием ?
    // O(nlogn)
}

Полезные ссылки

Сложность алгоритмов. Big O. Основы.

Оценка сложности алгоритмов, или Что такое О(log n)

Оценка сложности алгоритмов

Для знатоков математического анализа:

Алгоритмическая сложность

О большое и о малое


SSH ключи для подключения к серверу

Что такое ssh-ключ?

SSH-ключ — безопасный способ соединения с сервером.

Для аутентификации используются два ключа: приватный и публичный.

Публичный ключ хранится на сервере в корневом каталоге, а приватный ключ остаётся на локальном компьютере в зашифрованном виде.

Каждый раз, когда вы обращаетесь к серверу, происходит сопоставление ключей. Поэтому для аутентификации не нужен пароль.

Windows

Полезные ссылки

github ssh manual

Reg Ru. Инструкция как создать ssh-ключ


Git

Что такое гит?

Система контроля версий.

Используется для работы в команде, для разрешения конфликтов (в коде), для версионирования кода (позволяет на какое-то время фиксировать версии программного кода)

Ветка мастер <- 10 разработчиков добавляют свои фичи 1 раз в неделю дежурный инженер хочет взять все новые фичи и выкатить их на пользователей (добавляет обновление в Google Play). Чтобы это сделать с точки зрения кода, мы должны зафиксировать его на какой-то “версии” (набор коммитов) -> отводим специальную ветку кода и называем version 2.20.3

Часто, когда работают много программистов вместе, могут возникать конфликты в коде

Программист John на своем компьютере:

public class A {
  public static void main(String[] args) {
    System.out.println("hello world!");
  }
}

Программист Петя на своем компьютере:

public class A {
  public static void main(String[] args) {
    System.out.println("привет мир!");
  }
}

John сохранил файлик с кодом одновременно с Петей (с разницей в 3 секунды) Когда возникают такие ситуации, нам помогает git.

Основные вещи которые надо знать:

Создать репозиторий: git init

Изменения в коде в репозитории “находятся” в commit-ах (фиксация). Коммит хранит следующее:

Чтобы создать коммит:

Ветви

Существует возможность переносить изменения из одной ветки в другую. Merge - объединение (есть еще rebase) git merge –into-name имя ветки

Возможность работать с удаленным репозиториями (которые на сервере). manage remotes (в идее).

git push (ctrl shift k) - мы отправляем в удаленный репозиторий наши локальные коммиты


Тестирование

Виды тестирования

Что проверять в тестах

Что НЕ проверять в тестах

Другие виды тестирования

Unit тестирование

Что такое unit тест в прикладном смысле?

Программа или функция, которая тестирует какой-то один тест-кейс

Как устроены наши тесты?

Они написаны на groovy. Используется фреймворк spock

Пример теста на groovy

import spock.lang.Specification

class TestSpec extends Specification { 
  
  def "test sum should return false"() {
    /*
    // 1 шаг заводим какие-то данные которые нам нужны
    // 2 шаг делаем действие, которое хотим проверить
    // 3 шаг проверяем результат
    **/
    given:
    def a = 1 // 1 шаг, здесь может быть создание нужных классов
    
    when:
    def sum = a + a // мы вызовем здесь какой-нибудь метод у созданного класса
    
    then:
    // сделать проверку
    // Assert.areEqual() - обычно что-то такое
    // в груви все чуть приятнее - мы можем просто написать boolean выражение
    // и спок будет ждать, что оно должно быть true
    sum == 2
  }
  
  def "test with where"() {
    when:
    def sum = a + b
    
    then:
    sum == sum1
    
    where:
    a  ||  b  ||  sum1
    1  ||  1  ||   2
    2  ||  3  ||   5
    10 ||  1  ||   11
  }
  
}

Материалы для самостоятельного изучения

Ссылка на лекцию в ШБР Яндекса 2022