Big o notation là gì

Ắt hẳn Khi đối mặt với cùng 1 bài bác tân oán họ vẫn có khá nhiều giải thuật khác nhau mang lại nó. Việc review 1 giải mã là giỏi xuất xắc xấu khiến cho quan niệm big O thành lập và hoạt động.Bài viết này đã trình diễn tư tưởng big O là gì, 1 số ít độ phức tạp thường chạm chán, cách tính big O vào 1 số ít ngôi trường thích hợp.

Bạn đang xem: Big o notation là gì

1. Big O - Độ tinh vi của thuật tân oán là gì?

Lấy 1 ví dụ nhé, giữa truyền tài liệu qua Internet với bằng chyên ổn người tình câu bạn nghĩ về câu hỏi nào vẫn nkhô nóng hơn. Chắc là khi nói về phía trên, 1 số bạn sẽ nhận định rằng chyên ý trung nhân câu - 1 phương thức đang Thành lập từ thời điểm cách đó rộng 3000 năm lại đem đối chiếu cùng với Internet - 1 cách thức văn minh mới lộ diện trong vòng 100 năm quay trở lại đây liệu liệu có phải là vượt khập khiễng? Câu cthị xã xẩy ra vào thời điểm năm 2009, 1 cửa hàng nghỉ ngơi Nam Phi sẽ làm cho 1 thí điểm nhỏ tuổi. Họ tất cả 2 chi nhánh ngơi nghỉ phương pháp nhau 50 dặm, 1 con đường truyền Internet (ở mức hơi chậm). Thử nghiệm được triển khai với cùng 1 lương dữ liệu mập. Mục đích của họ là truyền dữ liệu ở chi nhánh này quý phái chi nhánh tê. Tiến hành phân tách, chúng ta buộc những chiếc USB lại thành từng bó, buộc vào chân chyên ý trung nhân câu và cho chlặng người thương câu cất cánh từ chi nhánh này thanh lịch Trụ sở tê. Cùng cơ hội đó, dữ liệu cũng khá được truyền qua Internet. Và phần win sau cuối vẫn ở trong về chụ chyên ổn bồ câu. Vậy ngulặng nhân là do đâu?

Hãy nhớ lại tôi đã nói gì? "Thử nghiệm được tiến hành cùng với lượng tài liệu LỚN." Nguyên ổn nhân cốt tử của vụ việc nằm tại chỗ này. Với lượng tài liệu càng béo, thời gian truyền cài đặt dữ liệu qua Internet cũng sẽ càng tăng thêm (với 1 con đường truyền mạng khi bạn download 1 tệp tin với dung tích 1GB đã nkhô hanh rộng file với dung lượng 10GB), trong những lúc cùng với chyên ổn bồ câu, khi số lượng tài liệu tăng lênviệc của nó là cất cánh 50 dặm (với lượng USB được buộc vào chân tăng lên cùng vào mức độ chịu đựng của nhân tình câu) khoác mang đến lượng dữ liệu bao gồm tăng thêm thì quãng mặt đường đó vẫn là 50 dặm. Qua ví dụ trên có thể thấy khi lượng tài liệu tạo thêm thì thời hạn truyền thiết lập qua Internet đã tăng thêm trong lúc thời gian truyền download bởi chim người thương câu vẫn không thay đổi. Trong trường hòa hợp này ta nói bài toán truyền tải dữ liệu bởi chyên ổn nhân tình câu tất cả bao gồm độ phức tạp hằng số còn qua Internet tất cả độ tinh vi phụ thuộc vào vào lượng tài liệu nên truyền tải.

Khái niệm độ phức tạp là gì rất có thể đọc đơn giản dễ dàng là độ tương quan thân thời hạn chạy của thuật toán với độ to của tài liệu nguồn vào.

2. Một số độ tinh vi thường gặp:

O(n):Độ phức tạp đường tính. Xét hàm tính tổng các số từ 1 mang lại n sau:

int sum(int n){ int s = 0; for(int i = 1; i Với mỗi quý giá khác nhau của n thì mốc giới hạn triển khai của vòng lặp bên trên là n lần. Chính bởi vậy thời hạn tiến hành của công tác bên trên phụ thuộc vào vào quý hiếm đầu vào n. Ta nói độ tinh vi của công tác trên là O(n) (thực chất là O(n+2)).

O(1):Độ tinh vi hằng số. Cũng là bài tân oán tính tổng các số từ một đến n. Xét đoạn lịch trình sau:

int sum(int n) return n*(n+1)/2;Không giống như hàm tính tổng nghỉ ngơi bên trên, với đoạn chương trình này với đa số quý giá nguồn vào công tác chỉ xúc tiến đúng 1 câu lệnh return. Do đó, ta nói độ phức hợp của công tác trên là O(1).

O(n²): Thường gặp mặt khi bao gồm 2 vòng lặp lồng nhau. Xét hàm bố trí đổi vị trí thẳng (interchange Sort) sau:

void interchangeSort(int *a, int n) for (int i = 0; i a) int temp = a; a = a; a = temp; Trong hàm này, i vẫn chạy tự 0 mang lại n - 2. Ứng cùng với mỗi cực hiếm của i vòng for trong đã chạy n - i - 1 lần (j trường đoản cú i + 1 mang lại n - 1), do đó số phnghiền đối chiếu bắt buộc thực hiện đang là Σ(n - i - 1) (cùng với i chạy từ 0 đến n - 2) = (n - 1) + (n - 2) + (n - 3) +...+ 2 + 1 = (n - 1)*n/2 = n²/2 - n/2. Ta nói độ tinh vi của thuật tân oán trên là O(n²) (thực chất là O(n²/2 - n/2)).

Xem thêm: Meta Nghĩa Là Gì - Nguồn Gốc Và Ý Nghĩa Của Tên Meta

O(logn):

int binarySearch(int *arr, int n, int x) { int r = n - 1; int l = 0; while (r >= l) { int mid = l + r) / 2; if (arr == x) return mid; if (arr > x) r = mid - 1; if (arr Hiểu dễ dàng thì thuật tân oán này nhằm search kiếm 1 phần tử có giá trị x gồm trong mảng arr đã có được thu xếp tăng đột biến. Để kiếm được giá trị đó, phát minh là bọn họ đã theo lần lượt phân hoạch mảng ra làm song, xét bộ phận ở giữa, trường hợp thành phần kia lớn hơn quý giá yêu cầu tìm kiếm thì xét tiếp nửa phía bên trái của phần tử đó, ngược trở lại thì xét nửa bên yêu cầu, với liên tiếp phân hoạch như thế cho đến khi tìm thấy bộ phận có mức giá trị yêu cầu tra cứu (hoàn toàn có thể không tìm kiếm thấy trường hợp quý hiếm đề nghị tra cứu không có trong mảng). Trong trường đúng theo xấu tốt nhất, chúng ta đã đề nghị phân hoạch cho đến khi mảng phân hoạch chỉ còn 1 phần tử (giả dụ đó không hẳn là cực hiếm bắt buộc kiếm tìm thì trả về - 1). Khi đó để lấy 1 mảng có n bộ phận về một trong những phần tử ta yêu cầu thực hiện logn (đọc là log cơ số 2) lần phân hoạch. Do đó ta nói thuật toán bên trên tất cả độ phức tạp O(logn).

Ngoài ra còn có 1 số độ phức tạp hay gặp như O(nlogn), O(n!), O(2^n), O(n³),... Dưới đây là biểu đồ gia dụng mô tả độ hiệu quả của các độ phức hợp thường xuyên gặp mặt.

*

3. Một số xem xét nhằm tính độ phức hợp thuật toán:

Lúc xét big O, ta luôn luôn xét cùng với n là một số khôn xiết bự, do đó gồm núm coi n là +∞.(1)Các bước thực thi không nhờ vào vào quý hiếm đầu vào(ví dụ những phnghiền tính toán thù, gán, đối chiếu,...) có độ phức hợp hằng số(O(1)).(2)Tổng những hằng số là 1 trong những hằng số.(3)Tích của 1 số dương với +∞ cũng chính là +∞, tổng của 1 số với+∞ cũng là+∞.(4)

Các bước nhằm tính độ tinh vi thuật toán:

điện thoại tư vấn T là độ phức hợp thuật tân oán đề nghị tra cứu.Tính biểu thức T bằng phương pháp cộng thời hạn triển khai của những câu lệnh vào thuật tân oán.Xét số hạng gồm vận tốc tăng nkhô giòn nhất khi n tiến đến +∞.Lược quăng quật các cực hiếm hoàn toàn có thể lược quăng quật được theo các nguyên tắc sống bên trên.Giá trị của số hạng cuối cùng còn sót lại đó là độ phức tạp thuật tân oán đề nghị search.

Hơi khó phát âm đề nghị không, quay lại ví dụ hàm tính tổng những số từ là một cho n nhé:

int sum(int n) int s = 0; // --->O(1) for(int i = 1; i O(1) return s; // --->O(1)Dựa bên trên gần như gì mình đã chú giải nghỉ ngơi trên thì vào ngôi trường phù hợp này T = O(1) + n x O(1) + O(1) = n x c + d (áp dụng (3), coi O(1) + O(1) là d, với c, d là những hằng số) = n (như sẽ nhắc tới ở bên trên n hoàn toàn có thể coi là +∞, vận dụng (4) để lược quăng quật c, d). = O(n).

Xét tiếp ví dụ hàm interchangeSort nhé:

void interchangeSort(int *a, int n) for (int i = 0; i i tăng tự 0 mang lại n - 2 for (int j = i+1; j n - 1 - i lần, i tự 0 đến n - 2 if (a > a) // ---> O(1) int temp = a; // ---> O(1) a = a; // ---> O(1) a = temp; // ---> O(1) Ở phần đối chiếu ta thấy tất cả đều phải có tinh vi O(1) (ko nhờ vào quý hiếm đầu vào), cho nên vì thế để gọn mình hoàn toàn có thể coi cả khối hận lệnh so sánh là O(1) trong những lần xúc tiến mặc đến điều kiện đối chiếu có xẩy ra hay là không. Tiếp đến nhằm tính chu kỳ thực hiện của vòng for ta nhận thấy vòng for sinh hoạt vào sẽ chạyn - 1 - i lần, cùng với i trường đoản cú 0 mang đến n - 2 cho nên mốc giới hạn chạy đang là∑(n - 1 - i) (cùng với i từ 0 mang đến n - 2) = (n - 1)+ (n - 2) + (n - 3) +...+ 2 + 1 = (n - 1) x n/2 = n²/2 - n/2. Do kia T = (n²/2 - n/2) x O(1) =(n²/2 - n/2) x c (với c là hằng số) =n²/2 x c - n/2 x c =/2 x c (vị vận tốc tăng của n²/2 x c khi n tiến mang lại +∞ là nhanh hao tốt nhất vào biểu thức trên) =n² (vận dụng (4)) =O(n²).

Tương tự các chúng ta có thể tính độ tinh vi của các thuật toán thù khác dựa vào quá trình tiến hành nlỗi bên trên.

4.Kết luận:

Một lập trình sẵn viên là bạn hoàn toàn có thể cân nhắc ra được giải thuật cho các bài tân oán, cơ mà một lập trình sẵn viên giỏi là fan hoàn toàn có thể tìm thấy được lời giải tối ưu duy nhất tùy thuộc vào từng bài toán thù. Hi vọng hầu hết share của bản thân mình trên phía trên rất có thể phần như thế nào góp các bạn bên trên con phố đổi mới 1 thiết kế viên xuất sắc. Chúc các bạn học tốt!