-
05-26-2010, 08:26 AM #1
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 4
giúp mình tính độ phức tạp giải thuật này với
nhờ các bạn làm giúp mình bài này :
tính độ phức tạp giải thuật của đoạn chương trình sau [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]những đoạn được đánh số)
a. [1] sum := 0;
[2] for i:= 1 to n do begin
[3] readln(x);
[4] sum := sum + x;
end;
b.
function search (a:array [1..n] of integer; x : integer) : boolean;
var i:integer; found : boolean;
begin
[1] i:=1;
[2] found := false;
[3] while (i<n) and (not found) do
[4] if A = x then found := true else i := i + 1;
[5] search := found;
end;
c. giải thích tại sao "một thuật toán có cấp O(1) cũng có thể viết là O(logn)" {đối với câu a}
và "O(n) cũng có thể viết là O(n.logn)" {đối với câu b}
-
05-27-2010, 03:55 AM #2
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 4
a, O(N)
b, O(N)
c, mình chưa bao giờ nghe nói đến việc O(1) có thể viết là O(logN). Ý nghĩa khác hẳn nhau. Bạn lấy đề bài ở đâu ra thế??? Cả chuyện O(N) có thể viết là O(NlogN) cũng vậy.
-
05-31-2010, 04:12 PM #3
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 4
Các bạn nói kĩ hơn phần độ phức tạp của thuật toán cho mình nghe với. Mình không thạo phần này cho lắm.
Ở câu a) Có phải là readln(x) có độ phức tạp là O(1)
sum:=sum+x cũng có độ phức tạp là O(1)
Vậy câu lệnh ghép đó có độ phức tạp là max(O(1),O(1))=O(1)
và câu lệnh đó được thực hiện n lần nên độ phức tạp là n*O(1)=O(n)
Các bác cho em hỏi em hiểu khi thế có đúng không nhỉ?
-
05-31-2010, 04:19 PM #4
Silver member
- Ngày tham gia
- Aug 2015
- Bài viết
- 117
mà bài của thoden.it có chỗ này chưa chuẩn
Đó là khai báo mảng trong chương trình con thì không viết a:array[1..n] of integer được mà phải khai báo kiểu trước đã, không khai báo như vậy được
b.
function search (a:array [1..n] of integer; x : integer) : boolean;
var i:integer; found : boolean;
begin
[1] i:=1;
[2] found := false;
[3] while (i<n) and (not found) do
[4] if A = x then found := true else i := i + 1;
[5] search := found;
end;
-
05-31-2010, 04:21 PM #5
Junior Member
- Ngày tham gia
- Nov 2015
- Bài viết
- 8
em học Visual Basic em k học cái này!pác nào có thắc mắc gì về Vb thì em có thể jjup!
còn cái này thì chịu!
-
06-01-2010, 03:32 AM #6
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 3
@ lehang_gb1: Mình cũng không phải là chuyên gia tin học, nên chỉ có thể nói một số điều mình biết thôi [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
Nói một cách đơn giản thì độ phức tạp của một thuật toán có thể xác định qua các vòng lặp và các ct đệ quy.
VD đoạn code sau
Mã:for t := 1 to n do for k := m downto 1 do a[t, k] := t-k;
Trong vòng lặp có thể có nhiều phép toán được thực hiện, nhưng độ phức tạp thường chỉ tính dựa vào vòng lặp thôi. VD đoạn code sau:
Mã:t1 := 1; t2 :=2; t3 :=3; for t := 1 to n do begin t1 := t1 + n - t2; t2 := t2 - n + t3; t3 := t3 + n div 2; t4 := t1 + t2 + t3; end;
Các đoạn chương trình đệ qui thì cũng có thể tính được độ phức tạp: như chương trình sinh (kiểu sinh hoán vị) thì sẽ là O(N!), chương trình tìm kiếm nhị phân thì sẽ là O(logN), chương trình của thuật toán sắp xếp nhanh (quick sort) thường được cho là O(N.logN).
Trong một chương trình lớn sẽ bao gồm một hoặc nhiều đoạn chương trình con, và độ phức tạp của chương trình lớn chính là độ phức tạp của chương trình con có độ phức tạp lớn nhất.
Việc đánh giá độ phức tạp của một chương trình giúp ước lượng thời gian chạy của chương trình. Điều này là đặc biệt quan trọng cho các bạn học sinh muốn tham gia các kì thi tin học, vì nếu nắm vững khái niệm này các bạn (đôi lúc) có thể nhìn vào giới hạn của bài toán rồi nhẩm được độ phức tạp "khả thi", từ đó "khoanh vùng" được các thuật toán -> hạn chế được việc suy nghĩ lan man không có phương hướng rõ ràng.
Tuy nhiên thì cũng có một số trường hợp chương trình có độ phức tạp lớn hơn lại chạy nhanh hơn chương trình có độ phức tạp nhỏ hơn. Vì thế độ phức tạp cũng chỉ là một thước đo tương đối, nên việc học tập, thực hành và sử dụng cái thước đo này như thế nào là tuỳ vào bạn. Kể cả việc nó có giúp ích được gì cho bạn không thì cũng tuỳ vào bạn sử dụng nó như thế nào.
-
06-02-2010, 08:30 AM #7
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 2
Gửi bởi trunga0
bạn đọc trong tài liệu cấu trúc rời rạc đi :
mình nếu đầy đủ lun cho coi nhé
theo định nghĩa về độ phức tạp tính toán:
- một thuật toán cấp O(1) cũng có thể viết là O(logn)
- một thuật toán cấp O(logn) cũng có thể viết là O(n)
- một thuật toán cấp O(n) cũng có thể viết là O(n.logn)
- một thuật toán cấp O(n.logn) cũng có thể viết là O(n^2)
-
06-02-2010, 08:38 AM #8
Silver member
- Ngày tham gia
- Aug 2015
- Bài viết
- 19
Gửi bởi lehang_gb1
cậu có thể giải thích rõ hơn cho mình được không. :emlaugh:
-
06-02-2010, 04:49 PM #9
Silver member
- Ngày tham gia
- Jan 2016
- Bài viết
- 47
Eo! Học CNTT sướng quá ta. Mấy cái này thì đâu cần suy nghĩ gì nhiều đâu he.
-
06-05-2010, 09:08 AM #10
Junior Member
- Ngày tham gia
- Dec 2015
- Bài viết
- 4
Gửi bởi HappySoftGroup
nhờ các bạn giải thích giùm mình vì sao lại thế này là được :
tại sao có thể nói :
- một thuật toán cấp O(1) cũng có thể viết là O(logn)
- một thuật toán cấp O(logn) cũng có thể viết là O(n)
- một thuật toán cấp O(n) cũng có thể viết là O(n.logn)
- một thuật toán cấp O(n.logn) cũng có thể viết là O(n^2)
Xe nâng người Boom lift được Công Ty TNHH Trung thành phân phối chính hãng tại khu vực phía Bắc. Với chi phí đầu tư ban đầu thấp hơn rất nhiều so với các loại xe nâng dầu , xe nâng động cơ loại...
Xe nâng người được trung thành nhập khẩu giá tốt