Що означає "O (1) час доступу"?


126

Я бачив цей термін "O (1) час доступу", який означав "швидко", але я не розумію, що це означає. Інший термін, який я бачу з ним у тому ж контексті, - це "O (n) час доступу". Чи не могли б хто-небудь пояснити простим способом, що означають ці терміни?

Дивитися також


Відповіді:


161

Ви хочете прочитати на порядку складності.

http://en.wikipedia.org/wiki/Big_O_notation

Коротше кажучи, O (1) означає, що це займає постійний час, як 14 наносекунд, або три хвилини, незалежно від кількості даних у наборі.

O (n) означає, що це займає лінійну кількість часу з розміром набору, тому множина, що перевищує розмір удвічі, забирає вдвічі більше часу. Напевно, ви не хочете ставити мільйон об’єктів в один із них.


66
Щоб бути педантичним, це не означає, що час виконання (або кількість операцій тощо) є постійним. Це означає, що існує константа така, що час виконання (або кількість операцій тощо) обмежений вище постійною. Ще може бути велика дисперсія в режимі виконання: наприклад, int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }є O(1).
Ясон

Чудове розуміння @jason!
Кріс Рускай

35

По суті, це означає, що на пошук цінності у вашій колекції потрібна стільки ж часу, будь то мала кількість предметів у вашій колекції або дуже велика кількість (в межах обмежень вашого обладнання)

O (n) означатиме, що час, який потрібен для пошуку предмета, пропорційний кількості предметів у колекції.

Типовими прикладами цього є масиви, до яких можна отримати доступ безпосередньо, незалежно від їх розміру, та пов'язані списки, які необхідно пройти для початку, щоб отримати доступ до певного елемента.

Інша операція, що зазвичай обговорюється, - вставка Колекція може бути O (1) для доступу, але O (n) для вставки. Насправді масив має саме таку поведінку, оскільки, щоб вставити елемент посередині, вам доведеться перемістити кожен елемент праворуч, скопіювавши його в наступний слот.


21

Кожна відповідь, яка в даний час відповідає на це запитання, говорить про те, що O(1)означає постійний час (що б не трапилося; може бути час виконання, кількість операцій тощо). Це не точно.

Сказати, що час виконання O(1)означає, що існує така константа c, що час виконання обмежений вище c, незалежно від введення. Наприклад, повернення першого елемента масиву nцілих чисел O(1):

int firstElement(int *a, int n) {
    return a[0];
}

Але ця функція O(1)теж:

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

Час виконання тут обмежений вище на 1 рік, але більшу частину часу виконання виконує в порядку наносекунд.

Сказати, що час виконання - це O(n)означає, що існує така константа c, що час виконання обмежується вище c * n, де nвимірюється розмір вводу. Наприклад, пошук кількості входжень певного цілого числа в несортованому масиві nцілих чисел за наступним алгоритмом є O(n):

int count(int *a, int n, int item) {
    int c = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] == item) c++;
    }
    return c;
}

Це тому, що нам доводиться повторювати масив, оглядаючи кожен елемент по одному.


19

O (1) означає, що час доступу до чогось не залежить від кількості предметів у колекції.

O (N) означатиме, що час доступу до предмета пропорційний кількості (N) предметів у колекції.


14

O (1) не обов'язково означає "швидко". Це означає, що час, який він займає, є постійним і не ґрунтується на розмірі входу до функції. Констант може бути швидким або повільним. O (n) означає, що час, який функціонує, буде змінюватися прямо пропорційно розміру входу до функції, позначеному n. Знову ж, це може бути швидким або повільним, але воно стане повільніше, оскільки розмір n збільшуватиметься.


9

Він називається нотацією Big O і описує час пошуку різних алгоритмів.

O (1) означає, що найгірший час запуску є постійним. У більшості випадків це означає, що вам не потрібно фактично шукати колекцію, ви відразу знайдете те, що шукаєте.


Замініть "час пошуку" на "найгірший час запуску", і я з вами.
Джейсон Пуньйон

2
@Seb: Я думаю, що це була просто помилка з його боку, особливо тому, що ОП запитала про час доступу.
jkeys

6

O(1)завжди виконувати в один і той же час незалежно від набору даних n. Прикладом O (1) може бути ArrayList, що отримує доступ до свого елемента з покажчиком.

O(n)також відомий як Лінійний порядок, продуктивність буде рости лінійно і прямо пропорційно розміру вхідних даних. Прикладом O (n) може бути вставка та видалення ArrayList у випадковому положенні. Оскільки кожне наступне вставлення / видалення у випадковому положенні призведе до того, що елементи в ArrayList зміщуватимуть ліворуч праворуч від свого внутрішнього масиву, щоб зберегти його лінійну структуру, не кажучи вже про створення нового масиву та копіювання елементів зі старого до нового масиву, який, отже, забирає дорогий час обробки, шкодить продуктивності.


4

«Велика нотація O» - це спосіб виразити швидкість алгоритмів. n- це кількість даних, з якими працює алгоритм. O(1)означає, що незалежно від того, скільки даних, вони виконуватимуться за постійний час. O(n)означає, що вона пропорційна кількості даних.


3

В основному, O (1) означає, що час його обчислення є постійним, тоді як O (n) означає, що це буде залежати лінійно від розміру вводу, тобто циклічність через масив має O (n) - просто циклічне -, тому що це залежить від числа елементів, при обчисленні максимуму між звичайними числами має O (1).

Також може допомогти Вікіпедія: http://en.wikipedia.org/wiki/Computational_complexity_theory


3

Найпростіший спосіб диференціювати O (1) і O (n) - порівняння масиву та списку.

Для масиву, якщо у вас є правильне значення індексу, ви можете отримати доступ до даних миттєво. (Якщо ви не знаєте індексу і вам доведеться пробиратися через масив, то це більше не буде O (1))

Для списку вам завжди потрібно пропустити його через те, знаєте ви індекс чи ні.


Я шукав приклад O (1), і лише ця відповідь має пояснення до цього.
neelmeg

3

Ось проста аналогія; Уявіть, що ви завантажуєте фільми в Інтернеті, з O (1), якщо на завантаження одного фільму знадобиться 5 хвилин, для завантаження 20 фільмів знадобиться стільки ж часу. Тож не важливо, скільки фільмів ви завантажуєте, вони займуть один і той же час (5 хвилин), будь то один чи 20 фільмів. Нормальний приклад цієї аналогії - коли ви переходите до бібліотеки фільмів, чи знімаєте ви один чи п'ять фільмів, просто вибираєте їх відразу. Значить, витрачаєте той же час.

Однак, якщо O (n) завантажує один фільм, потрібно 5 хвилин, для завантаження 10 фільмів піде приблизно 50 хвилин. Тому час не є постійним або якимось чином пропорційний кількості фільмів, які ви завантажуєте.


1

Це означає, що час доступу постійний. Якщо ви отримуєте доступ до 100 або 100 000 записів, час пошуку буде однаковим.

Навпаки, час доступу O (n) вказуватиме на те, що час завантаження прямо пропорційний кількості записів, з яких ви отримуєте доступ.


1

Це означає, що доступ займає постійний час, тобто не залежить від розміру набору даних. O (n) означає, що доступ залежатиме від розміру набору даних лінійно.

О також відомий як великий-O.


1

Вступ до алгоритмів: Друге видання Cormen, Leiserson, Rivest & Stein на сторінці 44 говорить, що

Оскільки будь-яка константа є поліномом градуса-0, ми можемо виразити будь-яку постійну функцію як Тета (n ^ 0), так і Тета (1). Останнє позначення є незначним зловживанням, оскільки не ясно, яка змінна має тенденцію до нескінченності. Ми часто використовуємо позначення Тета (1), щоб означати або постійну, або постійну функцію відносно якоїсь змінної. ... Позначимо через O (g (n)) ... набір функцій f (n) таким, що існують позитивні константи c і n0 такі, що 0 <= f (n) <= c * g (n) для всіх n> = n0. ... Зауважимо, що f (n) = Theta (g (n)) означає f (n) = O (g (n)), оскільки позначення Theta є сильнішим за позначення O.

Якщо алгоритм працює в O (1) час, це означає, що асимптотично не залежить від будь-якої змінної, це означає, що існує принаймні одна позитивна константа, яка при множенні на одну більша, ніж асимптотична складність (~ час виконання) функції для значень n вище певної суми. Технічно це час O (n ^ 0).


-2

O (1) означає випадковий доступ. У будь-якій пам’яті з випадковим доступом час, необхідний для доступу до будь-якого елемента в будь-якому місці, однаковий. Тут час може бути будь-яким цілим числом, але єдине, що потрібно пам’ятати, це час, який потрібно взяти для отримання елемента в (n-1), або n-му місці, буде однаковим (тобто постійним).

Тоді як O (n) залежить від розміру n.


Це не має нічого спільного з випадковим доступом - див.
Прийняту

-3

На мій погляд,

O (1) означає час виконання однієї операції або інструкції за один раз, аналіз складності часу алгоритму в кращому випадку.


6
Намагатися. Саме це питання потребує не просто точки зору, а чіткого визначення.
Альфабраво
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.