13

Quicksort thường được mô tả là thuật toán tại chỗ (tại chỗ), mặc dù thực tế là nó yêu cầu không gian ngăn xếp O (log n). Vì vậy, tại chỗ có nghĩa là "yêu cầu ít hơn O (n) không gian bổ sung", hoặc không gian ngăn xếp thường không được tính là độ phức tạp của không gian (nhưng tại sao lại như vậy?), Hoặc là Quicksort thực sự không phải là tại chỗ thuật toán?Quicksort bắt buộc tại chỗ (tại chỗ) hay không?

+1

Câu hỏi này đã được hỏi trước: http://cstheory.stackexchange.com/q/9563/6586. Về cơ bản, nó khá là một mồi lửa với rất nhiều đối số mâu thuẫn. – jpalecek

+2

Lưu ý rằng điều này thực sự phụ thuộc vào cách bạn muốn * tại chỗ * được xác định.NẾU bạn chỉ so sánh các thuật toán sắp xếp, nó sẽ rất nitpicky để không xem xét quicksort để được inplace nhưng nếu bạn có một định nghĩa chính thức hơn trong tâm trí (hy vọng với một lý do) thì có nghĩa là dừng bỏ qua chi tiết O (log n) . – hugomg

+0

Đây chỉ là trường hợp đặc biệt của "O (log n) cũng có thể là một hằng số lớn", phải không? Về nguyên tắc Quicksort sử dụng không gian bổ sung O (log n). Trong thực tế, bạn thường thực hiện nó để lấy một cái gì đó giống như một mảng như một tham số. Mảng trong hầu hết các ngôn ngữ có giới hạn kích thước trên tự nhiên dựa trên loại chiều rộng cố định được sử dụng cho địa chỉ và/hoặc chỉ mục và Quicksort chỉ cần lưu trữ một vài địa chỉ ở mỗi độ sâu 'log n'. Vì vậy, sử dụng ngăn xếp là liên tục bị ràng buộc cho hầu như bất kỳ việc thực hiện Quicksort bạn đã bao giờ thực sự viết và sử dụng, mặc dù nó không phải là cho phiên bản "lý tưởng". –

Trả lời

12

là Quicksort thực sự không phải là thuật toán tại chỗ?

Việc thực hiện tiêu chuẩn của nó là khôngtại chỗ. Đó là một quan niệm sai lầm phổ biến khủng khiếp, nhưng bạn là một lưu ý chính xác do tiêu thụ không gian ngăn xếp, mà quan niệm là sai.

Tôi nói "triển khai chuẩn" của nó vì mọi người đã sửa đổi thuật toán để biến nó thành thuật toán O(1) -space. Dưới đây là một ví dụ: Quicksort without a stack.

Tất nhiên, phù hợp với kiểu cổ điển space-time tradeoff, các phiên bản nhanh như vậy ít hoạt động hơn so với triển khai chuẩn.

5

Wikipedia cung cấp sau definition:

Trong khoa học máy tính, một thuật toán tại chỗ (hoặc trong Latin tại chỗ) là một thuật toán mà biến đổi đầu vào sử dụng một cấu trúc dữ liệu với một lượng nhỏ, liên tục không gian lưu trữ bổ sung.

Theo định nghĩa này, quicksort dựa trên stack điển hình rõ ràng không phải là thuật toán tại chỗ.

Trong thực tế, các bài viết Wikipedia một cách rõ ràng thảo luận này:

Một thuật toán được đôi khi không chính thức gọi là tại chỗ miễn là nó ghi đè đầu vào của nó với sản lượng của nó. Trong thực tế điều này là không đủ (như trường hợp của quicksort chứng minh) cũng không phải là cần thiết; không gian đầu ra có thể không đổi, hoặc thậm chí có thể không được tính, ví dụ nếu đầu ra là một luồng.

Sắp xếp nhanh thường được mô tả như một thuật toán tại chỗ, nhưng không phải là trong thực tế một. Hầu hết các triển khai yêu cầu không gian O (log n) để hỗ trợ phân chia và chinh phục đệ quy của nó.

Tuy nhiên, như được chỉ ra bởi @ Jason trong câu trả lời tuyệt vời của mình, dường như tồn tại các biến thể của quicksort chỉ yêu cầu không gian thêm (1). Bất kỳ alorithms như vậy sẽ được coi là tại chỗ.