PRNG สามารถใช้ในการบีบอัดข้อมูลได้หรือไม่?


38

ความคิดนี้เกิดขึ้นกับฉันในขณะที่เด็กเรียนรู้ที่จะเขียนโปรแกรมและพบกับ PRNG เป็นครั้งแรก ฉันยังไม่รู้ว่ามันสมจริงแค่ไหน แต่ตอนนี้มีการแลกเปลี่ยนกองซ้อน

นี่คือโครงร่างของอายุ 14 ปีสำหรับอัลกอริทึมการบีบอัดที่น่าทึ่ง:

ใช้ PRNG และ seed ด้วย seed sเพื่อให้ได้ลำดับไบต์แบบสุ่มหลอกยาว ในการส่งลำดับนั้นไปยังบุคคลอื่นคุณต้องสื่อสารเพียงคำอธิบายของ PRNG เมล็ดที่เหมาะสมและความยาวของข้อความ สำหรับลำดับที่ยาวพอคำอธิบายนั้นจะสั้นกว่ามาก

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

PRNG ทำซ้ำหลังจากสร้างบิตจำนวนมากพอ แต่เมื่อเทียบกับรอบ "ปกติ" ข้อความของฉันค่อนข้างสั้นดังนั้น dos นี้ดูเหมือนจะไม่เป็นปัญหามากนัก

Voila วิธีบีบอัดข้อมูล

ดังนั้นสมมติว่า:

  • ลำดับที่ฉันต้องการบีบอัดมี จำกัด และทราบล่วงหน้า
  • ฉันไม่สั้นเรื่องเงินสดหรือเวลา (แค่ต้องการจำนวน จำกัด ของทั้งสองอย่าง)

ฉันอยากรู้:

  • มีข้อบกพร่องพื้นฐานในการให้เหตุผลเบื้องหลังโครงการหรือไม่
  • วิธีมาตรฐานในการวิเคราะห์การทดลองทางความคิดเหล่านี้คืออะไร

สรุป

บ่อยครั้งที่คำตอบที่ดีไม่เพียง แต่ชัดเจนคำตอบเท่านั้น แต่สิ่งที่ฉันถามจริงๆคืออะไร ขอบคุณสำหรับความอดทนของทุกคนและคำตอบอย่างละเอียด

นี่คือความพยายามครั้งที่ n ของฉันโดยสรุปคำตอบ:

  • มุม PRNG / เมล็ดไม่ได้มีส่วนช่วยอะไรเลยมันไม่มากไปกว่าโปรแกรมที่สร้างลำดับที่ต้องการเป็นเอาต์พุต
  • หลักการของนกพิราบ: มีข้อความยาวมากกว่า> k มากกว่าที่มี (สร้างข้อความ) โปรแกรมความยาว <= k ดังนั้นลำดับบางอย่างก็ไม่สามารถส่งออกของโปรแกรมที่สั้นกว่าข้อความ
  • เป็นมูลค่าการกล่าวขวัญว่าจำเป็นต้องมีการแก้ไขล่ามของโปรแกรม (ข้อความ) ล่วงหน้า และการออกแบบก็กำหนดส่วนย่อย (เล็ก ๆ ) ของข้อความที่สามารถสร้างขึ้นได้เมื่อได้รับข้อความความยาว k

ณ จุดนี้ความคิดเดิมของ PRNG นั้นตายไปแล้ว แต่มีคำถามสุดท้ายอย่างน้อยหนึ่งคำถามที่จะยุติ:

  • ถาม: ฉันจะโชคดีและพบว่าข้อความยาว (แต่ จำกัด ) ของฉันเพิ่งเกิดขึ้นเป็นผลลัพธ์ของโปรแกรมความยาว <k บิต?

การพูดอย่างเคร่งครัดไม่ใช่เรื่องของโอกาสเนื่องจากต้องทราบความหมายของทุกข้อความ (โปรแกรม) ที่เป็นไปได้ล่วงหน้า อย่างใดอย่างหนึ่งก็คือความหมายของข้อความบางส่วนของ <k บิตหรือมันไม่ได้เป็น

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

OTOH ถ้าฉันเลือกข้อความเฉพาะของ> = k บิตจากสิ่งที่เป็นผลลัพธ์ของโปรแกรมที่น้อยกว่า k บิต (สมมติว่ามีข้อความดังกล่าว) จากนั้นฉันก็ใช้ประโยชน์จากบิตที่ส่งไปยัง ผู้รับ (การออกแบบของล่าม) ซึ่งนับเป็นส่วนหนึ่งของข้อความที่ถ่ายโอน

สุดท้าย:

ในที่สุดทั้งสองก็บอกเราเหมือนกันกับหลักการ (ง่ายกว่า) สำหรับช่องทางสื่อสาร (pigeonhole) บอกเราว่าเราสามารถบีบอัดได้มากแค่ไหนบางทีอาจจะไม่มากเลยบางคน แต่ไม่แน่นอนเท่าที่เราจะจินตนาการ


6
ปรับเปลี่ยนคำถามของคุณเล็กน้อยและคุณยังไม่สามารถบีบอัดทุกสตริงได้ (ดังที่อธิบายไว้ในคำตอบด้านล่าง) แต่คุณจะได้รับทฤษฎีข้อมูลขั้นตอนวิธี ( en.wikipedia.org/wiki/Kolmogorov_complexity ) แทนที่ "PRNG" ด้วย "universal Turing machine" และ "seed" ด้วย "อินพุตเทปที่มีโปรแกรมที่สร้างเอาต์พุตที่ฉันต้องการ" เทปอินพุตส่วนใหญ่จะยาวกว่าเอาต์พุตที่สร้าง แต่สำหรับทุกเอาต์พุตจะมีอย่างน้อยหนึ่งอินพุตที่สร้างเอาต์พุตนั้น
หลงลอจิก

ไม่ แต่ขนาดที่บีบอัดคือเอนโทรปีของแหล่งที่มา ^ _ ^
Navin

5
หากคุณใช้สิ่งนี้จริง ๆ คุณจะพบสิ่งที่น่าสนใจ: เพื่อสร้างการป้อนข้อมูลใหม่โดยพลการคุณจะต้องมี seed + rng ที่โดยเฉลี่ยทุกบิตมีขนาดใหญ่เท่ากับข้อมูลต้นฉบับ อุ่ย
Mark

อีกวิธีหนึ่งในการทำความเข้าใจว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้: แม้ว่า PRNG จะสามารถสร้างเอาต์พุตที่มีความยาวตามอำเภอใจแต่ก็ไม่สามารถสร้างเอาต์พุตที่กำหนดเองได้ (เอาต์พุตของ PRNG จะเป็นวัฏจักรคงที่หรือรูปแบบที่ จำกัด โดยขนาดของรัฐ)
Pi Delport

@PietDelport สำหรับ n ใด ๆ ที่มี PRNG ซึ่งมีวงรอบที่ใหญ่กว่ามากและคำถามที่ถูกตั้งค่านั้นได้ทราบล่วงหน้าแล้ว ดังนั้นฉันไม่มั่นใจว่าข้อเท็จจริงที่ว่า PRNG นั้นมีวัฏจักรตัวเองตั้งคำถามโดยตรง

คำตอบ:


43

คุณมีรูปแบบการบีบอัดใหม่ที่ยอดเยี่ยมใช่มั้ย เอาล่ะแล้ว ...

♫มาเล่นเกมเอนโทรปีกันเถอะ♫

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

ดังนั้นโครงร่างของคุณคือการกำหนดตระกูลของ PRNG / เมล็ดเช่นถ้าคุณต้องการบีบอัดพูดจากนั้นคุณก็เขียนจำนวนซึ่งระบุบางเมล็ด (และแบ่งปัน) precomputed (และแบ่งปัน) เมล็ด / PRNG คำสั่งผสมที่สร้างบิตเหล่านั้นหลังจากแบบสอบถามAlright ความยาวบิตแตกต่างกันมีกี่สตริง? (คุณมีตัวเลือก n รายการระหว่างสองรายการคือและ ) นั่นหมายความว่าคุณจะต้องคำนวณคอมโบของคอมโบเหล่านี้ ไม่มีปัญหา. อย่างไรก็ตามคุณต้องเขียนเลขฐานสองเพื่อให้ฉันอ่าน จะใหญ่ขนาดไหน มันอาจใหญ่เท่ากับ01000111001knn2n012nkk2n. ฉันจะต้องกี่บิตที่จะเขียนออกมา ? n2nlog2n=n

อ๊ะ! รูปแบบการบีบอัดของคุณต้องการข้อความตราบใดที่คุณกำลังบีบอัด!

"ฮ่าฮ่า!" คุณพูดว่า "แต่นั่นเป็นกรณีที่เลวร้ายที่สุด! หนึ่งในข้อความของฉันจะถูกแมปเป็นซึ่งต้องการเพียงบิตเพื่อเป็นตัวแทน! ชัยชนะ!"01

ใช่ แต่ข้อความของคุณต้องไม่คลุมเครือ! ฉันจะบอกแยกตามด้วยจากอย่างไร เนื่องจากกุญแจบางส่วนของคุณมีความยาวดังนั้นทั้งหมดจึงต้องเป็นหรืออื่น ๆ ฉันไม่สามารถบอกได้ว่าคุณได้เริ่มและหยุดแล้ว1010n

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

ใช่ แต่ตอนนี้ตัวเลขขนาดใหญ่จริง ๆ นั้นนำหน้าด้วยบิต รูปแบบการบีบอัดของคุณทำให้ข้อความของคุณยาวขึ้น! และครึ่งหนึ่งของตัวเลขทั้งหมดของคุณเริ่มต้นด้วยดังนั้นข้อความครึ่งหนึ่งของคุณจึงยาวขึ้นมาก!logn1

จากนั้นคุณจะโยนความคิดเพิ่มเติมเช่นตัวละครที่กำลังจะสิ้นสุดหมายเลข gzipping และการบีบอัดความยาวของตัวเอง ในความเป็นจริงสำหรับทุก ๆ บิตที่คุณบันทึกในบางข้อความข้อความอื่นจะได้รับการตอบกลับนานกว่า โดยทั่วไปคุณเพียงแค่จะขยับ "ต้นทุน" ของข้อความของคุณ การทำให้สั้นลงจะทำให้คนอื่นนานขึ้น จริงๆคุณไม่สามารถใส่ที่แตกต่างกันข้อความในพื้นที่น้อยกว่าการเขียนออกสตริงไบนารีของความยาวn2n2nn

"ฮ่าฮ่า!" คุณพูดว่า "แต่ฉันสามารถเลือกข้อความบางส่วนเป็น 'โง่' และทำให้พวกเขาผิดกฎหมายแล้วฉันไม่จำเป็นต้องนับจนถึงเพราะฉันไม่สนับสนุนข้อความจำนวนมาก! "2n

คุณพูดถูก แต่คุณยังไม่ชนะจริงๆ คุณเพิ่งย่อชุดข้อความที่คุณสนับสนุน หากคุณสนับสนุนและเป็นข้อความที่คุณส่งคุณก็สามารถมีรหัส ,ซึ่งตรงกับสิ่งที่ฉันพูด นี่ 1 ความยาวที่แท้จริงของข้อความนั้นไม่สำคัญเท่าไหร่a=0000000011010b=111111110101000a0b1n=1

"ฮ่าฮ่า!" คุณพูดว่า "แต่ฉันสามารถตัดสินได้ว่าข้อความโง่ ๆ เหล่านี้หายาก! ฉันจะทำให้ของหายากใหญ่และของเล็กทั่วไป! จากนั้นฉันก็ชนะโดยเฉลี่ย!"

อ้อ! ขอแสดงความยินดีคุณเพิ่งค้นพบเอนโทรปี ! หากคุณมีข้อความข้อความที่ข้อความที่มีความน่าจะเป็นจะถูกส่งคุณสามารถทำให้ข้อความที่คุณคาดไว้มีความยาวถึงเอนโทรปีของสิ่งนี้ ชุดข้อความ นั่นคือการแสดงออกที่แปลกประหลาด แต่สิ่งที่คุณต้องรู้ก็คือมันใหญ่ที่สุดเมื่อข้อความทั้งหมดมีแนวโน้มเท่ากันและเล็กลงเมื่อบางข้อความมีความเหมือนกันมากกว่าข้อความอื่น ๆ ในมากถ้าคุณรู้ว่าโดยทั่วไปทุกข้อความที่เป็นไปได้Aจากนั้นคุณสามารถใช้รหัสที่มีประสิทธิภาพสูงนี้: ,i p i H = n i = 1 p iบันทึก( 1 / p i )nipiH=i=1npilog(1/pi)a=000111010101a0x1xมิฉะนั้น. จากนั้นความยาวข้อความที่คุณคาดหวังจะเป็นซึ่งน่ากลัวและนั่นจะใกล้เคียงกับเอนโทรปีจริงๆ อย่างไรก็ตามเป็นขอบเขตที่ต่ำกว่าและคุณไม่สามารถเอาชนะได้ไม่ว่าคุณจะพยายามมากแค่ไหนก็ตาม1HH

อะไรก็ตามที่อ้างว่าเอาชนะเอนโทรปีอาจจะไม่ให้ข้อมูลเพียงพอที่จะดึงข้อความที่ถูกบีบอัดหรือไม่ผิดพลาด เอนโทรปีเป็นแนวคิดที่ทรงพลังที่เราสามารถลดขอบเขต (และบางครั้งแม้แต่บน -ขา) เวลาทำงานของอัลกอริธึมด้วยเพราะถ้าพวกเขาวิ่งเร็วจริง ๆ (หรือช้ามาก) พวกเขาจะต้องทำอะไรบางอย่างที่ละเมิดเอนโทรปี .


13
บอยฉันจะโง่งี่เง่าเมื่อคุณแกล้งเป็นฉัน ขอบคุณพระเจ้าที่ฉันภาคภูมิใจที่ได้ค้นพบเอนโทรปี นี่เป็นคำตอบที่ดี - ถ้าเพียง แต่น้ำเสียงไม่ได้แต่งแต้มด้วยการเยาะเย้ย

6
ฉันไม่ได้ตั้งใจที่จะเยาะเย้ยเพียงแค่เล่นพร้อมกับความคิดของ "รูปแบบของอายุ 14 ปีสำหรับอัลกอริทึมการบีบอัดที่น่าทึ่ง" :)
Alexis Beingessner

3
ไม่ได้ฟังดูเหมือนฉันเยาะเย้ย :) นี่เป็นรูปแบบทั่วไปของการอธิบายปัญหาในวิทยาศาสตร์ยอดนิยม (และสาขาอื่น ๆ ) แม้ว่าจะเป็นความจริงที่ว่า "ผู้ถาม" มักจะเป็นอลิซหรือบ๊อบมากกว่า "ของจริง" person: D ลองมาดูกันว่าคุณสามารถเข้าใจได้ง่ายแค่ไหนว่าปัญหาซับซ้อนแค่ไหน! (ไม่พูดถึงว่าเมื่อฉันกำลังคิดปัญหาที่ซับซ้อนในหัวของฉันฉันใช้กระบวนการเดียวกัน - การสนทนาภายในเป็นเรื่องที่น่าอัศจรรย์ในการจำลอง "หัวรู้เพิ่มเติม"
Luaan

2
@ SteveJessop นั่นคือการแบ่งขั้วที่ผิดพลาดและไม่ไปที่นั่น มันเป็นคำตอบที่ดีและบางทีฉันก็อ่อนตัวเกินไป

3
@ chipmonkey ฉันคิดว่านั่นยังคงครอบคลุมโดยคำตอบของอเล็กซิสเกี่ยวกับ "เกมเอนโทรปี" อาจเป็นไปได้ว่าจำนวนอัลกอริธึมที่ต้องทำนั้นจะใหญ่มากจนจำนวนบิตที่ต้องระบุว่าอันไหนที่ใช้จะยกเลิกผลประโยชน์

21

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

ในชีวิตจริงเรามักจะรู้อะไรบางอย่างเกี่ยวกับลำดับที่เรากำลังบีบอัดพูดว่าเป็นเสียงหรือรูปภาพ ในกรณีของการบีบอัดแบบ lossless ทฤษฎีบทการเข้ารหัสซอร์สของแชนนอนแสดงให้เห็นว่าอัตราการบีบอัดที่ดีที่สุดนั้นเท่ากับเอนโทรปีของแหล่งที่มา สำหรับการเข้ารหัสแบบ lossy มีทฤษฎีบทอื่น ๆ ในทฤษฎีข้อมูล (ทฤษฎีอัตราการบิดเบือน) ดังนั้นในกรณีนี้มีข้อ จำกัด ว่าคุณสามารถบีบอัดข้อมูลได้เท่าใด


ฉันไม่เคยดูแบบนี้มาก่อน แต่นี่เพิ่งมาหาฉัน: โดยทั่วไปแชนนอนบอกว่าแม้แต่กรณีที่ดีที่สุดก็ไม่สามารถบีบอัดได้โดยพลการและหลักการของนกพิราบรับประกันได้ว่าจะต้องมีกรณีที่เลวร้ายที่สุดซึ่งไม่สามารถบีบอัดได้ เลย นั่นเป็นลักษณะที่สมเหตุสมผลหรือไม่?
Jörg W Mittag

1
เคสที่ดีที่สุดสามารถบีบอัดได้เสมอเนื่องจากคุณสามารถรวมสตริงบางส่วนเป็นกรณีพิเศษของอัลกอริทึมการบีบอัดของคุณ อาร์กิวเมนต์นี้ใช้ได้ไม่เฉพาะกับกรณีที่แย่ที่สุด แต่สำหรับกรณีทั่วไปซึ่งแสดงว่าการบีบอัดโดยเฉลี่ยอยู่ที่ 2 บิตสูงสุด
Yuval Filmus

อ่าแน่นอน if input.empty? then output_very_long_stringจะให้อัตราส่วนการบีบอัดที่ไม่มีที่สิ้นสุดเป็นกรณีที่ดีที่สุด จริงๆแล้วมีอัลกอริทึมการบีบอัดที่ใช้สิ่งนี้ (ผมลืมชื่อไปอย่างน่าเสียดาย.) มันมีไว้สำหรับสายที่สั้นมากและจะมีการเข้ารหัสพิเศษสำหรับสตริงกำหนดค่าตายตัวเช่นhttp://, www., .comและอื่น ๆ
Jörg W Mittag

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

3
@ foo1899 หากคุณสามารถตัดสินได้ว่าสตริงบางตัวมีแนวโน้มว่าจะเป็นสตริงอื่นแล้วคุณสามารถทำได้ดีกว่าโดยเฉลี่ยใช่ โดยทั่วไปขอบเขตที่ต่ำคือขนาดข้อความของคุณคาดว่าบีบอัดไม่สามารถชนะHโดยที่คือความน่าจะเป็นของข้อความที่เป็นไปได้ที่จะถูกส่ง คือค่าสูงสุดเมื่อข้อความทั้งหมดมีแนวโน้มเท่ากันและมีขนาดเล็กกว่าอย่างอื่น ที่สุดขีดคุณสามารถได้รับประสิทธิภาพโดยเฉลี่ยที่ดีเยี่ยมหากเกือบทุกข้อความคือ "สวัสดี" และข้อความอื่น ๆ ทุกข้อความหายาก เพียงตั้งค่า "hello" -> 0 และ x-> 1x เป็นอย่างอื่น p i hH=ipilog1/pipiH
อเล็กซิส Beingessner

7

ลองจินตนาการว่าเชื้อสายของมีความยาวkPRNG ของคุณเป็นฟังก์ชั่นที่กำหนดของเมล็ดดังนั้นมันจะออกผลลัพธ์ที่มากที่สุดลำดับที่แตกต่างกันของความยาวnมีเหล่านี้เพื่อให้โครงการของคุณจะไม่ทำงานจนกว่าจะตกกลับในการส่งทั้งสตริงบิตเมื่อไม่มีที่สอดคล้องsk 2 k n 2 n n ssk2kn2nns

(ดังคำตอบอื่นที่บันทึกไว้สิ่งนี้จะเกิดขึ้นสำหรับฟังก์ชันการบีบอัดใด ๆ ที่คุณเลือกเลย)


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

ทั้งหมดนี้บอกว่าถ้าคุณทำ PRNG ที่คุณชื่นชอบฉันสามารถมาหาคุณตามลำดับที่มันไม่ได้ผลิต ข้อความที่ชัดเจนคือมีลำดับที่ไม่ได้ถูกปล่อยออกมาโดยโปรแกรมที่สั้นกว่า (ในคำอื่น ๆ คุณยังคงสูญเสียแม้ว่าฉันให้คุณเปลี่ยนการทำงานของคุณหลังจากที่เห็นลำดับของฉันนั่นคือสิ่งที่ Yuval alludes ไปด้วย "ความซับซ้อน Kolmogorov".)
Louis

4

นอกเหนือจากจุดตอบรับอื่น ๆ ฉันต้องการเพิ่มลิงค์นี้: https://www.schneier.com:443/blog/archives/2009/09/the_doghouse_cr.html

ตอนนี้การส่งออกพลังงานประจำปีของดวงอาทิตย์ของเราประมาณ 1.21 × 10 ^ 41 ergs มันเพียงพอที่จะให้พลังงานประมาณ 2.7 × 10 ^ 56 การเปลี่ยนแปลงบิตเดียวบนคอมพิวเตอร์ในอุดมคติของเรา การเปลี่ยนแปลงสถานะมากพอที่จะทำให้ตัวนับ 187- บิตผ่านค่าทั้งหมด ถ้าเราสร้างทรงกลมไดสันรอบดวงอาทิตย์และเก็บพลังงานทั้งหมดไว้ 32 ปีโดยไม่มีการสูญเสียใด ๆ เราสามารถใช้พลังงานคอมพิวเตอร์นับได้ถึง 2 ^ 192 แน่นอนว่ามันไม่มีพลังงานเหลือสำหรับการคำนวณที่มีประโยชน์กับตัวนับนี้

ดังนั้นการวนซ้ำ (ไม่มีการเปรียบเทียบ ... ) เพื่อค้นหากลุ่มดาว 187 บิตที่ถูกต้องของข้อมูลที่คุณต้องการจะอยู่ภายใต้เงื่อนไขอุดมคติ (ไม่สามารถบรรลุได้) พลังงานมากกว่าดวงอาทิตย์ที่ปล่อยออกมาในรอบปี


1

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

คุณอาจโต้แย้งว่าบางทีผลลัพธ์ของอัลกอริทึมของคุณมีโครงสร้างที่ไม่สามารถบีบอัดได้มากขึ้น แต่จากนั้นคุณสามารถใช้ shuffle แบบกำหนดค่าล่วงหน้าก่อนทำการบีบอัดซ้ำ

เชิงอรรถ:การสับแบบกำหนดค่าบางอย่างช่วยในรูปแบบการบีบอัดจริง ๆ : http://pytables.github.io/usersguide/optimization.html?highlight=shuffling#shufflingoptim


ฉันคิดว่าคุณหายไปว่าข้อความที่บีบอัดแต่ละข้อความมีเมล็ดพันธุ์ที่sเกี่ยวข้อง ข้อความ 01001011 ที่มี´s´ ของ 2348 จะแตกต่างจากข้อความเดียวกันกับ´s´ ของ 3924 เว้นแต่ว่าฉันเข้าใจผิดอัลกอริทึมของ foo1899 ด้วยตัวเอง แต่อย่างใด
Azeirah

1

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

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


PRNG ใช้วิธีนี้ในการแสดงข้อมูลแบบสุ่ม (หลอก) อย่างคร่าว ๆ เช่นเพื่อความสามารถในการทำซ้ำของการทดลอง
Yuval Filmus

1
@YuvalFilmus: แน่นอน พวกเขายังสามารถใช้ในบางสถานการณ์เช่นการสร้างระดับวิดีโอเกมซึ่งส่วนเล็ก ๆ ของระดับที่สร้างขึ้นจะถือว่าเป็นที่ยอมรับ แต่ผู้ออกแบบวิดีโอเกมสามารถสร้างระดับแบบสุ่มจนกว่าเขาจะพบบางอย่างที่ชอบและบันทึกเมล็ดที่ สร้างสิ่งเหล่านั้น แนวคิดที่มีประโยชน์มากในอดีตเมื่อเขียนโค้ดสำหรับเครื่องวิดีโอเกมที่มี RAM ขนาด 128 ไบต์พยายามที่จะปรับโปรแกรมให้เป็นคาร์ทริดจ์ที่มี ROM 4096 ไบต์
supercat

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

@ foo1899: บังเอิญเกม "Pitfall" en.wikipedia.org/wiki/Pitfall ! ใช้เทคนิคดังกล่าวข้างต้นเพื่อใช้สร้างแผนที่ 256 หน้าจอบนคาร์ทริดจ์เกม 4K บนเครื่องที่มี RAM ขนาด 128 ไบต์
supercat

1

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

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

แน่นอนว่าคุณสามารถลดความไม่เป็นเอกภาพนี้ได้โดยใช้ PRNG เพื่อเดินผ่าน "โดเมนกราฟ" ของการเปลี่ยนคำต่อคำและคุณเพิ่มโอกาสในการปรากฏตัวของข้อความและยังต้องเพิ่มกราฟโดเมนไปยังข้อความที่ถูกบีบอัดด้วย ความยาว.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.