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


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 หากมีn−kของสิ่งเหล่านี้เราก็มี(nn−k)=(nk)ตัวเลือกสำหรับพวกเขาและBkตัวเลือกสำหรับการแบ่งส่วนที่เหลือ

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

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

C=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.

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

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


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

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


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