Điện thoại thư mục được sắp xếp theo thứ tự abc theo cuối cùng tên. Tại sao? Bởi vì một
được sắp xếp chỉ mục có thể được tìm kiếm một cách nhanh chóng. Ngay cả trong các thư mục điện thoại của một thành phố lớn
một có thể thường nhiều tên một trong một vài giây nữa. Trong một chỉ số phân loại, không ai sẽ
thậm chí cố gắng nhiều tên. Trong một xấp xỉ vòng, chương này dạy bạn làm thế nào để
quay một bộ sưu tập có thứ tự của các nguyên tố thành một bộ sưu tập đặt hàng, tôi.e., làm thế nào để sắp xếp
bộ sưu tập. Tuy nhiên, phân loại có nhiều công dụng khác. Một ví dụ đầu tiên về một
công việc xử lý dữ liệu lớn là việc đánh giá thống kê dữ liệu điều tra dân số. 1500 người
cần bảy năm để tự xử lý điều tra dân số Hoa Kỳ năm 1880. Các kỹ sư của cô-
người đàn ông Hollerith1, những người tham gia trong này đánh giá như là một thống kê, đã dành phần lớn
Mười năm để điều tra tiếp theo phát triển đếm và phân loại máy mecha-
nizing nỗ lực khổng lồ này. Mặc dù điều tra dân số năm 1890 đã phải đánh giá thêm người
và thêm câu hỏi, đánh giá cơ bản là finished vào năm 1891. Hollerith của công ty
tiếp tục đóng một vai trò quan trọng trong sự phát triển của việc xử lý thông tin
ngành công nghiệp; kể từ năm 1924, nó đã được biết đến như là International Business Machines (IBM).
phân loại là quan trọng đối với số liệu thống kê điều tra dân số bởi vì thường muốn tạo thành subcollec-
tions, ví dụ như, tất cả mọi người từ tuổi 20 và 30 và sinh sống trên một trang trại. Hai ứng dụng
của phân loại giải quyết vấn đề. Đầu tiên phân loại tất cả những người theo độ tuổi và tạo thành subcollection
1
picuture ở bên phải cho thấy Herman Hollerith, sinh năm 1860 29 tháng 2, Buffalo NY;
chết ngày 17 tháng 11 năm 1929, Washington DC. Máy nhỏ trong hình ảnh bên trái là
một trong của mình máy phân loại.
100
5 phân loại và lựa chọn
người giữa 20 và 30 năm tuổi. Sau đó sắp xếp subcollection bởi nhà và
giải nén subcollection người sống trên một trang trại
mặc dù chúng tôi có thể tất cả có một khái niệm trực quan của những gì phân loại là về,
Hãy để chúng tôi cung cấp cho một definition chính thức. Đầu vào là một chuỗi s = e1,..., en của n ele-
ments. Mỗi yếu tố ei có một liên kết quan trọng ki = phím (ei). Các phím đến từ
một đặt hàng vũ trụ, tức là, đó là một thứ tự tuyến tính ≤ defined ngày keys2. Để dễ no-
tation, chúng tôi mở rộng quan hệ so sánh với các yếu tố như vậy đó e ≤ e nếu và chỉ if
key(e) ≤ phím (e). Nhiệm vụ là để sản xuất một chuỗi s = e1,..., en như vậy rằng
là một hoán vị của s và như vậy đó e1 ≤ e2 ≤ • • • ≤ en. Quan sát rằng đặt hàng của
yếu tố tương đương là tùy ý.
mặc dù quan hệ so sánh khác nhau cho cùng một kiểu dữ liệu có thể làm cho tinh thần,
quan hệ thường xuyên nhất là để rõ ràng cho con số và các lexicographic
đặt hàng (xem phụ lục A) cho tuples, dây, hoặc trình tự. Bộ lexicographic
cho dây đi kèm trong flavors khác nhau. Chúng tôi có thể tuyên bố như vậy nhỏ và thủ phủ
nhân vật như equivalent hay không và các quy tắc khác nhau để điều trị có dấu ký tự
được sử dụng trong bối cảnh khác nhau.
72 tập thể dục. Cho đơn đặt hàng tuyến tính ≤A của A và ≤B B define một thứ tự tuyến tính trên
một × B.
tập thể dục 73. Define tất cả diện để số phức nơi x ≤ y ngụ ý |x| ≤
|y|.
Phân loại là một công cụ phổ biến của thuật toán; nó thường được sử dụng như một tiền xử lý
bước trong các thuật toán phức tạp hơn. Chúng tôi sẽ cung cấp cho một số ví dụ.
tiền xử lý cho tìm kiếm nhanh: trong phần 2.5 trên tìm kiếm nhị phân, chúng tôi đã đã
thấy rằng con người không chỉ có thể tìm kiếm một thư mục được sắp xếp dễ dàng hơn một phân loại
một. Hơn nữa hỗ trợ thư mục được sắp xếp các hoạt động bổ sung chẳng hạn như finding tất cả
yếu tố trong một phạm vi nhất định. Chúng tôi sẽ thảo luận về tìm kiếm chi tiết hơn trong chương 7.
Hashing là một phương pháp cho việc tìm kiếm có thứ tự bộ.
Nhóm: thường chúng tôi muốn mang lại cho các yếu tố tương đương với nhau để tính chúng, loại bỏ
bản sao, hoặc nếu không xử lý chúng. Một lần nữa, băm là một cách thay thế. Nhưng sắp xếp
có lợi thế kể từ khi chúng ta sẽ thấy khá nhanh chóng xác định các thuật toán cho nó sử dụng
không gian rất nhỏ và rằng mở rộng một cách duyên dáng cho bộ dữ liệu lớn.
xử lý được sắp xếp theo: một số thuật toán trở thành rất đơn giản nếu đầu vào
được xử lý theo thứ tự được sắp xếp. Tập thể dục 74 cho một ví dụ. Ví dụ khác là
Kruskal của thuật toán trong phần 11.3 và một số các thuật toán cho knapsack
vấn đề trong chương 12. Bạn cũng có thể muốn hãy nhớ phân loại khi bạn giải quyết
tập thể dục 154 vào khoảng thời gian đồ thị.
2
một thứ tự tuyến tính là một reflexive, tương lai và yếu quan hệ antisymmetric ≤, tức là, x ≤ x
đối với mọi x, x ≤ y và y ≤ z ngụ ý x ≤ z, và cho bất kỳ hai x và y hoặc x ≤ y hoặc y ≤ x
hoặc cả hai. Hai phím x và y được gọi là tương đương nếu x ≤ y và y ≤ x; chúng ta viết x ≡ y. Nếu
x ≡ y, đúng là một x ≤ y hoặc y ≤ x giữ. Chúng ta viết x < y trong trường hợp trước đây và y < x
trong các trường hợp sau.
5.1 đơn giản Sorters
101
trong phần 5.1 chúng tôi sẽ giới thiệu một số giải thuật sắp xếp đơn giản. Họ có
bậc hai phức tạp, nhưng có vẫn còn hữu ích cho kích thước đầu vào nhỏ. Hơn nữa, chúng tôi sẽ
tìm hiểu một số tối ưu hóa cấp thấp. Phần 5.2 giới thiệu mergesort, một đơn giản
phân chia và chinh phục các thuật toán phân loại mà chạy trong thời gian O (n log n). Phần 5.3 estab-
lishes ràng buộc này là tối ưu cho tất cả so sánh, dựa trên thuật toán, tức là, thuật toán
mà xử lý các yếu tố như là hộp đen mà chỉ có thể được so sánh và di chuyển xung quanh. Các
hay Hoaresort thuật toán được mô tả trong phần 5.4 cũng được dựa trên sự phân chia-và-chinh phục
nguyên tắc và có lẽ thường xuyên nhất được sử dụng phân loại các thuật toán. Hay Hoaresort là
cũng là một ví dụ tốt cho một thuật toán ngẫu nhiên. Ý tưởng đằng sau hay Hoaresort dẫn
để một thuật toán đơn giản cho một vấn đề liên quan đến phân loại. Phần 5.5 giải thích làm thế nào các
k-th nhỏ nhất từ n phần tử có thể được tìm thấy trong thời gian O(n). Phân loại có thể được thực hiện ngay cả
nhanh hơn so với ràng buộc thấp hơn từ phần 5.3 bằng cách nhìn vào các mô hình bit của các phím
như diễn tả trong phần 5,6. Cuối cùng, phần 5.7 generalizes hay Hoaresort và mergesort
để các thuật toán rất tốt để phân loại đầu vào mà không fit vào bên trong bộ nhớ.
tập thể dục 74 (một vấn đề lập lịch trình đơn giản). Một người quản lý khách sạn đã xử lý quảng cáo n-
vance Đặt phòng cho mùa giải tới. Khách sạn của mình có k phòng giống hệt nhau. Cuốn sách-
Ings chứa ngày đến và ngày khởi hành. Ông muốn nhiều hiểu xem có
đủ phòng ở khách sạn để đáp ứng nhu cầu. Thiết kế một thuật toán mà giải quyết
vấn đề này trong thời gian O (n log n). Gợi ý: Xem xét các thiết lập của tất cả arrivals và khởi hành.
sắp xếp các thiết lập và quá trình trong được sắp xếp thứ tự.
tập thể dục 75 (phân loại với vài phím khác nhau). Thiết kế một thuật toán sắp xếp n
Các yếu tố trong O (k đăng nhập k n) dự kiến thời gian nếu không là chỉ k khóa khác nhau xuất hiện
trong các đầu vào. Gợi ý: Kết hợp băm và phân loại.
tập thể dục 76 (kiểm tra). Nó rất dễ dàng để kiểm tra cho dù một thói quen sắp xếp sản xuất
được sắp xếp ra. Nó là ít dễ dàng để kiểm tra xem các đầu ra cũng là một hoán vị của
đầu vào. Nhưng đây là một thuật toán Monte Carlo nhanh chóng và đơn giản đối với số nguyên: (1)
Hiển thị đó e1,... , en là một hoán vị của e1,..., en iff đa thức q(z): =
(z −e1) • • • (z −en) − (z −e1) • • • (z −en) hệt là zero. Ở đây, z là một biến. (2)
cho bất kỳ > 0 cho p là một số nguyên tố với p > tối đa {n /, e1,..., en, e1,..., en}. Bây giờ các
ý tưởng là để đánh giá modp đa thức trên cho một ngẫu nhiên giá trị z ∈ [0..p − 1].
Hiển thị rằng nếu e1,..., en không phải là một hoán vị của e1,..., en thì kết quả của các
đánh giá là zero với xác suất tối đa. Gợi ý: Một đa thức nonzero học
n có tối đa n zeroes.
đang được dịch, vui lòng đợi..
