เข้าร่วมได้เร็วขึ้นของโครงสร้างข้อมูลที่เหมือน treap ที่มีขนาดใกล้เคียงกัน


16

ด้วยต้นไม้ AVL สองต้นT1และT2และค่าtrเช่นนั้นxT1,yT2,x<tr<y , มันง่ายที่จะสร้างต้นไม้ AVL ใหม่ที่ประกอบด้วยtrและค่า ในT1และT2ในเวลาO(1+|h(T1)h(T2)|)โดยที่h(T)หมายถึงความสูงของต้นไม้T (ตราบเท่าที่ต้นไม้เก็บความสูง)

นี่ก็เป็นไปได้สำหรับต้นไม้สีแดงดำและฉันก็ถือว่าต้นไม้ที่สมดุลหลายชนิดเช่นกัน

เป็นไปได้สำหรับโครงสร้างข้อมูลแบบทรีหรือทรีทเม้นต์หรือไม่? เกิดอะไรขึ้นถ้าเราปล่อยออกมาtr ?

Treaps paper ในอัลกอริทึมแสดงวิธีทำในO(min(h(T1),h(T2)))เวลาที่คาดหวัง หากมีวิธีการดำเนินการ O (1) คาดว่าจะเข้าร่วมใน treaps (หรือทรีพเหมือนโครงสร้างข้อมูล) ด้วยความเกรี้ยวกราดขนาดเดียวกัน (หรือความสำคัญราก) ผมคิดว่ามันอาจจะเป็นไปได้ที่จะใช้เคล็ดลับของ Kaplan & Tarjanของความร่วมมือ เงี่ยงเพื่อทำให้ treaps (หรือโครงสร้างข้อมูลเหมือน treap) ด้วยการเข้าร่วมแบบลอการิทึมทวีคูณ


นี่คือรหัส Haskell ที่ฉันเขียนแสดงการเข้าร่วมอย่างรวดเร็วของต้นไม้ AVL ที่มีขนาดเท่ากันโดยประมาณ: haskell.pastebin.com/nfGV8Ffz
jbapple

ฉันสงสัยว่าเป็นไปได้เพราะดูเหมือนว่า (ไม่มีหลักฐาน) ว่าความลึกที่คาดหวังของโหนดใหม่ (ที่มีค่า t_r) นั้นมากกว่าค่าคงที่แม้ในกรณีที่ h (T_1) = h (T_2)
Tsuyoshi Ito

Tsuyoshi Ito: ฉันเห็นด้วยถ้าคุณกำหนดลำดับความสำคัญของโหนดใหม่ในแบบเดียวกับที่คุณกำหนดลำดับความสำคัญให้กับโหนดอื่น ถ้าคุณกำหนดให้ระดับความสำคัญสูงกว่าโหนดรูท นั่นจะทำลายธรรมชาติของ IID ของลำดับความสำคัญ แต่ถ้าหากคุณทำเครื่องหมายลำดับความสำคัญอื่น ๆ ที่ถูกเลื่อนไปทางใดทางหนึ่งเช่นเส้นทางในต้นไม้สีแดงดำถาวรจะถูกทำเครื่องหมายที่จุดสิ้นสุด หรือจะเกิดอะไรขึ้นถ้าใครเก็บค่าไว้ในใบไม้ของทรีแอ็ปแล้วทำการรวมโดยไม่มี t_r?
jbapple

โหนดที่อยู่ในทริปที่มีผู้สืบทอด n รายฉันได้ทิ้งผู้สืบทอดที่มีความน่าจะเป็น 1 / n สิ่งนี้อาจนำไปสู่การผสานเวลาที่ยาวนานแม้สำหรับทรีทรีขนาดเท่า ๆ กันการเลือกรูตใหม่จำเป็นต้องใช้การนำทางซึ่งเนื่องจากความลึกเฉลี่ยในต้นไม้คือ Theta (lg n) และใช้เวลา Theta (lg n) ด้วย จะเกิดอะไรขึ้นถ้าโหนด treap ที่มี n สืบทอดมี i เหลือลูกด้วยความน่าจะเป็น (n เลือก i) / 2 ^ n, และค่าจะถูกเก็บไว้ที่ใบไม้เหมือนใน B + -tree จากนั้นการรวมกันสองขนาดที่เท่ากันแจกจ่ายองค์ประกอบจำนวนน้อยจากต้นไม้ต้นหนึ่งไปอีกต้นหนึ่งในความคาดหวัง
jbapple

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

คำตอบ:


3

ไม่เป็นไปไม่ได้ที่จะทำเช่นนี้กับทรีเอฟธรรมดาถ้าลำดับความสำคัญเป็นแบบสุ่ม

การเรียกร้องที่แม่นยำฉันจะทำให้เป็นที่ที่จะดำเนินการเช่นการผสานสอง treaps ขนาดเท่า ๆ กันกับลำดับความสำคัญแบบสุ่มต้องอัปเดตตัวชี้ในความคาดหวังΘ(logn)

นี่คือภาพร่างหลักฐานคร่าวๆ:

พิจารณาจำนวนพอยน์เตอร์ที่คุณต้องเปลี่ยนตามความคาดหมายเพื่อดำเนินการ มันง่ายที่จะพิสูจน์ที่ถูกผูกไว้ถ้าเราทำไม่ได้ใส่เสื้อRแต่เพียงผสานT 1และT 2 พิจารณากระดูกสันหลังขวาS 1ของT 1และกระดูกสันหลังซ้ายS 2ของT 2 สีองค์ประกอบของS 1สีแดงและสีS 2สีน้ำเงิน คำสั่งS 1S 2Θ(logn)trT1T2S1T1S2T2S1S2S1S2โดยลำดับความสำคัญ เราต้องเปลี่ยนพอยน์เตอร์ในแต่ละครั้งที่สีเปลี่ยนไปในลำดับนี้ เนื่องจากทั้งสองมีหนามขนาดมีโอกาสสูงและจัดลำดับความสำคัญเป็นแบบสุ่มก็ไม่ยากเกินไปที่จะเห็นว่า # ของการเปลี่ยนแปลงสีในลำดับนอกจากนี้ยังมีΘ ( บันทึกn ) ดังนั้นเราจำเป็นต้องอัพเดตพอยน์เตอร์Θ ( log n )สำหรับการรวม (โดยไม่ต้องเพิ่มt r )Θ(logn)Θ(logn)Θ(logn)tr

ตอนนี้เพิ่มในขณะที่ทำผสานไม่ได้จริงๆช่วยมาก จำนวนการเปลี่ยนแปลงของตัวชี้ในกรณีนั้นสามารถถูก จำกัด ขอบเขตที่ต่ำกว่าดังนี้: ลำดับS 1S 2{ t r }ตามลำดับความสำคัญ ทุกอย่างลบน้อยกว่าทีอาร์ในลำดับ จากนั้นจำนวนการเปลี่ยนสีในลำดับที่ได้คือขอบเขตล่างของเรา เนื่องจากt rมีลำดับความสำคัญแบบสุ่มความสูงที่คาดหวังของทรีย่อยจะถูกฝังที่ทรีสุดท้ายคือO ( 1 )ดังนั้นจึงมีเพียงโหนดO ( 1 )ของS 1trS1S2{tr}trtrO(1)O(1)มีลำดับความสำคัญต่ำกว่าในความคาดหวังเพื่อให้เราหายไปเพียง O ( 1 )การเปลี่ยนแปลงตัวชี้ของเราผูกพันที่ต่ำกว่าเมื่อมีการเพิ่มทีอาร์S1S2O(1)tr

ตอนนี้ที่กล่าวว่าอาจมีวิธีการรับโครงสร้างข้อมูล "เหมือน treap" ซึ่งช่วยให้การรวมเวลาที่คาดไว้คงที่


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

ขอบคุณสำหรับคำตอบ. ฉันได้เปลี่ยนชื่อและข้อความของคำถามเพื่อให้คลุมเครือน้อยลง
jbapple

1

อัปเดต: ดูด้านล่างสำหรับการอัปเดตเกี่ยวกับความไม่ถูกต้องของการดำเนินการเข้าร่วมนี้

นี่เป็นภาพร่างคร่าวๆของโซลูชันที่เป็นไปได้:

ฉันคิดว่าฉันอาจมีวิธีแก้ปัญหานี้โดยใช้ B + -tree-balanced แบบสุ่ม ต้นไม้เหล่านี้มีรูปแบบที่ไม่เหมือนใคร พวกเขาเก็บกุญแจไว้หลายครั้งไม่เหมือนทรี อาจเป็นไปได้ที่จะแก้ไขด้วยการใช้เล่ห์เหลี่ยมจาก "Biased Search Trees" ของ Bent et al ในการจัดเก็บแต่ละคีย์เฉพาะในระดับสูงสุด (นั่นคือใกล้เคียงกับรูต) ที่ปรากฏขึ้น)

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

ทุกโหนดภายในมี (เช่นใน B + -trees) คีย์k ที่ใหญ่ที่สุดของการสืบทอดสืบทอด แต่ละคนยังมีจำนวนธรรมชาติฉันแสดงความสูงของต้นไม้ที่รากที่vและกระแสของบิตที่เกี่ยวข้องกับkจากi + 1บิตเป็นต้นไป ถ้าคีย์ในต้นไม้ที่หยั่งรากทุกที่โวลต์มีบิตแรกเหมือนกันในกระแสบิตของเด็กของทุกวีเป็นใบและฉันเป็น1 มิฉะนั้น children ของvคือโหนดภายในซึ่งทั้งหมดนี้มีiบิตเดียวกันในบิตสตรีมที่เชื่อมโยงกับคีย์ของพวกเขาvkivki+1vvi1vi

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

รายการของคีย์และกระแสบิต (เริ่มต้น) ต่อไปนี้จะแสดงเป็นต้นไม้ด้านล่าง ในส่วนนำหน้าบิตสตรีม a '.' หมายถึงบิตใด ๆ นั่นคือบิตสตรีมใด ๆ สำหรับคีย์ A ที่มี 0 ในตอนแรกที่สร้างทรีเดียวกันกับอื่น ๆ โดยสมมติว่าไม่มีบิตสตรีมของคีย์อื่นที่แตกต่างกัน

A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001


        ____H____
       /         \
      E           H
      |          / \
    __E__       G   H
   /  |  \      |   |
  B   C   E     G   H
 / \  |  / \   / \  |
A   B C D   E F   G H

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

สมมติว่าบิตในสตรีมบิตเป็น IID จากการแจกแจงแบบสม่ำเสมอ PMF ของจำนวนพาเรนต์ของโหนดคือ 2 1 - n ( n - 1n21n และมูลค่าที่คาดว่าจะเป็น(n+1)/2 สำหรับn2ทั้งหมดนี่คือ3(n1i1)(n+1)/2n2ดังนั้นความสูงของต้นไม้ที่คาดไว้คือO(LGn)34nO(lgn)

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

มีการเรียกซ้ำสองครั้งในอัลกอริทึมนี้ อย่างแรกคือเมื่อรากมีสีเดียวกันส่วนที่สองคือเมื่อรากมีสีและรสชาติที่แตกต่างกัน รากมีสีเดียวกันกับความน่าจะเป็น 2 การเรียกซ้ำในกรณีนี้จะเห็นรากที่มีรสชาติเหมือนกันเสมอดังนั้นการเรียกซ้ำครั้งที่สองจะไม่เกิดขึ้นหลังจากครั้งแรก แต่คนแรกที่สามารถเกิดขึ้นได้ซ้ำ ๆ แต่ทุกครั้งที่มีความน่าจะเป็น1 / 2ดังนั้นเวลาทำงานคาดว่ายังคงเป็นO ( 1 ) โทร recursive ที่สองที่เกิดขึ้นกับความน่าจะเป็น1 / 41/21/2O(1)1/4และการเรียกซ้ำที่ตามมามักจะอยู่บนต้นไม้ที่มีสีต่างกันเสมอ

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

O(1)

a 01110
b 110..
c 10...
d 00000

ต้นไม้ที่ทำโดย[a,b]มีความสูง 2 ต้นไม้ที่ทำโดย[c,d]มีความสูง 2 และต้นไม้ที่ทำโดยjoinEqual (tree [a,b]) (tree [c,d])มีความสูง 3 อย่างไรก็ตามต้นไม้ที่ทำโดยมีความสูง 3 อย่างไรก็ตามต้นไม้ที่ทำโดย[a,b,c,d]มีความสูง 2

นี่คือรหัสที่ฉันใช้เพื่อค้นหาข้อผิดพลาดนี้

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