Notasi Big O

Notasi Big O adalah cara membandingkan algoritma. Ini membandingkannya dengan menghitung berapa banyak memori yang dibutuhkan dan berapa banyak waktu yang dibutuhkan untuk menyelesaikannya.

Notasi Big O sering digunakan dalam mengidentifikasi seberapa kompleks suatu masalah, juga dikenal sebagai kelas kompleksitas masalah. Matematikawan Paul Bachmann (1837-1920) adalah orang pertama yang menggunakan notasi ini, dalam edisi kedua bukunya "Analytische Zahlentheorie", pada tahun 1896. Edmund Landau (1877-1938) membuat notasi ini populer. Karena alasan ini, ketika orang berbicara tentang simbol Landau, mereka mengacu pada notasi ini.

Notasi Big O dinamai sesuai dengan istilah "orde fungsi", yang mengacu pada pertumbuhan fungsi. Notasi Big O digunakan untuk menemukan batas atas (jumlah tertinggi yang mungkin) dari tingkat pertumbuhan fungsi, yang berarti ia menghitung waktu terlama yang diperlukan untuk mengubah input menjadi output. Ini berarti sebuah algoritma dapat dikelompokkan berdasarkan berapa lama waktu yang dibutuhkan dalam skenario terburuk di mana rute terpanjang akan diambil setiap saat.

Big O adalah ekspresi yang menemukan skenario run-time terburuk, menunjukkan seberapa efisien sebuah algoritma tanpa harus menjalankan program di komputer. Hal ini juga berguna karena komputer yang berbeda mungkin memiliki perangkat keras yang berbeda dan oleh karena itu membutuhkan waktu yang berbeda untuk menyelesaikannya. Karena Big O selalu mengasumsikan kasus terburuk, Big O dapat menunjukkan pengukuran kecepatan yang konsisten: terlepas dari perangkat keras Anda, O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} selalu akan selesai lebih cepat daripada O ( n ! ) {\displaystyle O(n!)}{\displaystyle O(n!)} karena mereka memiliki tingkat efisiensi yang berbeda.

Contoh

Contoh-contoh berikut ini semuanya menggunakan kode yang ditulis dalam Python. Perhatikan bahwa ini bukan daftar lengkap tipe Big O.

Konstan

O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} . Selalu membutuhkan jumlah waktu yang sama terlepas dari inputnya. Sebagai contoh, ambil sebuah fungsi yang menerima sebuah bilangan bulat (disebut x) dan mengembalikan nilainya dua kali lipat:

def double(x): return x * 2 #Mengembalikan nilai x dikali 2

Setelah menerima input, fungsi ini akan selalu mengambil satu langkah untuk mengembalikan output. Hal ini konstan karena akan selalu mengambil jumlah waktu yang sama, sehingga O ( 1 ) {\displaystyle O(1)}{\displaystyle O(1)} .

Linear

O ( n ) {\displaystyle O(n)}{\displaystyle O(n)} . Meningkat sesuai dengan ukuran input, diwakili oleh n {\displaystyle n}n . Mari kita asumsikan sebuah fungsi menerima n, dan mengembalikan setiap angka dari 1 sampai n:

def count(n): i = 1 #Membuat counter bernama "i" dengan nilai 1 while i <= n:   #Sementara i kurang dari atau sama dengan n print(i) #Cetak nilai i i = i + 1 #Definisi ulang i sebagai "nilai i + 1"

Jika kita memasukkan nilai 5 maka ini akan menghasilkan 1 , 2 , 3 , 4 , 5 {\displaystyle 1,2,3,4,5}. {\displaystyle 1,2,3,4,5}, membutuhkan 5 loop untuk menyelesaikannya. Demikian pula, jika kita memasukkan 100 maka akan menghasilkan 1 , 2 , 3...98 , 99 , 100 {\\displaystyle 1,2,3...98,99,100}{\displaystyle 1,2,3...98,99,100} , yang membutuhkan 100 loop untuk menyelesaikannya. Jika masukannya adalah n {\displaystyle n}n maka waktu berjalan algoritma ini tepat n {\displaystyle n}n loop setiap kali, oleh karena itu O ( n ) {\displaystyle O(n)}{\displaystyle O(n)} .

Faktorial

O ( n! ) {\displaystyle O(n!)}{\displaystyle O(n!)} . Meningkat dalam jumlah faktorial, yang berarti waktu yang dibutuhkan meningkat secara besar-besaran dengan input. Sebagai contoh, katakanlah kita ingin mengunjungi lima kota di seluruh dunia dan ingin melihat setiap kemungkinan urutan (permutasi). Algoritma yang dapat kita tulis menggunakan library itertools Python adalah sebagai berikut:

import itertools #Import itertools library cities = ['London', 'Paris', 'Berlin', 'Amsterdam', 'Roma'] #Sebuah array dari kota-kota pilihan kita def permutations(cities):                    #Mengambil array kota sebagai input: for i in itertools. permutations(cities): #Untuk setiap permutasi dari item-item kita (ditugaskan ke variabel "i") print(i) #Output i

Algoritma ini akan menghitung setiap permutasi unik dari kota-kota kita dan kemudian mengeluarkannya. Contoh keluaran akan mencakup:

('London', 'Paris', 'Berlin', 'Amsterdam', 'Roma') ('London', 'Paris', 'Berlin', 'Roma', 'Amsterdam') ('London', 'Paris', 'Amsterdam', 'Berlin', 'Roma') ... ('Roma', 'Amsterdam', 'Paris', 'Berlin', 'London') ('Roma', 'Amsterdam', 'Berlin', 'London', 'Paris') ('Roma', 'Amsterdam', 'Berlin', 'Paris', 'London')

Di sini daftar input kita terdiri dari 5 item, dan untuk setiap pilihan, pilihan yang tersisa berkurang 1. Dengan kata lain, 5 input kita memilih 5 × 4 × 3 × 2 × 1 {\\displaystyle 5\kali 4\kali 3\kali 2\kali 1}{\displaystyle 5\times 4\times 3\times 2\times 1} item (atau 5 ! {\\displaystyle 5!}{\displaystyle 5!} ). Jika input kita adalah n {\displaystyle n}n kota maka jumlah outputnya adalah n ! {\displaystyle n! }{\displaystyle n!} ; dengan kata lain, dengan asumsi kita melalui setiap permutasi, kita akan memerlukan O ( n! ) {\displaystyle O(n!)}{\displaystyle O(n!)} loop untuk menyelesaikannya.

Notasi Little-o

Versi yang lebih ketat dari Big O adalah little-o. Perbedaan antara big O dan little-o adalah bahwa little-o adalah batas atas yang ketat: sementara O ( n ) {\displaystyle O(n)}{\displaystyle O(n)} berarti waktu penyelesaian akan meningkat hingga maksimum ini berdasarkan ukuran input, o ( n ) {\displaystyle o(n)}{\displaystyle o(n)} berarti waktu penyelesaian umumnya akan berada di bawah jumlah waktu ini. Dengan kata lain, Big O mengasumsikan setiap loop akan mengambil jalur terpanjang dan prosesnya akan memakan waktu selama mungkin, sedangkan little-o lebih realistis tentang waktu penyelesaian yang sebenarnya; jika jumlah loop didasarkan pada lemparan dadu 6 sisi Big O akan selalu mengasumsikan angka 6 yang dilempar, sedangkan little-o akan memperhitungkan probabilitas yang sama dengan angka-angka lain yang dilempar.

Pertanyaan dan Jawaban

T: Apa yang dimaksud dengan notasi Big O?


J: Notasi Big O adalah cara membandingkan tingkat pertumbuhan fungsi yang berbeda, sering digunakan untuk membandingkan efisiensi algoritma yang berbeda dengan menghitung berapa banyak memori dan waktu yang dibutuhkan untuk menyelesaikannya. Ini juga dapat digunakan untuk mengidentifikasi seberapa kompleks suatu masalah.

T: Siapa yang pertama kali menggunakan notasi ini?


J: Matematikawan Paul Bachmann (1837-1920) adalah orang pertama yang menggunakan notasi ini dalam bukunya "Analytische Zahlentheorie" pada tahun 1896.

T: Apa kepanjangan dari Big O?


J: Big O adalah singkatan dari "orde fungsi", yang mengacu pada tingkat pertumbuhan fungsi.

T: Bagaimana Big O digunakan?


J: Notasi Big O digunakan untuk menemukan batas atas (jumlah tertinggi yang mungkin) pada laju pertumbuhan fungsi, yang berarti ia menghitung waktu terlama yang diperlukan untuk mengubah input menjadi output. Ini berarti algoritma dapat dikelompokkan berdasarkan berapa lama waktu yang dibutuhkan dalam skenario terburuk, di mana rute terpanjang akan diambil setiap saat.

T: Apa itu simbol Landau?


J: Simbol Landau merujuk pada notasi Big O, dinamai menurut Edmund Landau (1877-1938) yang membuat notasi ini populer.

T: Mengapa Big O berguna?



J: Big O memungkinkan kita untuk mengukur kecepatan tanpa harus menjalankan program di komputer karena selalu mengasumsikan skenario terburuk, membuatnya konsisten terlepas dari perbedaan perangkat keras antar komputer. Big O juga menunjukkan seberapa efisien sebuah algoritma tanpa harus benar-benar menjalankannya di komputer.

AlegsaOnline.com - 2020 / 2023 - License CC3