Là một bộ nhớ của tất cả các hoán vị có thể có của một khối kilobyte và con trỏ có thể?


23

Đây là một ý tưởng đủ khó để quấn đầu tôi và tôi sẽ đánh giá rất cao bất kỳ chỉnh sửa / trợ giúp nào để giúp nó dễ đọc hơn cho những người hiểu biết.

Về mặt lý thuyết có thể có một ổ đĩa cứng đã lưu trên nó một bản sao của mọi hoán vị nhị phân có thể có của một kilobyte và sau đó phần còn lại của hệ thống chỉ cần tạo con trỏ đến các vị trí này?

Một hệ thống được thực hiện theo cách như vậy sẽ nhanh hơn bất kỳ thông tin nào được lưu trữ trực tiếp?

Để giải thích một cách khác, hãy nói thay vì có câu:

"Xin chào, tôi là Bob." và "Bánh sandwich đó trông rất ngon."

... được lưu trữ trên ổ cứng, chúng ta sẽ có tất cả các hoán vị của bảng chữ cái và các ký tự khác lên đến một số nào đó (giả sử, 1000 ký tự hoặc hơn), và sau đó lưu trữ các câu của chúng ta như sau:

[Con trỏ # 21381723]


21
Bạn có thể muốn xem xét có bao nhiêu tweet tiếng Anh độc đáo là có thể? Sẽ mất bao lâu để dân số trên thế giới đọc hết chúng? . Bạn đang đối phó với những con số rất lớn.

Bạn có thể thấy thú vị khi git hoạt động, được gọi là nội dung địa chỉ .
JDługosz

5
github.com/philipl/pifs Dựa trên cùng một hiệu trưởng như ý tưởng của bạn, ngoại trừ thay vì có tất cả các hoán vị của một kb, nó sử dụng pi.
Waxen

12
Con trỏ của bạn sẽ phải dài 1 kilobyte. Bạn có thể chọn không lưu trữ các khối không có ý nghĩa bằng tiếng Anh - trong trường hợp đó bạn đã độc lập phát minh lại ý tưởng nén!
user253751

Câu trả lời cơ bản là KHÔNG - không thể do # và kích thước của hoán vị Nhưng bạn nghĩ ứng dụng nào có thể hữu ích nếu có thể ??
thiên thần

Câu trả lời:


91

Có 2 8192 khối 1K khác nhau có thể. Lưu trữ tất cả chúng sẽ mất 2 8202 bit lưu trữ. Vì vũ trụ chỉ chứa khoảng 10 hạt 80 (hoặc ~ 2 266 ), nên đặt cược an toàn rằng không thể lưu trữ tất cả chúng và bạn không phải tự hỏi liệu nó có tiết kiệm thời gian hay không.

Nhưng trên thực tế, có một cách thú vị hơn để trả lời điều này. Bạn đang đề xuất tạo một chỉ mục vào một nhóm hằng số khổng lồ. Nhưng làm thế nào bạn biết chỉ số nào để được bổ nhiệm? Hãy tưởng tượng vì lợi ích của một cuộc tranh cãi mà bạn muốn để lưu trữ chỉ có 1 ký tự khối: a, b, c... Có lẽ chỉ số của bạn sẽ là 0, 1, 2, vv, vì đó là cách bố trí hiệu quả nhất của việc lưu trữ những khối.

Bạn có nhận thấy một cái gì đó về sự sắp xếp? Trên thực tế, chỉ mục của bạn là một đại diện được mã hóa của dữ liệu được lưu trữ ! Nói cách khác, bạn không cần phải tuân thủ tất cả, bạn chỉ cần chuyển đổi chỉ mục thành dữ liệu bạn muốn.

Khi bạn lưu trữ tất cả các giá trị có thể của một cái gì đó trong một bảng, điều này luôn xảy ra: chỉ mục của bạn chỉ trở thành một phiên bản được mã hóa của dữ liệu, do đó việc lưu trữ dữ liệu trở nên không cần thiết ngay từ đầu. Đây là lý do tại sao trong thế giới thực, các chỉ mục chỉ hữu ích cho dữ liệu thưa thớt (ví dụ: tất cả các trang web bạn đã truy cập, không phải tất cả các trang web có thể tồn tại hoặc thậm chí tất cả những tồn tại).


17
Vì vậy, theo một cách nào đó, chúng tôi đã sử dụng hệ thống này - nhưng chúng tôi đang thực hiện nó với việc đánh giá lười biếng các mẫu bit có kích thước kilobyte, cho phép chúng tôi tiết kiệm hàng tấn không gian lưu trữ!
Theodoros Chatzigiannakis

3
Dung lượng lưu trữ giảm đi đôi chút, do sự chồng chéo (1024 số 0 theo sau là 1024 mẫu chứa 1025 mẫu độc đáo) ... giảm nhưng vẫn không thể lớn được. Ngoài ra, khối 1KB là 2 bit <sup> 13 </ sup>, không phải 2 <sup> 10 </ sup>.
Ben Voigt

2
Lưu ý rằng giới hạn 10 ^ 80 trên các hạt trong vũ trụ không trực tiếp có nghĩa là bạn không thể lưu trữ nhiều hơn, chẳng hạn, 10 ^ 80 bit trong vũ trụ - bởi vì với mỗi hạt bạn có khả năng có thể lưu trữ nhiều hơn một chút thông tin ( dựa trên vị trí của nó trong vũ trụ, và có thể là vận tốc của nó, v.v.). Điều đó không có nghĩa là bạn có thể lưu trữ mỗi khối 1K - số lượng hạt vượt quá số lượng hạt bởi một yếu tố lớn đáng kinh ngạc, vì vậy đây vẫn là một đặt cược rất an toàn mà bạn không thể lưu trữ tất cả!
psmears

2
@Neil Nếu bạn có một hệ thống mã hóa cho phép bạn lưu trữ 10 ^ 80 bằng cách mã hóa thành "10 ^ 80" thì làm thế nào để bạn lưu trữ "10 ^ 80"? Nếu một số phần dữ liệu được mã hóa ngắn hơn dữ liệu thực tế, phần khác phải được mã hóa lâu hơn. Hoặc nếu tất cả các phần dữ liệu của bạn là số, thì bạn đang lưu trữ từng chữ số thập phân dưới dạng một byte.
Random832

3
Với các chuỗi de Bruijn, 2 ^ 1024 bit sẽ đủ.
gronostaj

20

Như những người khác đã chỉ ra, bạn có 2 ^ 8192 khả năng cho khối 1k. Điều này có nghĩa là bạn sẽ cần 8192 bit để mã hóa địa chỉ của một khối nếu tất cả các địa chỉ khối được mã hóa với cùng một lượng bit, vì vậy địa chỉ của bạn sẽ dài 1k. Bạn sẽ không đạt được bất cứ điều gì ngoại trừ việc thêm một lớp gián tiếp để bạn sẽ không đạt được bất kỳ hiệu suất nào.

Nếu bạn muốn có địa chỉ ngắn hơn, bạn sẽ phải mã hóa một số khối có địa chỉ ngắn và một số có địa chỉ dài hơn và làm cho địa chỉ dài không xuất hiện thường xuyên, và giờ bạn chỉ đơn giản là nén dữ liệu (có thể với một cái gì đó như một mã Huffman ). Điều đó sẽ đòi hỏi kiến ​​thức về dữ liệu bạn đang lưu trữ trước khi lưu trữ hoặc thay đổi thường xuyên trong mã hóa. Nó cũng có thể kém hiệu quả hơn các thuật toán nén khác sử dụng các khối có độ dài khác nhau.


1

Có hai vấn đề với điều đó.

Đầu tiên, "tất cả các hoán vị nhị phân có thể có của một kilobyte" là một lượng dữ liệu khổng lồ . 1024 byte * 8 bit mỗi byte = 8192 bit trong một kilobyte. Tất cả các hoán vị có thể sẽ là 2 ^ 8192. Đó là khoảng 1.09e+2466kilobyte! (Đối với mục đích so sánh, ổ đĩa 1 TB là 1e09kilobyte.)

Thứ hai, ngay cả khi bạn đã có một bảng khổng lồ như vậy và bạn đã lập chỉ mục cho nó bằng các con trỏ, bạn sẽ làm gì nếu bạn muốn tham chiếu một số dữ liệu nhỏ hơn chính xác 1 KB?


2
Lưu trữ tất cả các khối nhỏ hơn 1 KB ngoài ra sẽ không tốn nhiều dung lượng hơn. Giả sử chỉ có các khối có kích thước byte, kích thước của các khối nhỏ hơn chỉ bằng 1/256 kích thước của các khối 1 KB. Giả sử các khối có kích thước bit, bạn thêm kích thước tương tự một lần nữa.
Paŭlo Ebermann

-1

Như các áp phích khác đã chỉ ra, tại một số điểm, kích thước của con trỏ cần thiết để lập chỉ mục vào danh sách tất cả các giá trị có thể làm vô hiệu hóa lợi ích của bạn.

Tuy nhiên, một số ngôn ngữ sử dụng phiên bản giới hạn của những gì bạn đề xuất để tối ưu hóa việc sử dụng bộ nhớ. Python sử dụng chuỗi 'interning' để giảm số lượng chuỗi trùng lặp trong bộ nhớ. Bạn có thể tìm thêm thông tin bằng cách tìm kiếm 'chuỗi python intern'.


1
OP đang hỏi về một tập hợp dày đặc, chứa mọi hoán vị. Con trỏ chỉ hữu ích cho dữ liệu thưa thớt, trong đó các bit cần thiết để giữ một con trỏ nhỏ hơn các bit được trỏ đến. Thực tập có thể làm cho không gian thưa thớt hơn nếu có sự trùng lặp, vì vậy có một kết nối ở đó, nhưng câu trả lời của bạn không thực sự diễn đạt tốt.
Peter Cordes
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.