2017-01-04 22 views
5

Tôi tự hỏi liệu các thuật toán sắp xếp thư viện chuẩn (ví dụ: std :: sort) có đang sử dụng bộ nhớ heap để phân loại hay không.std :: thuật toán sắp xếp sử dụng bộ nhớ

Có nguồn đáng tin cậy nào để tìm ra loại (đống, ngăn xếp) và bộ nhớ tạm thời được sử dụng bởi thuật toán phân loại hay thuật toán thư viện chuẩn nói chung không?

Nền tảng là tôi xem xét giới thiệu một số thuật toán thư viện chuẩn vào một môi trường nhúng trong đó việc sử dụng bộ nhớ được kiểm soát là rất quan trọng. (đặc biệt là heap không được sử dụng).

Cảm ơn bạn trước!

+3

Tôi không biết nếu có bất kỳ câu trả lời chung hoặc "đảm bảo" này. Nhưng nếu vấn đề là rất quan trọng, sau đó một câu trả lời chung có lẽ là không đủ tốt anyway. Bạn cần một câu trả lời cho việc thực hiện cụ thể cho std :: sort và như vậy trên nền tảng bạn đang sử dụng. Mặc dù vậy, bạn có thể gặp may, vì rất nhiều công cụ tiêu chuẩn (đặc biệt là các mẫu) được thực hiện hoàn toàn trong các tiêu đề C++. Trong trường hợp đó, không có gì thực sự khiến bạn không thể tự mình xem xét bản thân mình để xác minh mọi thứ bạn quan tâm. – TheUndeadFish

+0

Chỉ cần duyệt qua bản nháp tiêu chuẩn gần đây. Tôi thấy không có gì nói rằng 'sắp xếp' không thể sử dụng đống, chỉ yêu cầu về cách' hoán đổi' được hỗ trợ. Đào qua 'hoán đổi', một lần nữa không có chi tiết về việc liệu đống được sử dụng để lưu trữ các thời gian trong quá trình hoán đổi hay không. – user4581301

+0

@ user4581301 Tiêu chuẩn thậm chí không có khái niệm "đống" và "ngăn xếp" để bắt đầu, vì vậy bất kỳ sự bảo đảm nào liên quan đến "nơi" bộ nhớ được cấp phát sẽ khá đáng ngạc nhiên. –

Trả lời

7

Bộ nhớ nào mà thuật toán thư viện chuẩn có thể sử dụng không được ủy quyền theo tiêu chuẩn, do đó, việc triển khai thường có thể thực hiện theo ý muốn. Điều đó bao gồm phân bổ bộ nhớ heap.

Bạn có thể kiểm tra xem thực hiện cụ thể có đảm bảo bạn muốn hay không, nhưng nói chung, bạn không thể kiểm soát cách triển khai thực hiện thuật toán của nó.


Tuy nhiên:

Nền là tôi xem xét để giới thiệu một số thuật toán tiêu chuẩn thư viện vào một môi trường nhúng trong đó một sử dụng bộ nhớ kiểm soát là rất quan trọng. (đặc biệt là heap không được sử dụng).

Việc thực hiện phải chắc chắn rằng các thuật toán của nó làm những gì họ có nghĩa vụ phải làm theo quy định của tiêu chuẩn này. Điều đó có nghĩa là: Nếu bạn có trình biên dịch C++ hỗ trợ môi trường đích của bạn, nó phải làm điều đúng trên nền tảng đích, tuy nhiên nó đạt được điều đó.

Cụ thể: Nếu nền tảng của bạn không có heap, bất kỳ triển khai nào hỗ trợ nó đều không được sử dụng heap.

+0

'std :: sort' * có thể không * trong thực tế sử dụng heap, bởi vì nó * có thể không * ném' bad_alloc' theo như tôi biết? (trừ khi mã của bạn không) (Và có, bệnh lý nó có thể, với một phân bổ đống vô nghĩa sau đó một bắt mà bỏ qua lỗi) – Yakk

+0

Trong trường hợp của std :: sort, thường mã nguồn trong < algorithm > có thể được xem bằng cách sử dụng một trình soạn thảo để xem chính xác những gì nó đang làm. Trong trường hợp của Visual Studio, std :: sort sử dụng kết hợp sắp xếp nhanh, sắp xếp đống (được sử dụng để ngăn chặn O (n^2) trường hợp xấu nhất thời gian phức tạp của sắp xếp nhanh), và sắp xếp chèn, tất cả chúng , do đó không phân bổ bộ nhớ rõ ràng từ heap. std :: stable_sort() là một biến thể của sắp xếp hợp nhất và không phân bổ một bộ đệm tạm thời (1/2 kích thước của mảng ban đầu). Việc thực thi VS sắp xếp nhanh chóng giới hạn sự phức tạp của không gian chồng lên O (log2 (n)). – rcgldr

+0

@Yakk Việc triển khai thư viện chuẩn có thể sử dụng một số phân bổ không ném mà tôi giả sử và việc hệ điều hành chấm dứt không phải là ngoại lệ theo nghĩa tiêu chuẩn. Tuy nhiên, tôi tin rằng điều này nằm trong phần thứ hai của câu trả lời của tôi: 'std :: sort' phải sắp xếp và không ném, * làm thế nào * nó thực hiện điều này không cần phải quan tâm đến người dùng của chúng tôi. –

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