Làm thế nào để tìm mô tả tối thiểu cho một mảng?


7

Mảng sau chiếm 10000 khe trong bộ nhớ:

a = [0,1,2,3,4,5,6,7,8,9,10,...,10000]

Nhưng người ta có thể dễ dàng biểu diễn cùng một mảng như:

a = {len:10000, get: λ idx -> idx}

Mà nhỏ gọn hơn nhiều. Tương tự, có một số mảng có thể được biểu diễn nhỏ gọn:

a = {a:1000, get: λ idx -> idx * 2}
Is a description for [0,2,4,6,8,10,...,2000]

a = {a:1000, get λ idx -> idx ^ 2}
Is a description for [0,1,2,4,9,...1000000]

And so on...

Cung cấp rất nhiều mảng có thể được biểu diễn theo những cách ngắn hơn nhiều so với việc lưu trữ từng phần tử trên bộ nhớ, tôi hỏi:

  1. Có một tên cho hiện tượng này?
  2. Có cách nào để tìm đại diện tối thiểu cho một mảng cụ thể không?
  3. Xem xét điều này có lẽ phụ thuộc vào ngôn ngữ mô tả (trong trường hợp này, tôi đã sử dụng ngôn ngữ lập trình tưởng tượng với các hàm, đối tượng và toán tử toán học). Có một ngôn ngữ cụ thể nào là tối ưu để tìm loại mô tả tối thiểu đó cho các đối tượng không?

Câu trả lời:


9

Hiện tượng bạn mô tả là sự phức tạp Kolmogorov . Về cơ bản, nếu bạn sửa chữa một ngôn ngữ lập trình (hoặc, chính thức hơn, một mã hóa của máy Turing) thì mức độ phức tạp Kolmogorov  của một chuỗi  là độ dài của chương trình ngắn nhất mà kết quả đầu ra  khi bắt đầu với không có đầu vào. Hóa ra, theo lý do, không quan trọng bạn sử dụng ngôn ngữ lập trình nào, vì việc sử dụng một ngôn ngữ khác nhau tạo ra sự khác biệt phụ gia không đổi đối với K(s)ssK(s). Nếu bạn muốn xác định độ phức tạp Kolmogorov đối với một số ngôn ngữ whacko, tôi chỉ có thể sử dụng ngôn ngữ đó để viết một trình thông dịch cho một ngôn ngữ hợp lý, vì vậy độ phức tạp của Kolmogorov của một chuỗi đối với ngôn ngữ của bạn không thể tệ hơn sự phức tạp trong ngôn ngữ của tôi cộng với chi phí cố định, liên tục của trình thông dịch.

Giống như tất cả các thuộc tính thú vị của máy Turing , độ phức tạp Kolmogorov của một chuỗi là không thể giải quyết được. Tuy nhiên, điều này không ngăn được nó là một khái niệm hữu ích và đã có một lượng lớn nghiên cứu về chủ đề này.


4

Nếu bạn nhìn vào điều này từ một POV thực tế, bạn có thể gọi nó là nén dữ liệu. Về cơ bản, đây là những gì thuật toán nén dữ liệu thực hiện: Chúng xác định một ngôn ngữ và sau đó cố gắng biểu diễn tập dữ liệu đã cho bằng ngôn ngữ này. Nhưng ngay cả đối với một ngôn ngữ rất đơn giản, rất khó để tìm được đại diện tối ưu trong ngôn ngữ đó. Lấy ví dụ về Deflate , mặc dù rất đơn giản, vẫn có nghiên cứu tích cực về cách áp dụng nó một cách tối ưu.

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.