2016-02-23 21 views
11

Sau khi sửa đổi, chúng tôi kết luận rằng độ phức tạp thời gian thực sự là O (2^n)Phân tích phức tạp thời gian sử dụng big-o

Câu hỏi là độ phức tạp về thời gian? Có phải O (2^n) hay không?

Lý do tôi tin rằng điều này là do vòng lặp for được coi là được chạy n lần. Sau đó vòng lặp lồng nhau chạy 2^n thời gian. Vòng lặp thứ hai trong khi chạy 2^n thời gian.

Algorithm subsetsGenerator(T)  
Input: A set T of n elements  
Output: All the subsets of T stored in a queue Q {  

create an empty queue Q;  
create an empty stack S;  
let a1, a2, …, an be all the elements in T;  
S.push({}); // Push the empty subset into the stack  
S.push({a1})   
for (each element ai in T-{a1})   
{ 
    while (S is not empty)     
    { 
x=S.pop;      
Q.enqueue(x);       
x=x ∪ { ai };      
Q.enqueue(x);      
    }    

if (ai is not the last element)     
    while (Q is not empty)      
    { 
    x=Q.dequeue();       
    S.push(x);       
    }   
}  
} 

Chỉnh sửa: Nếu bạn muốn tôi phân tích phân tích, nhận xét dưới đây.

+0

Bạn có biết đầu ra lớn như thế nào không? Mất bao lâu để tạo ra một đầu ra lớn, thêm các phần tử vào đầu ra tại một thời điểm? Bạn và cả hai đều có phân tích sai. – user2357112

+0

Có, chúng tôi vẫn đang suy nghĩ về nó, tuy nhiên chúng tôi đang phân tích nó bằng cách sử dụng một bộ 4 yếu tố. Nếu chúng ta đi qua nó một lần nữa, mỗi vòng lặp while cho 2^n, và vòng lặp for chỉ cho một n. – Mikeez

+0

Có câu hỏi nào ở đây không? – Charlie

Trả lời

1

Đối với các phần tử T của n, tổng số tập con là 2^n. Nếu bạn muốn giữ tất cả các tập con đó trong Q, độ phức tạp của thời gian ít nhất là O (2^n).


Thực ra tôi nghĩ O (2^n) là câu trả lời.

Nếu tôi hiểu thuật toán của bạn một cách chính xác, bạn đang cố gắng làm cho mỗi phần tử a_i trong T, lấy tất cả mọi thứ trong S, đặt nó trở lại S hai lần - một lần không có a_i và một lần với a_i.

Do đó tổng thời gian phức tạp là (1 + 2 + 4 + ... + 2^n) lần C, C là thời gian để bật, enqueue, dequeue và push, là O (1). Thuật ngữ trên bằng 2^(n + 1) -1 vẫn là O (2^n).

+0

Tôi tin rằng O (n (2^n)) của nó. Tôi đã sửa đổi phân tích của mình. – Mikeez

+0

@Mikeez Well .. Thực ra tôi nghĩ rằng đó chỉ là O (2^n) ... – bfrguci

+0

@Mikeez Mặc dù bạn đang thực hiện ** cho ** vòng lặp n lần, nhưng mỗi lần quy mô của vòng lặp không giống nhau - nó đang phát triển theo cấp số nhân. – bfrguci

Các vấn đề liên quan