หน่วยความจำของการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดของกิโลไบต์บล็อกและพอยน์เตอร์เป็นไปได้หรือไม่?


23

นี่เป็นความคิดที่ยากพอที่จะคลุมหัวฉันและฉันจะขอบคุณการแก้ไขใด ๆ / ช่วยให้อ่านได้ง่ายขึ้นสำหรับผู้ที่รู้

ในทางทฤษฎีแล้วมันเป็นไปได้หรือไม่ที่จะมีฮาร์ดไดรฟ์ที่บันทึกไว้บนสำเนาหนึ่งชุดของการเปลี่ยนแปลงไบนารี่ที่เป็นไปได้ทั้งหมดหนึ่งกิโลไบท์แล้วมีส่วนที่เหลือของระบบเพียงแค่สร้างพอยน์เตอร์ไปยังตำแหน่งเหล่านี้

ระบบทำเช่นนี้จะเร็วกว่าแค่เก็บข้อมูลโดยตรงหรือไม่

หากต้องการอธิบายอีกวิธีหนึ่งให้พูดแทนการใช้ประโยค:

"สวัสดีฉันชื่อบ็อบ" และ "แซนด์วิชนั้นดูอร่อย"

... เก็บไว้ในฮาร์ดไดรฟ์เราจะมีการเรียงลำดับของตัวอักษรและอักขระอื่น ๆ ไม่เกินจำนวน (พูด 1,000 ตัวอักษรหรือมากกว่านั้น) จากนั้นเก็บประโยคของเราตามที่ต้องการ:

[ตัวชี้ # 21381723]



คุณอาจพบว่ามันน่าสนใจในการใช้งานคอมไพล์หรือเรียกว่าเนื้อหาที่สามารถจัดการได้
JDługosz

5
github.com/philipl/pifsใช้หลักการเดียวกันกับที่เป็นความคิดของคุณยกเว้นแทนที่จะมีการเรียงสับเปลี่ยนทั้งหมดของ kb จะใช้ pi
Waxen

12
ตัวชี้ของคุณจะต้องมีความยาว 1 กิโลกรัม คุณสามารถเลือกที่จะไม่เก็บบล็อกที่ไม่สมเหตุสมผลเป็นภาษาอังกฤษซึ่งในกรณีนี้คุณได้สร้างแนวคิดใหม่ในการบีบอัด!
user253751

คำตอบพื้นฐานคือไม่ - เป็นไปไม่ได้เนื่องจาก # และขนาดของการเรียงสับเปลี่ยน แต่สิ่งที่คุณคิดว่าเป็นไปได้ที่จะมีประโยชน์สำหรับแอปพลิเคชัน
Archangel

คำตอบ:


91

มี 2 8192บล็อก 1K ที่แตกต่างกันที่เป็นไปได้ การจัดเก็บทั้งหมดจะใช้พื้นที่จัดเก็บ2 8202บิต เนื่องจากจักรวาลมีอนุภาคเพียงประมาณ 10 80 (หรือ ~ 2 266 ) มันจึงเป็นทางออกที่ปลอดภัยที่คุณไม่สามารถเก็บพวกมันไว้ได้ทั้งหมดและคุณไม่ต้องสงสัยว่ามันจะประหยัดเวลาหรือไม่

แต่ในความเป็นจริงแล้วเป็นวิธีที่น่าสนใจมากขึ้นในการตอบคำถามนี้ คุณกำลังแนะนำการสร้างดัชนีในกลุ่มของค่าคงที่ขนาดใหญ่ แต่คุณจะรู้ได้อย่างไรว่าดัชนีใดที่อ้างถึง? ลองนึกภาพประโยชน์ของอาร์กิวเมนต์ที่คุณต้องการในการจัดเก็บบล็อกเฉพาะ 1 ตัวนั้น: a, b, c... สันนิษฐานว่าดัชนีของคุณจะเป็น 0, 1, 2 ฯลฯ เนื่องจากว่าเป็นรูปแบบที่มีประสิทธิภาพมากที่สุดในการจัดเก็บบล็อกที่

คุณสังเกตเห็นบางสิ่งเกี่ยวกับข้อตกลงไหม? ในความเป็นจริงดัชนีของคุณเป็นการนำเสนอรหัสของข้อมูลที่เก็บไว้ ! กล่าวอีกนัยหนึ่งคุณไม่จำเป็นต้องอ้างถึงเลยเพียงแค่เปลี่ยนดัชนีให้เป็นข้อมูลที่คุณต้องการ

เมื่อคุณจัดเก็บค่าที่เป็นไปได้ทั้งหมดในตารางสิ่งนี้จะเกิดขึ้นเสมอ: ดัชนีของคุณจะกลายเป็นเพียงข้อมูลที่เข้ารหัสแล้วดังนั้นการจัดเก็บข้อมูลจึงไม่จำเป็นในครั้งแรก นี้ทำไมในโลกแห่งความจริง, ดัชนีจะมีประโยชน์เฉพาะข้อมูลที่กระจัดกระจาย (เช่นทุกหน้าเว็บที่คุณเข้าชมได้ทุกหน้าเว็บที่สามารถอยู่หรือแม้กระทั่งสิ่งที่ทำอยู่)


17
ดังนั้นในทางที่เรากำลังใช้ระบบนี้ - แต่เรากำลังทำมันด้วยการประเมินผลขี้เกียจของรูปแบบบิตกิโลไบต์ขนาดซึ่งจะช่วยให้เราประหยัดตันของพื้นที่จัดเก็บ!
Theodoros Chatzigiannakis

3
ที่เก็บข้อมูลลดลงเล็กน้อยเนื่องจากการทับซ้อนกัน (1024 ศูนย์ตามด้วย 1024 รายการที่มีรูปแบบที่ไม่ซ้ำกัน 1,025 รายการ) ... ลดลง แต่ยังคงมีขนาดใหญ่เป็นไปไม่ได้ นอกจากนี้บล็อก 1KB คือ 2 <sup> 13 </sup> บิตไม่ใช่ 2 <sup> 10 </sup>
Ben Voigt

2
โปรดทราบว่าขีด จำกัด 10 ^ 80 อนุภาคในจักรวาลไม่ได้โดยตรงหมายความว่าคุณไม่สามารถเก็บได้มากกว่าการพูด, 10 ^ 80 บิตในจักรวาล - เพราะแต่ละอนุภาคคุณอาจจะสามารถจัดเก็บมากกว่าหนึ่งบิตของข้อมูล ( ขึ้นอยู่กับตำแหน่งภายในจักรวาลและอาจเป็นไปได้ว่าความเร็ว ฯลฯ ) นั่นไม่ได้หมายความว่าคุณสามารถจัดเก็บทุก ๆ 1K บล็อกได้ - จำนวนเหล่านั้นเกินจำนวนอนุภาคโดยปัจจัยที่มีขนาดใหญ่อย่างน่าประหลาดใจดังนั้นมันจึงเป็นเดิมพันที่ปลอดภัยมากที่คุณไม่สามารถเก็บมันได้ทั้งหมด!
psmears

2
@Neil หากคุณมีระบบการเข้ารหัสที่อนุญาตให้คุณเก็บ 10 ^ 80 โดยการเข้ารหัสเป็น "10 ^ 80" แล้วคุณจะเก็บ "10 ^ 80" ได้อย่างไร? หากข้อมูลบางส่วนถูกเข้ารหัสให้สั้นกว่าข้อมูลจริงผู้อื่นจะต้องถูกเข้ารหัสอีกต่อไป หรือถ้าชิ้นส่วนข้อมูลทั้งหมดของคุณเป็นตัวเลขแสดงว่าคุณกำลังจัดเก็บทศนิยมแต่ละหลักเป็นไบต์ทั้งหมด
Random832

3
ด้วยลำดับเดอ Bruijn 2 ^ 1024 บิตจะพอเพียง
gronostaj

20

อย่างที่คนอื่น ๆ ชี้ไปคุณมีความเป็นไปได้ 2 ^ 8192 สำหรับบล็อก 1k ซึ่งหมายความว่าคุณจะต้องมี 8192 บิตในการเข้ารหัสที่อยู่ของบล็อกหากที่อยู่ของบล็อกทั้งหมดถูกเข้ารหัสด้วยจำนวนบิตเดียวกันดังนั้นที่อยู่ของคุณจะยาว 1k คุณจะไม่ได้อะไรเลยนอกจากการเพิ่มเลเยอร์ทางอ้อมดังนั้นคุณจะไม่ได้รับประสิทธิภาพใด ๆ

หากคุณต้องการให้มีที่อยู่ที่สั้นกว่าคุณจะต้องเข้ารหัสบล็อกบางส่วนด้วยที่อยู่สั้น ๆ และบล็อกที่ยาวกว่าและทำให้บล็อกยาวขึ้นเพื่อไม่ให้ปรากฏบ่อยและตอนนี้คุณกำลังบีบอัดข้อมูล (อาจมีบางอย่างเช่นรหัส Huffman ) ซึ่งจะต้องมีความรู้เกี่ยวกับข้อมูลที่คุณจัดเก็บไว้ก่อนที่จะจัดเก็บหรือเปลี่ยนแปลงในการเข้ารหัสเป็นประจำ มันอาจจะมีประสิทธิภาพน้อยกว่าอัลกอริธึมการบีบอัดอื่น ๆ ที่ใช้บล็อกที่มีความยาวต่างกัน


1

มีสองปัญหาคือ

ก่อนอื่น "การเรียงสับเปลี่ยนไบนารีที่เป็นไปได้ทั้งหมดหนึ่งกิโลไบท์" เป็นข้อมูลจำนวนมหาศาล 1024 ไบต์ * 8 บิตต่อไบต์ = 8192 บิตในหน่วยกิโลไบต์ การเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดคือ 2 ^ 8192 นั่นประมาณ1.09e+2466กิโลไบต์! (สำหรับวัตถุประสงค์ในการเปรียบเทียบไดรฟ์ 1 TB คือ1e09กิโลไบต์)

ประการที่สองแม้ว่าคุณจะมีตารางจำนวนมหาศาลและคุณจัดทำดัชนีด้วยพอยน์เตอร์คุณจะทำอย่างไรถ้าคุณต้องการอ้างอิงข้อมูลบางอย่างที่เล็กกว่า 1 KB


2
การจัดเก็บบล็อกทั้งหมดที่มีขนาดเล็กกว่า 1 KB จะไม่เพิ่มพื้นที่ว่างอีกมาก สมมติว่าเป็นบล็อกขนาดไบต์เท่านั้นขนาดของบล็อกขนาดเล็กเข้าด้วยกันนั้นมีขนาดเพียง 1/256 ของขนาดบล็อก 1-KB เล็กน้อย สมมติว่าบล็อกขนาดบิตคุณเพิ่มขนาดเดียวกันอีกครั้ง
Paŭlo Ebermann

-1

ในขณะที่ผู้โพสต์คนอื่น ๆ ชี้ไปที่ขนาดของตัวชี้ที่จำเป็นในการจัดทำดัชนีในรายการค่าที่เป็นไปได้ทั้งหมดของคุณจะลบล้างกำไรของคุณ

อย่างไรก็ตามบางภาษาใช้รุ่นที่ จำกัด ของสิ่งที่คุณแนะนำเพื่อเพิ่มประสิทธิภาพการใช้หน่วยความจำ Python ใช้สตริง 'ฝึกงาน' เพื่อลดจำนวนสตริงที่ซ้ำกันในหน่วยความจำ คุณสามารถค้นหาข้อมูลเพิ่มเติมได้โดยค้นหา 'python string ฝึกงาน'


1
OP กำลังถามเกี่ยวกับชุดหนาแน่นที่มีการเปลี่ยนแปลงทุกครั้ง พอยน์เตอร์มีประโยชน์สำหรับข้อมูลแบบเบาบางเท่านั้นซึ่งบิตที่ต้องใช้ในการถือตัวชี้นั้นเล็กกว่าบิตที่ชี้ไป การฝึกงานระหว่างประเทศสามารถทำให้พื้นที่ว่างมากขึ้นหากมีการซ้ำซ้อนดังนั้นจึงมีการเชื่อมต่อที่นั่น แต่คำตอบของคุณไม่ได้เป็นวลีที่ดีจริงๆ
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.