Mã Huffman VS Mã Huucker Tucker


7

Trước khi tôi hỏi câu hỏi của mình, hãy để tôi bắt đầu với sự hiểu biết của tôi về các định nghĩa, để ngăn chặn bản thân với sự nhầm lẫn hơn nữa, cũng như đưa ra một số nền tảng.

Mã Huffman là mã nhị phân được tạo ra từ cây nhị phân, được xây dựng bởi Thuật toán của Huffman.
Mã Huucker Tucker là mã nhị phân được tạo ra từ cây tìm kiếm theo bảng chữ cái.
Theo Wikipedia (xem đoạn văn về cây nhị phân chữ cái tối ưu (mã hóa Hu, Tucker)):

Trong bài toán mã hóa Huffman tiêu chuẩn, người ta cho rằng bất kỳ từ mã nào cũng có thể tương ứng với bất kỳ ký hiệu đầu vào nào. Trong phiên bản chữ cái, thứ tự chữ cái của đầu vào và đầu ra phải giống hệt nhau. Do đó, ví dụ, không thể được gán mã , nhưng thay vào đó nên được chỉ định hoặc Một= ={một,b,c}H(Một,C)= ={00,1,01}H(Một,C)= ={00,01,1}H(Một,C)= ={0,10,11}. Đây còn được gọi là vấn đề HuTHER Tucker, sau TC Hu và Alan Tucker, tác giả của bài báo trình bày giải pháp tuyến tính đầu tiên cho vấn đề bảng chữ cái nhị phân tối ưu này, có một số điểm tương đồng với thuật toán Huffman, nhưng không phải là một biến thể của điều này thuật toán. Những cây nhị phân chữ cái tối ưu này thường được sử dụng làm cây tìm kiếm nhị phân.

Câu hỏi của tôi là, những ứng dụng của những cây như vậy là gì? (cây nhị phân chữ cái)
Tôi đã cố gắng tìm kiếm trực tuyến, nhưng không thể tìm thấy câu trả lời thỏa mãn.
Tôi cũng đã đọc phần giới thiệu trong bài viết của Hu & Tucker về chủ đề: Cây tìm kiếm máy tính tối ưu và Mã chữ cái có độ dài thay đổi , nhưng tôi không thể tìm ra chính xác việc sử dụng cây như vậy từ ví dụ của họ.

Tôi có thể hiểu rất rõ sự cần thiết của một mã tiền tố nhỏ gọn, tối ưu, được tạo ra bởi một cây tối ưu (ví dụ Mã Huffman); cái này có thể được sử dụng để nén, nhưng việc sử dụng cây nhị phân theo thứ tự chữ cái là gì?


1
Nhưng không phải là tốt, nếu mã theo thứ tự như các chuỗi ban đầu? (Và được xem như là cây cho một tập hợp các từ, nó vừa là cây tris vừa là cây tìm kiếm nhị phân). Đối với "tại sao chúng ta muốn chúng là tối ưu", điều đó không rõ ràng?
Hendrik

@HendrikJan, vâng. thật. Rõ ràng là tại sao chúng ta muốn chúng tối ưu. Đó là một lựa chọn không tốt trong lời nói của tôi, mặc dù câu hỏi chính vẫn là: Ứng dụng nào có mã như vậy?
so.very.tired

Câu trả lời:


6

Để tôi cho bạn một ví dụ thực tế, nó rất giống với những gì tôi đã viết một lần.

Giả sử bạn đang thực hiện một hệ thống danh mục thư viện. Một danh mục thư viện về mặt khái niệm là một bộ sưu tập các tài liệu (có thể ở định dạng MARC ). Người dùng hệ thống này có thể nhập truy vấn, như trong bất kỳ công cụ tìm kiếm nào và nhận lại một bộ tài liệu. Người dùng muốn có thể sắp xếp kết quả được đặt theo một số trường (ví dụ: tiêu đề hoặc tác giả) và hiển thị kết quả được đặt một màn hình tại một thời điểm.

Sắp xếp là một vấn đề được hiểu rõ. Tuy nhiên, giả sử đây là một thư viện lớn và tìm kiếm trả về 100.000 tài liệu liên quan. Rõ ràng người dùng sẽ không xem qua tất cả chúng! Trên thực tế, người dùng chỉ có thể nhìn vào một vài màn hình kết quả đầu tiên (giả sử, 50 - 100 tài liệu) và nhận ra rằng truy vấn của họ quá rộng và vì vậy hãy tinh chỉnh nó thêm nữa.

Hơn nữa, truy cập khóa sắp xếp cho một tài liệu đòi hỏi phải phân tích tài liệu. Đúng, bạn có thể trích xuất các khóa sắp xếp có thể thành một dạng mà bạn không yêu cầu phân tích MARC (hoặc, thậm chí tệ hơn, SGML / XML), mặc dù điều đó sẽ trùng lặp dữ liệu. Và bên cạnh đó, đây là những chuỗi chúng ta đang nói đến. Chúng có chiều dài thay đổi, điều này làm cho việc quản lý bộ nhớ và ổ đĩa trở nên khó khăn.

Vì vậy, bạn có thể thử một định dạng kích thước cố định. Bạn có thể lấy các ký tự K đầu tiên từ mọi tiêu đề cho một số K được xác định trước và lưu trữ nó trong một mảng trên đĩa, được lập chỉ mục theo số tài liệu. Sau đó, trước tiên bạn có thể sắp xếp các tài liệu theo các tiền tố chuỗi đó (nghĩa là một thứ gì đó như sắp xếp xô / cơ số) và bất kỳ tài liệu nào nằm trong cùng một nhóm sau đó có thể được sắp xếp bằng cách trích xuất khóa sắp xếp "thực" từ tài liệu.

Điều tuyệt vời ở đây là bạn không cần phải sắp xếp đầy đủ tập kết quả. Vì người dùng đang phân trang thông qua tập hợp, bạn chỉ phải sắp xếp hoàn toàn một vài màn hình đầu tiên và chỉ giữ lại đủ thông tin xô để sắp xếp những người khác nếu người dùng quyết định chuyển qua trang đó.

Vì vậy, đó là một cải tiến, nhưng làm thế nào để bạn thiết lập K? Rất nhiều tiêu đề bắt đầu bằng các chữ cái "The", và đó là sử dụng 32 bit thông tin cho sức mạnh phân biệt đối xử rất ít. Trên thực tế, có lẽ bạn sẽ ngạc nhiên khi có bao nhiêu tạp chí định kỳ được gọi là "Tạp chí quốc tế của X", hoặc bản tóm tắt tương tự, và một số tìm kiếm có thể sẽ trả về rất nhiều tài liệu có tiêu đề tương tự như vậy.

Một giải pháp có thể là sử dụng mã bảo quản đơn hàng. Nén tất cả các tiêu đề bằng mã đó và lưu trữ 64 bit đầu tiên (hoặc một số lượng cố định khác) của tiêu đề được nén trong một mảng trên đĩa. Điều này có khá nhiều lợi thế thực tế: các phần của tiêu đề có rất ít khả năng phân biệt đối xử có được các từ mã rất ngắn (vì vậy bạn không lãng phí không gian vào chi tiết không liên quan), bạn có thể sắp xếp theo nó vì nó giữ trật tự và các phím có độ dài cố định (vì vậy chúng dễ dàng quản lý một cách hiệu quả).

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.