Độ phức tạp của thời gian bổ sung


11

Wikipedia liệt kê độ phức tạp thời gian của phép cộng là , trong đó là số bit.nnn

Đây có phải là một lý thuyết cứng nhắc thấp hơn ràng buộc? Hay đây chỉ là sự phức tạp của thuật toán được biết đến nhanh nhất hiện nay. Tôi muốn biết, bởi vì sự phức tạp của phép cộng, nhấn mạnh tất cả các phép toán số học khác và tất cả các thuật toán sử dụng chúng.

Về mặt lý thuyết là không thể, để có được một thuật toán bổ sung chạy trong ? Hoặc chúng ta bị ràng buộc với độ phức tạp tuyến tính để bổ sung.o(n)

Câu trả lời:


17

Nếu thuật toán của bạn sử dụng không có triệu chứng ít hơn thời gian, thì nó không có đủ thời gian để đọc tất cả các chữ số của các số mà nó đang thêm. Bạn phải tưởng tượng bạn đang xử lý số lượng rất lớn (ví dụ được lưu trữ trong các tệp văn bản 8 MB). Tất nhiên, việc bổ sung có thể được thực hiện rất nhanh so với giá trị của các con số; nó chạy trong thời gian , nếu là giá trị của tổng.nNO(log(N))N

Điều này không có nghĩa là bạn có thể tăng tốc mọi thứ lên một chút; nếu bộ xử lý của bạn xử lý 32 bit mỗi thao tác, thì bạn sử dụng thời gian, nhưng đó vẫn là chứ không phải . O(n)o(n)n32O(n)o(n)


Là đọc tất cả các dữ liệu về lý thuyết cần thiết. Ngoài hai số và bất kỳ . Tính , có thể được thực hiện trong thao tác , thông qua dịch chuyển. Áp dụng . Xem xét điều đó. Có thể bạn không tìm thấy ước tính nhanh hơn cho tổng, hãy tinh chỉnh ước tính đó cho đến khi đúng. Trong ít hơn hoạt động? b , a : a b , a + b 2 a 2 a O ( 1 ) 0 nab,a:ab,a+b2a2aO(1)0n
Tobi Alafin

3
Vâng, đó là một sự cần thiết về mặt lý thuyết, bởi vì: mỗi bit của đầu vào được sử dụng không tầm thường trong đầu ra , trong đó bởi không tầm thường tôi có nghĩa là nó không phải là chức năng nhận dạng. Trong ví dụ của bạn , việc có thể được tính trong thời gian hay không phụ thuộc vào mô hình tính toán: nếu nối thêm là hoạt động không đổi thời gian, thì có. Nếu bạn có quyền truy cập RAM, bạn cần thời gian để viết địa chỉ của chút nếu bạn đã biết chiều dài của , hoặc thời gian nếu bạn phải đọc tất cả để tìm hiểu. Trong ví dụ này , nhiều bit đầu ra là các hàm tầm thường của các bit đầu vào.2 a O ( 1 ) 0 O ( log ( n ) ) a O ( n ) a 2 a2a2aO(1)0O(log(n))aO(n)a2a
Liêuwe Vinkhuijzen

Tôi có một thuật toán tìm độ dài của trong . Nó sử dụng tìm kiếm nhị phân. O ( log n )aO(logn)
Tobi Alafin

3
@TobiAlafin Nếu mô hình của bạn hỗ trợ địa chỉ RAM, thì tìm kiếm nhị phân của bạn chạy trong các bước , chính xác. Trên Turing Machine và trong tệp văn bản không được tải vào bộ nhớ chính, việc này sẽ mất thời gian . Trong cả hai trường hợp, để trả lời câu hỏi của bạn, có hoặc không có địa chỉ RAM để tăng tốc tra cứu, thuật toán của bạn sẽ phải xem xét tất cả các bit của đầu vào để tính . Giả sử rằng nó đã không và trên đầu vào bit, nó không kiểm tra bit thứ . Sau đó tôi có thể lật bit đó, và nó sẽ trả lời sai. O ( n ) a + b 42 6O(logn)O(n)a+b426
Liêuwe Vinkhuijzen

1
Về cơ bản, tất cả các hoạt động là , vì lý do này. Ngoại lệ duy nhất là nếu bạn đang xử lý cấu trúc dữ liệu theo thứ tự nào đó: ví dụ: bạn không phải truy cập toàn bộ BST để kiểm tra xem nó có chứa một giá trị nhất định hay không, nhưng điều này chỉ đúng vì các bất biến đi kèm với BST. Ω(n)
Bakuriu

7

Để phân tích độ phức tạp có ý nghĩa chính thức nào cả, bạn phải chỉ định một mô hình tính toán chính thức trong đó thuật toán trong đối tượng đang được thực thi, hoặc, ít nhất, một mô hình chi phí , chỉ định các hoạt động cơ bản là gì và chi phí của họ.

Trong hầu hết các bối cảnh, các phép toán số học được giả sử mất thời gian. Điều này thường hợp lý, vì chúng ta quan tâm đến độ phức tạp thuật toán không quan tâm đến các con số liên quan. Đây được gọi là mô hình chi phí thống nhất .Θ(1)

Nếu các số có thể tăng không giới hạn hoặc chúng tôi quan tâm đến việc tự phân tích các hoạt động, các phép toán số học được thực hiện để có chi phí , tỷ lệ thuận với kích thước của đầu vào.Θ(|x|)

Bây giờ, các hoạt động có thể có một chi phí ít hơn thế không? Có thể, tuy nhiên, bạn sẽ phải chính thức xác định một mô hình tính toán trong đó nó có thể xảy ra.


1
Như một ví dụ bổ sung, một bộ cộng về phía trước mang theo, theo các giả định đơn giản hóa phù hợp, thời gian để tính tổng của hai số -bit. nΘ(logn)n
Fabio Somenzi

3

Đầu vào để thêm là hai số tùy ý . Vì chúng là tùy ý, bạn phải đọc từng bit và do đó thuật toán là .Ω(n)

Hãy tưởng tượng thuật toán của bạn thành công thêm 1010100110 và 0010010110 mà không cần đọc từng bit. Để thuật toán của bạn có thể thêm các đầu vào tùy ý , tôi có thể lật ngẫu nhiên bất kỳ một trong các bit này và thuật toán vẫn đưa ra một bổ sung đúng (nhưng khác). Nhưng nếu thuật toán của bạn không đọc từng bit, làm sao nó có thể nói rằng đầu vào bị lật khác với đầu vào ban đầu?


Những gì tôi đã nghĩ nếu là một phương tiện để tính gần đúng tổng số trong ít hơn hoạt động. n
Tobi Alafin

Chắc chắn rồi. Bạn chỉ cần xác định "gần đúng" nghĩa là gì trong thuật toán của bạn. Tùy thuộc vào định nghĩa đó, việc thêm hai bit quan trọng nhất có thể là một tổng gần đúng, có thể được thực hiện trong thời gian o (n) . Khi bạn đề cập đến thuật toán "bổ sung", tôi nghĩ tất cả chúng ta đều hiểu điều đó có nghĩa là câu trả lời phải chính xác.
murrdpirate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.