Sắp xếp lại dữ liệu (bộ chuỗi) để tối ưu hóa cho nén?


12

Có bất kỳ thuật toán nào để sắp xếp lại dữ liệu để tối ưu hóa cho việc nén không? Tôi hiểu điều này là cụ thể cho dữ liệu và thuật toán nén, nhưng có một từ cho chủ đề này? Tôi có thể tìm nghiên cứu ở đâu trong lĩnh vực này?

Cụ thể, tôi có một danh sách json gồm 1,5 triệu chuỗi và tôi muốn sắp xếp lại các chuỗi để nén gzip (cho HTTP) được tối ưu hóa. Sắp xếp các chuỗi khá tốt, nhưng tôi thực sự không biết điều đó có tối ưu không.


1
Tối ưu hóa các chuỗi sắp xếp lại để nén gzip (LZ77 với một cửa sổ trượt nhỏ) nghe có vẻ như là một vấn đề NP-hard. Bạn có thể có thể đưa ra một giảm từ vấn đề siêu dây phổ biến ngắn nhất.
Jouni Sirén 6/03/2015

@ JouniSirén Tôi nghĩ chuỗi con chung dài nhất là cách tiếp cận tốt hơn vì siêu chuỗi chung ngắn nhất giới hạn tôi có phần chung quay lại, phải không? Tôi không bận tâm đến NP-hard miễn là nó có thể điều khiển được (như mất một ngày để chạy trên một máy hiện đại).
Jayen

Câu trả lời:


6

Đây là một bổ sung cho câu trả lời của Navin G lòng.

Do tệp JSON có thể được coi là cấu trúc dữ liệu cây, nên bạn có thể sử dụng biến đổi XBW cho cây, đây là phần mở rộng của biến đổi Burrows-Wheeler cho chuỗi.


1
Cảm ơn vì điều đó. Tôi chỉ có một danh sách / mảng JSON, không phải bất kỳ đối tượng JSON nào, vì vậy tôi không thấy nó có thể được coi là một cây như thế nào. Tôi có thể chuyển đổi các chuỗi thành một trie, nhưng sau đó tôi không thấy điều này liên quan đến biến đổi XBW như thế nào.
Jayen

4

Burrows - Biến đổi Wheeler là một thuật toán nén nổi tiếng hoạt động bằng cách sắp xếp lại các ký tự trong chuỗi được nén.


1
Cảm ơn vì điều đó, nhưng tôi không chắc làm thế nào tôi có thể sử dụng thông tin này. Tôi muốn sắp xếp lại các chuỗi trong danh sách sẽ được nén, nhưng tôi không quan tâm nếu tôi có thể lấy lại thứ tự ban đầu.
Jayen

1

Để cải thiện nén gzip, bạn muốn đóng các chuỗi "tương tự" trong danh sách. Có một số cách để xác định sự tương đồng như vậy; hãy để tôi mô tả một cái hợp lý hoạt động tốt trong thực tế. Hãy nhớ lại rằng kích thước khối của gzip là 64K. Do đó, dữ liệu của bạn sẽ được chia thành các khối 64K byte và mọi khối sẽ được nén độc lập. Cần tối ưu hóa nén, người ta sẽ cần giảm thiểu số lượng k-mers riêng biệt (chuỗi con có kích thước k) trong mỗi khối. Động lực là tất cả các chuỗi con như vậy sẽ được thay thế bằng một định danh.

Mặc dù vấn đề trên là khó về lý thuyết (nó là một biến thể của phân vùng siêu dữ liệu), tồn tại các thuật toán thực tế nhanh. Tôi muốn giới thiệu phân cụm giống như LSH có thể được thực hiện với một lần chuyển qua dữ liệu của bạn. Lưu ý rằng sắp xếp theo thứ tự chữ cái là một cách khác để "gom" các chuỗi tương tự lại với nhau. Tuy nhiên, các thuật toán phân cụm chuyên ngành có thể thực hiện tốt hơn.

Một cách khác là sử dụng zstd , nhanh hơn (i), (ii) có tỷ lệ nén cao hơn và (iii) không có giới hạn về kích thước khối (và do đó, nén các chuỗi không kém bất kể thứ tự đầu vào).


0

Tôi đã thấy một thuật toán một thời gian trước đây có thể có thể hữu ích. Nó sử dụng thuật toán khoảng cách chỉnh sửa để tính khoảng cách giữa mỗi từ. Do đó, nó xây dựng một biểu đồ mà mỗi trọng lượng cạnh là khoảng cách này. Cuối cùng, nó nhận được một đơn đặt hàng chọn một con đường có tổng trọng số thấp nhất. Có lẽ nó có thể cải thiện gzip.


Điều đó không có vẻ dễ hiểu, nhưng nếu ai đó thử nó, xin vui lòng gửi bình luận với kết quả của bạn
Jayen

Tôi sẽ thử kiểm tra nó. Tôi tò mò về vấn đề này. Bên cạnh đó, tại sao bạn nghĩ rằng nó không thể kéo được?
Rafael Ribeiro

theo như tôi biết, khoảng cách chỉnh sửa là O (nm), trong đó n và m là số chữ cái trong cặp chuỗi và bạn phải làm điều này cho mọi cặp chuỗi O (s ^ 2), vì vậy nếu n = m, đó là O (s ^ 2 * n ^ 2) nghe có vẻ khó hiểu đối với tôi trong 1,5 triệu chuỗi.
Jayen

Ồ, tôi không quan tâm đến sự phức tạp đến mức đó vì tôi nghĩ vấn đề của bạn là chỉ giảm kích thước nhị phân. Vì vậy, hoạt động này sẽ xảy ra thường xuyên hơn, phải không?
Rafael Ribeiro

Tôi đã tìm kiếm ở đây và có thể giảm chi phí chỉnh sửa bằng cách sử dụng levenshtein automata
Rafael Ribeiro
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.