Hiểu về nén / mã hóa trong thời gian tuyến tính


8

Tôi đang đọc bài báo NJ Larsson, A. Moffat: Nén từ điển dựa trên từ điển ngoại tuyến , mô tả thuật toán nén mà nếu tôi hiểu chính xác, nó khá giống với mã hóa cặp Byte .

Cho một chuỗi có độ dài n , tôi đang cố gắng hiểu làm thế nào người ta có thể nén nó theo tuyến tính, O ( n ) , thời gian với phương pháp nén này. Làm thế nào chính xác là điều này được thực hiện? Tôi đã đọc bài báo, nhưng tôi vẫn không hiểu làm thế nào họ đạt được thời gian tuyến tính, vì vậy có lẽ tôi sẽ hiểu nó được giải thích theo một cách khác.SnO(n)

Sự nhầm lẫn đầu tiên của tôi xuất hiện ở bước đầu tiên trong thuật toán, nơi chúng tôi tìm thấy cặp phổ biến nhất, ví dụ như trong abcababcabccặp phổ biến nhất absẽ được thay thế bằng một biểu tượng mới, nói XcXXcXc. Tôi không hiểu làm thế nào chúng ta có thể tìm thấy cặp phổ biến nhất đủ nhanh. Cách tiếp cận ngây thơ của tôi sẽ là nhìn vào cặp đầu tiên abvà sau đó đếm số lần xuất hiện, sau đó nhìn vào cặp tiếp theo bcvà đếm số lần xuất hiện, v.v. Tuy nhiên, điều này đã cho chỉ để tìm ra nhiều nhất cặp chung một lần .O(n2)

Tiếp theo, ngay cả khi tôi hiểu cách tìm cặp phổ biến nhất trong thời gian . Vấn đề tiếp theo của tôi là, chúng ta không phải tìm cặp phổ biến nhất lên đến O ( n ) lần sao? Và do đó, điều này sẽ cho tổng thời gian O ( n 2 ) ?O(n)O(n)O(n2)


Bạn nên hỏi một câu hỏi cụ thể hơn. Lặp lại một bài báo bằng các từ khác nhau dường như rộng cho trang web này. Các tác giả mất bạn ở đâu trong bài báo?
adrianN

@adrianN Tôi đã viết thêm một chút về những gì tôi đặc biệt bối rối.
Nỗ lực

Bài báo đưa ra giả định rằng nó sẽ sử dụng bảng băm và tính nó là , trong trường hợp này có thể bị thay thế bởi cây hậu tố là O ( n ) . Tôi chỉ đọc lướt qua văn bản, câu hỏi của bạn vẫn rất khắt khe, nhưng tôi không thực sự thấy lý do tại sao bạn sẽ dành O ( n 2 ) chỉ cho một mục. O(n)O(n)O(n2)
Ác

@Evil Vì vậy, bạn đang nói rằng người ta có thể xây dựng một cây hậu tố trong thời gian Θ ( n ) (BTW, tôi vẫn không hiểu khi nào có thể xây dựng một cây hậu tố trong thời gian tuyến tính và khi nào nó cần O ( n log n ) ). Sau đó, chúng tôi tìm thấy chuỗi con thường xuyên nhất trong cây hậu tố trong thời gian Θ ( n ) . Chính xác? SΘ(n)O(nlogn)Θ(n)
Nỗ lực

Tôi? Không. Nhưng Ukkonen đã nói vài lời về nó. cho bảng chữ cái kích thước không đổi và O ( n log n ) nói chung. Sau đó, chúng ta có thể sắp xếp theo tần số trong O ( n log n ) hoặc thậm chí khai thác các số tự nhiên nhỏ để sắp xếp đếm. Tôi không chắc chắn nếu có điều gì 1 ~ n là Θ ( n ) , xin lỗi không có câu trả lời cho phần đó. O(n)O(nlogn)O(nlogn)Θ(n)
Ác

Câu trả lời:


1

Tôi đã kiểm tra mã, đọc lại bài báo và dường như thuật toán không hoạt động trong theo cách bạn đã mô tả. Các cuộc gọi đệ quy tìm cặp hoạt động trong O ( n log n )O(n)
O(nlogn)chia cho hằng số nếu bạn muốn gói nó đến cùng. Trong thực tế, cấu trúc bên dưới giữ cho con trỏ đến lần xuất hiện đầu tiên của cặp, chia tách hàng đợi của các cặp theo lần xuất hiện để làm cho nó hiệu quả, nhưng vẫn là loglinear. Mặt khác bằng cách phân tích mã được viết bởi Ph.D. sinh viên của tác giả Tôi đã phát hiện ra một số thủ thuật - độ dài của các cặp (tên gốc) được đưa ra dưới dạng tham số (mặc định là 2) và sự lặp lại bị giới hạn bởi tham số, có thể loại bỏ các cuộc gọi tiếp theo (mặc định là khoảng 5 cấp độ), với khả năng thực hiện chỉ một lần vượt qua hoặc đẩy đến cuối cùng. Mã mặc định chạy trong , nhưng sẽ không mang lại nén tối ưu. Ngoài ra còn có chuyển đổi để thích bộ nhớ, thời gian hoặc trung tính.O(n)

Bài báo và mã cho thấy việc sử dụng bảng băm, chỉ chạy trong thời gian không đổi dự kiến, nhưng chức năng được cung cấp hoạt động rất tốt với các ký tự. Ngoài ra mã giới hạn độ dài đầu vào bằng mã hóa cứng không đổi.

Thay đổi hashtable thành cây hậu tố và viết lại một phần của sự tái phát thành các cặp sách kế toán có thể mang lại kết quả tốt hơn - tôi không chắc liệu điều này có thể làm cho nó thành , đây có lẽ là một câu hỏi khác.O(n)

nn2n4n8n162nO(nlogn+n)

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.