- Yayımlanma tarixi
JavaScript-də ən böyük O nömrəsi
- Müəllif(lər)
- Ad
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
Böyük O Notasiyası
Böyük O Notasiyası, ümumiyyətlə Baçmann-Landau notasiyası və ya asimptotik notasiya olaraq adlandırılır, bir alqoritmin performansını təsvir etmək üçün istifadə olunan bir üsuldur. Bir alqoritmin ən pis hal senarisini təsvir etmək üçün istifadə olunur. Fərqli alqoritmlərin performansını müqayisə etmək üçün də istifadə olunur. Bir alqoritmin icrasını giriş ölçüsünün funksiyası olaraq təsvir edir.
Böyük O notasiyası funksiyaları onların böyümə sürətlərinə görə xarakterizə edir: eyni böyümə sürətinə malik tapşırıqlar eyni sırada olduğu hesab olunur. Müəyyən bir dəyərə və ya sonsuzluğa meyl edərkən bir funksiyanın limit davranışını təsvir edən riyazi bir notasyondur. Alqoritmləri icra vaxtı və ya yer tələbatlarının giriş ölçüsü artdıqca necə artdığına görə təsnif etmək üçün istifadə olunur. O hərfi istifadə olunur, çünki bir funksiyanın böyümə dərəcəsi də onun sırası adlanır.
İterasiya
For dövrü
for (let i = 0; i < n; i++) {
console.log(i)
}
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
While dövrü
let i = 0
while (i < n) {
console.log(i)
i++
}
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
Do while dövrü
let i = 0
do {
console.log(i)
i++
} while (i < n)
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
Rekursiya
Faktorial
function factorial(n) {
if (n === 0) {
return 1
}
return n * factorial(n - 1)
}
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
Fibonaççi
function fibonacci(n) {
if (n <= 1) {
return n
}
return fibonacci(n - 1) + fibonacci(n - 2)
}
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
Axtarış
Xətti axtarış
function linearSearch(arr, value) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === value) {
return i
}
}
return -1
}
Yuxarıdakı kod n dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n) dir.
İkili axtarış
function binarySearch(arr, value) {
let start = 0
let end = arr.length - 1
let middle = Math.floor((start + end) / 2)
while (arr[middle] !== value && start <= end) {
if (value < arr[middle]) {
end = middle - 1
} else {
start = middle + 1
}
middle = Math.floor((start + end) / 2)
}
if (arr[middle] === value) {
return middle
}
return -1
}
Yuxarıdakı kod log(n) dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(log(n)) dir.
Sıralama
Baloncuk sıralama
function bubbleSort(arr) {
for (let i = arr.length; i > 0; i--) {
for (let j = 0; j < i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
Yuxarıdakı kod n^2 dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n^2) dir.
Seçim sıralama
function selectionSort(arr) {
for (let i = 0; i < arr.length; i++) {
let lowest = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[lowest]) {
lowest = j
}
}
if (i !== lowest) {
let temp = arr[i]
arr[i] = arr[lowest]
arr[lowest] = temp
}
}
return arr
}
Yuxarıdakı kod n^2 dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n^2) dir.
Daxil etmə sıralama
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let currentVal = arr[i]
for (var j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
arr[j + 1] = arr[j]
}
arr[j + 1] = currentVal
}
return arr
}
Yuxarıdakı kod n^2 dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n^2) dir.
Birləşdirmə sıralama
function mergeSort(arr) {
if (arr.length <= 1) return arr
let mid = Math.floor(arr.length / 2)
let left = mergeSort(arr.slice(0, mid))
let right = mergeSort(arr.slice(mid))
return merge(left, right)
}
function merge(left, right) {
let results = []
let i = 0
let j = 0
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
results.push(left[i])
i++
} else {
results.push(right[j])
j++
}
}
while (i < left.length) {
results.push(left[i])
i++
}
while (j < right.length) {
results.push(right[j])
j++
}
return results
}
Yuxarıdakı kod n log(n) dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n log(n)) dir.
Tez sıralama
function pivot(arr, start = 0, end = arr.length + 1) {
let pivot = arr[start]
let swapIdx = start
function swap(array, i, j) {
let temp = array[i]
array[i] = array[j]
array[j] = temp
}
for (let i = start + 1; i < arr.length; i++) {
if (pivot > arr[i]) {
swapIdx++
swap(arr, swapIdx, i)
}
}
swap(arr, start, swapIdx)
return swapIdx
}
function quickSort(arr, left = 0, right = arr.length - 1) {
if (left < right) {
let pivotIndex = pivot(arr, left, right)
quickSort(arr, left, pivotIndex - 1)
quickSort(arr, pivotIndex + 1, right)
}
return arr
}
Yuxarıdakı kod n log(n) dəfə işləyəcək. Bu kodun zaman mürəkkəbliyi O(n log(n)) dir.
Böyük O üçün məsləhətlər
- Aritmetik əməliyyatlar sabitdir
- Dəyişən təyinatı sabitdir
- Bir massiv (indekslə) və ya obyektə (açarla) elementlərinə giriş sabitdir
- Bir dövrədə mürəkkəblik dövrün uzunluğu ilə dövrün içərisində baş verən hər hansı bir şeyin mürəkkəbliyinin hasilinə bərabərdir