2012-03-31 41 views
8

Tôi có một câu hỏi liên quan đến sự phức tạp về thời gian (ký hiệu O lớn) cho phần mềm Java. Có cách nào để nhanh chóng tính toán hoặc kiểm tra nó (hoặc bất kỳ trang web có thể tính toán nó cho tôi sẽ được hoan nghênh). Ví dụ tôi muốn kiểm tra xem nó cho đoạn mã sau đây và có thể cải thiện cũng như:Một công cụ để tính toán độ phức tạp thời gian lớn của mã Java?

int dcount = 24423567; 
     int a = 0; 
     if (dcount == 0){ 
      a = 1; 
     } 

     String ds = Integer.toString(dcount); 
     String[] sa = ds.split("(?<=.)"); 
     HashSet hs = new HashSet(); 
     Collections.addAll(hs, sa); 
     a = hs.size(); 
     if (dcount < 0) 
      a--; 

     System.out.println(a); 
+0

"Độ phức tạp thời gian" thường có nghĩa là độ phức tạp của trường hợp xấu nhất. Vấn đề này đã được chứng minh là không thể. – emory

+0

Tôi có nghĩa là (big-O) phức tạp. Cũng sẽ chỉnh sửa bài đăng. – aretai

+0

Nếu bạn muốn đếm các chữ số riêng biệt trong một số, mã đó chắc chắn không phải là giải pháp tối ưu cả về thời gian và không gian. –

Trả lời

13

Như @emory chỉ ra, nó là provably không xác định được thời gian phức tạp lớn-O của một mảnh tùy ý mã tự động (bằng chứng là giảm từ Halting Problem). Tuy nhiên, có những công cụ có thể cố gắng đo lường sự phức tạp của một đoạn mã theo kinh nghiệm bằng cách chạy nó trên một số đầu vào khác nhau. Một công cụ như vậy được mô tả trong bài báo “Đo lường tính phức tạp tính toán thực nghiệm” của Goldsmith, Aiken và Wilkerson. Nó hoạt động bằng cách cố gắng thực hiện hồi quy về thời gian chạy của chương trình so với kích thước đầu vào của chương trình. Công cụ này, được gọi là trend-prof, có sẵn trực tuyến.

Hy vọng điều này sẽ hữu ích!

+0

Bạn nói rằng có những công cụ để đo lường độ phức tạp bằng cách chạy nó với các đầu vào khác nhau. Làm thế nào là khác nhau nếu một người sử dụng tự chạy mã của mình với các đầu vào khác nhau và tính toán thời gian. Cả hai sẽ cung cấp cho cùng một kết quả? Tự động so với thủ công? – Faizan

+0

@ Faizan- Công cụ thực hiện nhiều hơn là chỉ chạy chương trình. Nó cho biết thêm rất nhiều công cụ nhị phân để đo lường các chức năng riêng lẻ/các khối mã, và nó chắc chắn dễ dàng hơn nhiều so với thực hiện nó bằng tay. Về nguyên tắc bạn có thể làm điều tương tự bằng tay, nhưng nó sẽ * nhiều * khó hơn. – templatetypedef

+0

@templatetypedef nó luôn luôn có lợi nếu bạn cung cấp tên của giấy và không chỉ là "trong bài báo này" như các liên kết đã phá vỡ khá thường xuyên. – Vishrant

1

tôi có thể giải quyết các bài tập về nhà của một ai đó, nhưng câu hỏi đã cầu xin cho một giải pháp lành mạnh ...

Đếm chữ số riêng biệt trong một số đòi hỏi không dây, bộ hoặc biểu thức thông thường, chỉ cần một số arithmetics đơn giản.

Các phương pháp sau đây chạy trong thời gian O (n) thời gian (n = số chữ số ở đầu vào) và không gian liên tục:

int distinctDigits(int num) { 
    if (num == 0) { 
    return 1; 
    } 

    boolean[] digits = new boolean[10]; 

    while (num > 0) { 
    digits[num % 10] = true; 
    num /= 10; 
    } 

    int count = 0; 
    for (boolean digit : digits) { 
    if (digit) { 
     count++; 
    } 
    } 

    return count; 
} 

Làm tác phẩm này với số âm là trái như một exericse cho người đọc;)

+0

nah nó không phải là bài tập về nhà của tôi cảm ơn bạn. Thực ra tôi cũng nghĩ về cách tiếp cận này; tuy nhiên, nghĩ rằng chuyển đổi thành String và sau đó sử dụng Set sẽ hiệu quả hơn (độ phức tạp thời gian). – aretai

+0

Tôi hy vọng bạn vẫn tìm thấy mã blob này hữu ích :) –

+0

có nó là một giải pháp gọn gàng cũng như cảm ơn bạn. Mặc dù nó không trực tiếp trả lời câu hỏi của tôi (như là ở trên) nhưng 1 upvote bạn có. – aretai

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