Table of Contents
Giới thiệu về sắp xếp đếm
Sắp xếp đếm là một thuật toán không tương ứng với nhau mà vượt trội khi sắp xếp các số nguyên trên phạm vi nhỏ, được biết. Không giống các loại dựa trên so sánh như Nhanh hay trộn lẫn, mà phụ thuộc vào các yếu tố tương ứng, tính sắp xếp theo thứ tự sắp xếp bằng cách đếm tần số của mỗi giá trị riêng biệt. Cách tiếp cận này tạo ra độ phức tạp thời gian tuyến tính theo điều kiện thuận lợi, làm cho nó đi đến sự lựa chọn cho nhiều ứng dụng hiệu suất độ nghiêm trọng nơi mà miền nhập có hạn.
Thuật toán này được Harold H. Sward mô tả lần đầu tiên vào năm 1954 và vẫn còn là một kỹ thuật cơ bản trong khoa học máy tính. Nó đơn giản và hiệu quả làm cho nó lý tưởng cho các công việc như tuổi sinh viên, điểm số, hoặc bất kỳ số nguyên với một sự lan truyền khiêm tốn. Bằng cách áp dụng tỷ lệ lưu trữ phụ theo phạm vi giá trị, Counting tránh O(n log n) giới hạn dưới của phân loại, đạt được O(n + k) thời gian mà k là khoảng đầu vào.
Làm thế nào tính việc sắp xếp?
Cơ chế chính của bộ đếm được đơn giản: nó đếm bao nhiêu lần mỗi giá trị xuất hiện trong một dãy nhập, sau đó sử dụng đó đếm để tính toán vị trí cuối cùng của mỗi yếu tố. Quá trình này bao gồm ba giai đoạn riêng biệt:
- [FLT: 0] Đang kiểm tra: [FLT: 1] tạo một dãy số kích cỡ k (tải giá trị nhập), khởi tạo thành số không. Nó chạy qua các dãy nhập và tăng số cho mỗi giá trị.
- [FLT: 0] Các tiền tố tính toán: [FLT: 1] Biến dãy số thành một dãy tổng số đầu, nơi mỗi phần tử tại chỉ số tôi giữ số tích lũy của các phần tử nhỏ hơn hoặc bằng i. Bước này xác định vị trí đầu cho mỗi giá trị riêng biệt trong kết xuất sắp xếp.
- Các yếu tố nạp: Travers dãy nhập từ phải sang trái (để ổn định), hãy dùng danh sách đếm để tìm chỉ mục đúng trong danh sách kết xuất, đặt các yếu tố ở đó, và giảm số đếm. Kết quả cuối cùng là một bản sao của dữ liệu nhập.
Thuật toán trả về một dãy sắp xếp mới, để lại một điều không thay đổi gốc. Một biến thể được gọi là [FLT: 0] trong vị trí « tồn tại nhưng hiếm khi được dùng vì nó thỏa hiệp sự ổn định hoặc hiệu suất không gian.
Gương mẫu bước đi của người khác
Hãy xem xét việc sắp xếp lại các dãy [4, 2, 2, 8, 3, 3,] nơi giá trị bao gồm từ 0 đến 8.
- : Đếm dãy số 9 (0–8) 0,1,2,2, 1, 0, 1 lần. (Index 1 lần, chỉ số 2 lần, chỉ số 3 lần, 4 lần một lần.)
- Prefix sutes: Biến đổi để tích lũy [0,1, 5, 5, 6, 6, 6, 6, 6, 7,7]. Bây giờ mỗi giá trị cho chúng ta biết vị trí bắt đầu cho con số đó trong sắp xếp kết xuất.
- [FLT: 0] Ra khỏi: mảng gốc từ đầu: yếu tố đầu tiên đọc là 1 phần tử = số đếm [1] - 1 = 0 [0] đầu ra [FLT = 1], số đếm [1] [1] đến 0 tiếp theo là 3 vị trí [3] - 1 = 4] kết xuất [4], đếm [3] = 4, tiếp tục cho đến khi tất cả các phần tử được đặt. Kết quả cuối cùng: 1, 2, 2, 3, 3, 8, 8.
Ví dụ này cho thấy cách mà việc đếm loại tránh hoàn toàn so sánh, chỉ phụ thuộc vào các hoạt động số học.
Tính toán phức tạp
Độ phức tạp thời gian
- [FLT: 0]Best, vừa trung bình, và trường hợp xấu nhất: [FLT: 1] O(n + k), nơi n là số nguyên tố và k là phạm vi của giá trị nhập. Khi k nhỏ tương quan với n, thuật toán chạy trong thời gian tuyến tính.
- Máy tính đáp ứng để so sánh: [FLT: 1] Nhanh và trộn với O(n log n) độ phức tạp trung bình. Đối với n = 106 và k = 1000, sắp xếp đếm (FLT: 1,00 1000 lần) nhanh hơn một kiểu O(n log n) điển hình.
Độ phức tạp không gian
- Bộ nhớ này có thể bị cấm nếu k lớn (v. g., sắp xếp 32- bit số nguyên nơi k = 2.
- biến thể s yêu cầu một loạt kết xuất phụ của kích thước n; trong một nơi biến thể hi sinh ổn định hoặc sử dụng thao tác phụ phức tạp chỉ mục.
Khi nào nên dùng sắp xếp đếm
Sắp xếp đếm là hữu hiệu nhất trong những điều kiện sau:
- Đầu vào gồm các số nguyên (hoặc dữ liệu có thể được vẽ đến một phạm vi số nguyên nhỏ, chẳng hạn như ký tự hoặc phân loại riêng lẻ).
- Phạm vi k không lớn hơn n. Một quy tắc phổ biến là k K O(n).
- Bộ nhớ không bị hạn chế nghiêm trọng, vì danh sách các danh sách và bộ đệm xuất cần thêm chỗ.
- Cần thiết khả năng ổn định (v. d. sắp xếp theo nhiều phím). Việc thực hiện chuẩn ổn định khi đặt các yếu tố từ phải sang trái.
Cách sử dụng hiệu quả các trường hợp bao gồm phân loại điểm số (0–100), độ tuổi (0–20), phân loại sản phẩm (lên đến vài trăm SKUs), hoặc như một subroutine trong Sắp xếp ).
Giới hạn và quan tâm
Mặc dù tốc độ của nó, sắp xếp đếm có những nhược điểm giới hạn sự hài hòa của nó:
- Chỉ integer:) Nó không thể trực tiếp sắp xếp số điểm nổi hoặc chuỗi, trừ khi chuyển đổi thành một tập số nguyên tương ứng.
- Phạm vi:) Nếu k lùn n ví dụ, sắp xếp 100 con số với giá trị giữa 1 và 107- mảng đếm sẽ tiêu thụ bộ nhớ khổng lồ trong khi phân loại chỉ một vài yếu tố.
- Sắp xếp đếm [FLT: 1) luôn đòi hỏi quét toàn bộ dữ liệu đầu vào và xây dựng danh sách đếm, ngay cả khi dữ liệu đã được sắp xếp hoặc sắp xếp.
- Giá trị tính Sắp xếp đếm chuẩn giả định các số nguyên không âm tính. Để xử lý các giá trị âm, bạn có thể dịch chuyển giá trị bằng cách trừ tối thiểu (làm cho phạm vi 0 mũ tối đa – phút).
Những giới hạn này có nghĩa là sắp xếp đếm là một công cụ đặc biệt, không phải là một thay thế phổ quát cho các thuật toán tổng quát.
So sánh với thuật toán sắp xếp liên quan
Đang đếm chuỗi v. Radix
Radix Sắp xếp ý tưởng bằng cách sắp xếp các chữ số từ ít quan trọng nhất đến quan trọng nhất, sử dụng một loại ổn định (thường là sắp xếp số) tại mỗi số. Trong khi Bộ đếm sắp xếp hoạt động trên một khoảng đầy đủ k, bộ xếp Radix thực hiện nhiều lần vượt qua phạm vi số nhỏ hơn (v. d., cơ số 2. 246), giảm khả năng sử dụng bộ nhớ cho chữ số lớn k. Lấy thí dụ, sắp xếp các số nguyên 32- bit với « Đếm số nguyên » cần thiết một dãy số mục số, trong khi bộ trình bày với 8- bit (t bit) cần thiết chỉ có 25 bit mỗi chữ số và bốn lần đi qua.
Sắp xếp đếm và xếp chuỗi
Bộ đồng bộ sắp xếp phân phối các yếu tố thành một số xô và sắp xếp mỗi xô (thường có kiểu chèn). Nhóm đếm có thể được xem như một trường hợp đặc biệt của Bucket Sort nơi mỗi xô tương ứng với một giá trị riêng lẻ. Bucket
Loại đếm được
Độ bền vững là quan trọng khi sắp xếp bằng một phím, trong khi giữ thứ tự tương đối của các yếu tố tương đương từ một phím khác. Thuật toán sắp xếp đếm chuẩn thì thường ổn định khi vòng lặp định kết xuất đi qua dữ liệu từ phải sang trái. Dưới đây là một đường nét văn bản của biến thể ổn định:
- Tính toán dãy số như được miêu tả.
- Chuyển đổi sang tiền tố tổng (định vị của mỗi giá trị trong kết xuất đã sắp xếp).
- Hãy lặp lại dãy nhập theo thứ tự ngược lại. đặt nó tại vị trí được chỉ ra bằng số đếm của nó, sau đó giảm số lượng đó.
Bởi vì chúng ta xử lý các yếu tố từ cuối, lần xuất hiện cuối cùng của một giá trị được đưa vào chỉ số có thể cao nhất, bảo tồn trật tự tương đối. phiên bản ổn định này là thiết yếu cho Radix Sắp xếp để hoạt động đúng trên mỗi số.
Ứng dụng thực tế
- Hệ thống chấm điểm học tập: ) Sắp xếp hàng trăm điểm thi (w 0–100) trong thời gian O(n).
- Các định dạng sinh học: ) Sắp xếp các số nguyên đọc hoặc tần số ADN k k k k kkmer khi kích thước bảng chữ cái nhỏ (A, C, G, T).
- Bảo trì chỉ mục cơ sở dữ liệu:) Sắp xếp các số nguyên độc nhất vô nhị trong phạm vi đủ nhỏ để vừa khít bộ nhớ.
- khi xây dựng các bảng tìm kiếm ).
- Đang sử dụng phím thứ hai:) trong bộ trình bày Radix, là con ngựa làm việc hiệu quả để sắp xếp trong nhiều thư viện và ngôn ngữ (v. d. g. g., chạy ET sử dụng một hỗn hợp các thuật toán bao gồm cả « đếm chuỗi nhỏ ».
Để biết thêm về lý thuyết và biến thể, hãy tham khảo ý kiến về những tham khảo ý kiến như [FLT: 0] WA: Sắp xếp đếm và ) [FLT:] geeks forGeeks: Sắp xếp . So sánh thực tế với các thuật toán khác có thể tìm thấy trong
Đang làm báp têm sắp xếp đếm trong phạm vi lớn
Khi k lớn nhưng n cũng lớn, tinh khiết sắp xếp đếm trở thành bộ nhớ tăng cường. Một vài tối ưu hoá tồn tại:
- Độ dốc [FLT: 1] Dùng bản đồ hash thay vì một dãy đối xứng khi phạm vi giá trị được dùng lớn nhưng số giá trị riêng lẻ là nhỏ. Việc này trao đổi liên tục- phụ lục cho việc dùng chi tiết trên đầu nhưng giảm số lượng bộ nhớ tiêu dùng.
- phương pháp truy cập Hybrid Sắp xếp đếm với các thuật toán khác. Ví dụ, nếu phạm vi vượt quá 106, hãy dùng Radix Sort với một cơ sở giữ cho phạm vi số được giữ nhỏ.
- Ở nơi thay thế [FLT:], một số biến thể ) một số tối ưu hóa giảm thêm chỗ cho O(k) mà không cần một dãy kết xuất, nhưng thường chúng hy sinh sự ổn định hoặc đòi hỏi chu kỳ để xác định vị trí.
Kết luận
Tính