โครงสร้างข้อมูลสำหรับชุดของต้นไม้


10

พยายามอนุญาตการจัดเก็บรายการองค์ประกอบอย่างมีประสิทธิภาพ คำนำหน้าจะใช้ร่วมกันดังนั้นจึงเป็นพื้นที่ที่มีประสิทธิภาพ

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

ฉันมักจะเก็บต้นไม้ไบนารีที่มีความสูงไม่สมดุลประมาณ 500 ต้นน้อยกว่า 50

แก้ไข

แอปพลิเคชันของฉันเป็นตัวตรวจสอบรุ่นบางประเภทโดยใช้การบันทึกความจำบางประเภท ลองนึกภาพผมมีรัฐและสูตรต่อไปนี้: F = φและกรัม= ( φ ψ )กับφเป็น subformula ซับซ้อนและจินตนาการแรกที่ผมต้องการทราบว่าถืออยู่ในs ฉันจะตรวจสอบว่าϕถือครองและหลังจากกระบวนการที่มีความยาวฉันได้รับมันเป็นกรณี ทีนี้ฉันอยากรู้ว่าgมีsหรือไม่ ฉันต้องการจดจำความจริงที่ว่าfเก็บไว้และสังเกตว่าg fsf=ϕg=(ϕψ)ϕfsϕgsfgfเพื่อที่ฉันจะได้ค่าในsเกือบจะในทันที ในทางกลับกันถ้าฉันได้พิสูจน์แล้วว่าgไม่ถือในtฉันก็อยากจะบอกว่าfไม่ถือในtเกือบจะทันทีgs
gtft

เราสามารถสร้างคำสั่งซื้อบางส่วนเกี่ยวกับสูตรและมี IFF กรัม แต่ละรัฐsเราเก็บสองชุดของสูตร; L ( s ) จัดเก็บสูตรสูงสุดที่เก็บไว้และl ( s ) จะจัดเก็บสูตรขั้นต่ำที่ไม่ได้เก็บไว้ ตอนนี้ได้รับการรัฐsและสูตรกรัมผมสามารถดูได้ว่าL ( s ) , กรัมหรือถ้าลิตร( s )gfgfsL(s)l(s)sgfL(s),fgในกรณีนี้ฉันเสร็จแล้วและฉันรู้โดยตรงว่า gถือใน sหรือไม่fl(s),gfgs

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

@Raphael และ @Jack ชี้ให้เห็นว่าฉันสามารถเรียงลำดับต้นไม้ได้ แต่ฉันกลัวว่ามันจะไม่แก้ปัญหาเพราะลำดับที่ฉันสนใจบางส่วนจะไม่สอดคล้องกับ "เป็นคำนำหน้า"


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

2
ถ้าคุณใช้ serialization ของต้นไม้ด้วยคุณสมบัติต่อไปนี้: Tเป็นทรีย่อยของT ถ้าหากS ( T )เป็นซับสตริงของS ( T ) ? การสร้างตัวSนั้นตรงไปตรงมา [หากคุณพบต้นไม้ในแบบฟอร์มที่เป็นที่ยอมรับของคุณ] หลังจากนั้นคำถามของคุณเทียบเท่ากับการจับคู่สตริงย่อยซึ่งเป็นปัญหาที่ศึกษากันอย่างแพร่หลายในวิชาสตริง STTS(T)S(T)S
Jukka Suomela

1
ลองดูที่การจัดทำดัชนีในระยะ
starblue

1
ความคิดสั้น ๆ อีกอย่างหนึ่งก็คือการเก็บต้นไม้ทั้งหมด t1, t2, .. ในต้นไม้ใหญ่หนึ่งต้น T ซึ่งระลึกถึงขอบต้นไม้แต่ละชุดซึ่งเป็นส่วนหนึ่งของ จากนั้นในการตรวจสอบว่า f เป็นทรีย่อยของหนึ่งในแผนผังที่เก็บไว้หรือไม่ก่อนอื่นคุณต้องพิจารณาว่า f เป็นทรีย่อยใน T หรือไม่และถ้าใช่ให้ตัดชุดเซตขอบของทรีย่อยนั้นทั้งหมด คำตอบคือใช่ถ้าการตัดกันนั้นไม่ว่างเปล่า (คุณสามารถรวมสองขั้นตอน)
Martin B.

คำตอบ:


5

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

(อย่ากลัวว่าเอกสารที่เชื่อมโยงนั้นเกี่ยวกับ "โครงข่ายเครือข่ายในเครือข่ายชีวภาพ": g-trie เป็นโครงสร้างข้อมูลนามธรรมที่สมบูรณ์แบบสำหรับกราฟ)


4

รูปแบบพิเศษนี้คือการคงอยู่ : ดูเอกสารการทำโครงสร้างข้อมูลถาวรโดย Driscoll, Sarnak, Sleator, & Tarjan และตำแหน่งจุดระนาบโดยใช้แผนผังการค้นหาแบบถาวรโดย Sarnak & Tarjan ซึ่งเก็บครอบครัวของต้นไม้ที่เกี่ยวข้อง


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

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

1

ฟังดูเหมือนป่า (ป่าที่แยกจากกัน ) ...

มันตัดจำหน่ายค่าใช้จ่ายของการแทรกผ่านเทคนิคที่เรียกว่ายูเนี่ยนตามลำดับและการดำเนินการค้นหาโดยใช้การบีบอัดเส้นทาง ฉันรู้ว่ายังมีโครงสร้างแบบถาวรที่พัฒนาโดย Sylvain Conchon และ Jean-Christophe Filliâtre แต่ฉันไม่รู้ว่านี่เป็นสิ่งเดียวกับที่แจ็คกล่าวถึง ...



0

ใน "โครงสร้างข้อมูลที่ทำงานได้อย่างแท้จริง" (1998), Chris Okasaki เสนอความพยายามของต้นไม้ไบนารีโดยใช้การรวมประเภท (10.3.2)

ฉันไม่รู้ว่าจะช่วยได้ทันที โซลูชันที่ระบุอาจไม่สามารถนำไปใช้งานได้โดยตรง


0

ในศัพท์แสงโปรแกรมเมอร์: หากคุณสร้างต้นไม้จากนิพจน์ย่อย / ต้นไม้ / DAG ทั่วไปคุณจะมีโมเดลที่กะทัดรัด กราฟ Acyclic กำกับดังนั้น จากนั้นชุดของต้นไม้จะพอเพียง

ต้นไม้ระดับสาธารณะ {การดำเนินงาน String; ต้นไม้ [] subtrees;

public int compareTo(Tree rhs) {
    if (rhs == null) return false;
    int cmp = operation.compareTo(rhs.operation);
    if (cmp == 0) {
        cmp = Arrays.compareTo(subtrees, rhs.subtrees);
    }
    return cmp;
}

... }

แผนที่ commonSubExpressions = ใหม่ HashMap ();

Tree get (String expressionSyntax) {Tree t = new Tree (); t.operation = ... ; t.subtrees = ... การโทรซ้ำเพื่อรับฟังก์ชั่นย่อย Tree t2 = commonSubExpressions.get (t); ถ้า (t2 == null) {t2 = t; commonSubExpressions.put (t2, t2); } คืน t2; }}

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