อะไรคือวิธีกะทัดรัดในการแสดงพาร์ติชั่นของชุด?


11

มีโครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับการแสดงพาร์ทิชันที่ตั้งอยู่ โครงสร้างข้อมูลเหล่านี้มีความซับซ้อนในช่วงเวลาที่เหมาะสมสำหรับการดำเนินการเช่น Union และ Find แต่ไม่ได้มีประสิทธิภาพด้านพื้นที่โดยเฉพาะ

การใช้พื้นที่อย่างมีประสิทธิภาพในการเป็นตัวแทนของพาร์ติชั่นคืออะไร?

นี่คือจุดเริ่มต้นหนึ่งที่เป็นไปได้:

ฉันรู้ว่าจำนวนของพาร์ทิชัน ของชุดที่มีNองค์ประกอบคือBNที่N -th จำนวนเบลล์ ดังนั้นความซับซ้อนของพื้นที่ที่เหมาะสมที่สุดสำหรับการแสดงพาร์ติชันของชุดที่มีองค์ประกอบNคือ บิตlog2(BN)ในการค้นหาการนำเสนอดังกล่าวเราสามารถค้นหาการทำแผนที่แบบหนึ่งต่อหนึ่งระหว่าง (ชุดพาร์ติชันของชุดองค์ประกอบN ) และ (ชุดจำนวนเต็มจาก1ถึงBN )

มีการทำแผนที่ที่มีประสิทธิภาพในการคำนวณหรือไม่? สิ่งที่ผมหมายถึง "มีประสิทธิภาพ" คือว่าผมต้องการแปลงนี้เป็นตัวแทนที่มีขนาดกะทัดรัดจาก / ไปยังง่ายต่อการจัดการตัวแทน (เช่นรายการของรายการก) ในเวลาพหุนามในNหรือlog2(BN) )


สงสัยว่านั้นไกลแค่ไหนจากการเข้ารหัสที่ไร้เดียงสา / เป็นธรรมชาติของการกำหนดจำนวนเต็มเฉพาะให้กับแต่ละองค์ประกอบของเซตที่ซึ่งจำนวนเต็มที่แทนพาร์ติชัน #? อาจจะเป็น "ไม่แตกต่างกันมาก" ...log2(BN)
vzn

คำตอบ:


7

คุณสามารถใช้วิธีที่ได้รับสูตรการทำซ้ำด้านล่างเพื่อค้นหาการเข้ารหัสของคุณ:

Bn+1=k=0n(nk)Bk.
นี้จะได้รับการพิสูจน์โดยพิจารณาองค์ประกอบอื่น ๆ หลายวิธีที่จะอยู่ในส่วนที่มีองค์ประกอบn+11 หากมีnkของสิ่งเหล่านี้เราก็มี(nnk)=(nk)ตัวเลือกสำหรับพวกเขาและBkตัวเลือกสำหรับการแบ่งส่วนที่เหลือ

ใช้นี้เราสามารถให้ขั้นตอนวิธีการเวียนเกิดการแปลงพาร์ทิชันใด ๆn+1ไปยังหมายเลขในช่วง0,,Bn+11 1 ฉันคิดว่าคุณมีวิธีในการแปลงชุดย่อยขนาดkของ{1,,n}เป็นตัวเลขในช่วง0,,(nk)1(อัลกอริทึมดังกล่าวสามารถออกแบบในลักษณะเดียวกันโดยใช้การเกิดซ้ำของ Pascal(nk)=(n1k)+(n1k1) )

สมมติว่าส่วนที่มีn+1มีองค์ประกอบอื่น ๆ อยู่kค้นหารหัสC1 1 คำนวณพาร์ติชันของ{1,,nk}โดย "การบีบอัด" องค์ประกอบที่เหลือทั้งหมดไปยังช่วงนั้น คำนวณรหัสC2ซ้ำ ๆ รหัสใหม่คือ

C=l=0nk1(nl)Bl+C1Bnk+C2.

ในอีกทางหนึ่งให้รหัสCค้นหาค่าkเฉพาะที่

l=0nk1(nl)BlC<l=0nk(nl)Bl,
และกำหนด
C=Cl=0nk1(nl)Bl.
ตั้งแต่0C<(nk)Bnkก็สามารถเขียนเป็นC1Bnk+C2ที่0C2<Bnkk ตอนนี้รหัสC1องค์ประกอบในส่วนที่มีn+1และรหัสC2พาร์ทิชันของ{1,,nk}ซึ่งสามารถถอดรหัสซ้ำได้ ให้เสร็จสมบูรณ์ถอดรหัส, คุณต้อง "ยกเลิกการบีบอัด" พาร์ทิชันหลังเพื่อที่จะมีทุกองค์ประกอบไม่ปรากฏในส่วนที่มีn+1 1


นี่คือวิธีการใช้เทคนิคเดียวกันในการเข้ารหัสชุดย่อยSของ{1,,n}ของขนาดkซ้ำ ๆ ถ้าk=0แล้วรหัสเป็น0ดังนั้นสมมติว่าk>0 0 ถ้าnSให้C1เป็นรหัสของS{n}เป็นเซตย่อยของขนาดk1ของ{1,,n1}; รหัสของSคือC1 1 ถ้าnSปล่อยให้C1เป็นรหัสของSเป็นเซตย่อยของขนาดkของ{1,,n1} ; รหัสของSคือC1+(n1k1) )

ในการถอดรหัสรหัสCมีสองกรณี ถ้าC<(n1k1)แล้วถอดรหัสชุดย่อยSของ{1,,n1}ขนาดk1ที่มีรหัสคือCและเอาท์พุทS{n}} มิฉะนั้นถอดรหัสชุดย่อยSของ{1,,n1}ของขนาดkซึ่งโค้ดคือC(n1k1), and output S.


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