Вітання! Сьогоднішня лекція трохи відрізнятиметься від інших. Відрізнятися вона буде тим, що має непряме відношення до Java. Тим не менш, ця тема є дуже важливою для кожного програміста. Ми поговоримо про алгоритми . Що таке алгоритм? Говорячи простою мовою, це деяка послідовність дій, які необхідно зробити для досягнення потрібного результату . Ми часто використовуємо алгоритми у повсякденному житті. Наприклад, щоранку перед тобою стоїть завдання: прийти на навчання чи роботу, і бути при цьому:
- Одягненим
- Чистим
- Ситим
- Прокинутися будильником.
- Прийняти душ, вмитися.
- Приготувати сніданок, зварити каву/заварити чай.
- Поїсти.
- Якщо не погладив одяг із вечора — погладити.
- Одягтися.
- Вийти з будинку.
- Купити або завантажити в Інтернеті "Словник російських особистих імен" 1966 видання.
- Знаходити кожне ім'я з нашого списку у цьому словнику.
- Записувати на папірець, на якій сторінці словника є ім'я.
- Розставити імена по порядку, використовуючи записи на папірці.
for
, який виконує це завдання
int[] numbers = new int[100];
// ..заполняем массив числами
for (int i: numbers) {
System.out.println(i);
}
Яка складність написаного алгоритму? Лінійна, O(N). Число дій, які має зробити програма, залежить від того, скільки саме чисел у неї передали. Якщо в масиві буде 100 чисел, дій (висновків на екран) буде 100. Якщо чисел у масиві буде 10000, потрібно буде здійснити 10000 дій. Чи можна покращити наш алгоритм? Ні. Нам у будь-якому випадку доведеться здійснити N проходів масивом і виконати N висновків в консоль. Розглянемо інший приклад.
public static void main(String[] args) {
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(0, 20202);
numbers.add(0, 123);
numbers.add(0, 8283);
}
У нас є порожній LinkedList
, в який ми вставляємо кілька чисел. Нам потрібно оцінити складність алгоритму вставки одного числа у LinkedList
нашому прикладі, і як вона залежить від числа елементів, що знаходяться в списку. Відповіддю буде O(1) — постійна складність . Чому? Зверніть увагу: щоразу ми вставляємо число на початок списку. До того ж, як ти пам'ятаєш, при вставці числа в LinkedList
елементи нікуди не зрушуються - відбувається перевизначення посилань (якщо раптом забув, як працює LinkedList, зазирни в одну з наших старих лекцій ). Якщо зараз перше число в нашому списку - число х
, а ми вставляємо на початок списку число y, все, що для цього потрібно:
x.previous = y;
y.previous = null;
y.next = x;
Для цього перевизначення посилань нам неважливо, скільки чисел зараз уLinkedList
хоч одне, хоч мільярд. Складність алгоритму буде постійною – O(1).
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ