การแสดงเส้นทางขนาดเล็กในกราฟ


9

ฉันเป็นเซตย่อยของเส้นทางแบบง่าย ๆ ในกราฟ ความยาวของเส้นทางถูกล้อมรอบด้วยd.

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

โปรดทราบว่าฉันต้องการใช้การเป็นตัวแทนนี้ในอัลกอริทึมที่จะวนซ้ำผ่านชุดย่อยของเส้นทางนี้ซ้ำแล้วซ้ำอีกและฉันต้องการที่จะค่อนข้างเร็วดังนั้นตัวอย่างเช่นฉันไม่สามารถใช้อัลกอริธึมการบีบอัดมาตรฐานได้

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


2
เมื่อ "วนซ้ำผ่านชุดย่อยนี้" คุณต้องการข้อมูลเกี่ยวกับเส้นทางใดบ้าง ความยาว? เยี่ยมชมโหนด? ทางแยกที่มีเส้นทางอื่น ... อาจมีหลายคนดังนั้นคุณต้องเตรียมพร้อมสำหรับ "ไม่เร็วมาก" หากคุณต้องการเก็บเส้นทางทั้งหมด 2d
Raphael

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

แม้แต่การรวมกันของสองเส้นทางที่ไม่ต่อรวมกันก็สามารถสร้างวงจรได้ดังนั้นการคำนวณ MST จะทำให้คุณสูญเสียหนึ่งในเส้นทางที่ฉันเดา แต่ข้างต้นอาจทำให้คุณมีความคิด
Juho

2
คุณอาจต้องการดูกระดาษของ Eppstein ในเส้นทางที่สั้นที่สุดและวรรณกรรมที่เกี่ยวข้อง พวกเขาจัดการกับตัวแทนที่กะทัดรัดเช่นกัน k
Juho

มีความเป็นไปได้ในการใช้ FSM เพื่อเป็นตัวแทนของเส้นทางและจากนั้นหนึ่งสามารถดำเนินการขั้นพื้นฐานเช่นสหภาพ, ทางแยก, การลบ, ฯลฯ ... และการดำเนินการ "การบีบอัด" ของการลด FSMs นั้นเป็นที่เข้าใจ / เหมาะสมและมีประสิทธิภาพ havent เห็นนี้ทำในกระดาษ แต่มันเสนอในการแก้ปัญหาค่อนข้างคล้ายอื่น ...
vzn

คำตอบ:


4

Trie อาจใช้เล่ห์เหลี่ยม: http://en.wikipedia.org/wiki/Trie

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

เมื่อคุณสร้างคู่ชีวิตของคุณแล้วจะมีอัลกอริธึมสำหรับการบีบอัดลงไปสู่การแสดงที่ดีที่สุด (หรือใกล้เคียงที่สุด) (ดูบทความ Wikipedia ที่เชื่อมโยง)


น่าสนใจ Trie มาพร้อมกับสเปคที่ใหญ่กว่าที่ฉันไม่สนใจ (การค้นหาอย่างรวดเร็ว, การเชื่อมโยงกับคีย์ ฯลฯ ) ดังนั้นฉันจึงสงสัยว่าจะมีอะไรที่ดีกว่านี้ ...
เลือก

2

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

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


1

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

นี่คือบางแปลง:

เวลาเข้าถึงตามลำดับต่อองค์ประกอบสำหรับ EArray ขนาด 15 GB และ chunksizes ที่แตกต่างกัน: http://pytables.github.io/_images/seq-chunksize-15GB.png

ความเร็วในการบีบอัดโดยใช้ Blosc บน PyTables: ป้อนคำอธิบายรูปภาพที่นี่

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

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