โครงสร้างข้อมูลสำหรับการอัพเดตตามช่วงเวลาและการสอบถามจำนวนศูนย์


13

ฉันกำลังมองหาโครงสร้างข้อมูลที่จะรักษาตารางจำนวนเต็มขนาดและช่วยให้ดำเนินการต่อไปในเวลาn)n O ( บันทึกn )tnO(logn)

  • increase(a,b)ซึ่งจะเป็นการเพิ่ม[b]t[a],t[a+1],,t[b]
  • decrease(a,b)ซึ่งจะเป็นการลด[b]t[a],t[a+1],,t[b]
  • support()ซึ่งส่งกลับจำนวนของดัชนีเช่นว่า0t [ i ] 0it[i]0

คุณต้องสัญญาว่าการเรียกร้องให้ลดลงทุกสามารถจับคู่กับสายก่อนที่จะเพิ่มขึ้นด้วยพารามิเตอร์เดียวกัน B แอปพลิเคชันที่ฉันมีอยู่ในใจคืออัลกอริทึม sweepline เพื่อคำนวณในเวลาพื้นที่ของการรวมกันของ n ที่ได้รับสี่เหลี่ยมมุมฉากO ( n บันทึกn )a,bO(nlogn)

ต้นไม้สี่ต้นจะมีขนาดดังนั้นจึงไม่ใช่วิธีแก้ปัญหา ต้นเฟนวิคหรือต้นช่วงมีรสชาติที่เหมาะสม แต่ฉันไม่เห็นวิธีที่จะขยายพวกเขาเพื่อรองรับการดำเนินการข้างต้นΘ(n2)


ต้นไม้เฟนวิคจะไม่ใช้สัญญาว่า "ทุกการเรียกเพื่อลดสามารถจับคู่กับการโทรก่อนหน้าเพื่อเพิ่มด้วยพารามิเตอร์เดียวกัน a, b" ดังนั้นอาจมีวิธีการแก้ปัญหาที่ง่ายกว่าโดยใช้สัญญานั้น
Jeremy

เนื่องจากจำนวนอินพุตที่คุณมีได้มากที่สุด (คุณสามารถตรวจจับการซ้ำและไม่แทรกลงในโครงสร้างข้อมูล) เรายังคงได้รับประสิทธิภาพโดยใช้โครงสร้างข้อมูลการวัดต้นไม้ทั่วไป ดูcosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/…สไลด์ 47-52 O ( บันทึกn )n2O(logn)
Chao Xu

Jérémieและ Chao Xu ขอบคุณสำหรับความคิดเห็นของคุณ ตอนนี้ฉันเข้าใจแล้วว่าต้นไม้ช่วงเวลาสามารถใช้เพื่อรักษาความยาวรวมของการรวมกลุ่มของช่วงเวลาที่เปลี่ยนแปลง นี่คือโครงสร้างข้อมูลที่น่ารักมากจริงๆ
Christoph Dürr

สำหรับปัญหาโครงสร้างข้อมูลทั่วไปการค้นหาเวลาต้องใช้พื้นที่โดยที่คือขนาดของรายการ คู่ที่ใช้งานของพิกัด แต่แน่นอนสำหรับอัลกอริทึม sweeplineดังนั้นอวกาศจึงเป็นแบบเชิงเส้น ปัญหาคือยังคงเปิดให้บริการสำหรับโครงสร้างข้อมูลที่มีพื้นที่ดีกว่าเมื่อ(n) O ( p ) O ( n 2 ) p p log(n2)O(log(n))O(p)O(n2)pO ( P ) P โอห์ม( n )pO(n)O(p)pω(n)
Jeremy

2
นี่คือลิงค์ที่ดีที่คุณสามารถทดสอบการใช้งานกับโซลูชั่นอื่น ๆ กับปัญหาเดียวกัน: spoj.com/OI/problems/NKMARS
Erel Segal-Halevi

คำตอบ:


2

ใช้ต้นไม้เซกเมนต์ - พาร์ติชันแบบเรียกซ้ำของช่วงเป็นช่วงที่เล็กลง แต่ละช่วงเวลาของการดำเนินการอัพเดตของคุณสามารถแบ่งพาร์ติชันเป็นของช่วงในพาร์ติชันแบบเรียกซ้ำนี้ สำหรับแต่ละช่วง store:[ a , b ] O ( บันทึกn ) [ x , y ][1,n][a,b]O(logn)[x,y]

  • จำนวนของช่วงที่ได้รับการเพิ่มขึ้นและลดลงไม่เช่นนั้นเป็นหนึ่งในช่วงที่เป็นที่แบ่งพาร์ติชัน[ a , b ] [ x , y ] [ a , b ]c(x,y)[a,b][x,y][a,b]
  • จำนวนของเซลล์ที่ไม่ครอบคลุมโดยชุดย่อยที่แบ่งพาร์ติชันของช่วงเวลาที่เป็นหรือต่ำกว่าในการเรียกซ้ำ[ x , y ]u(x,y)[x,y]

จากนั้นถ้าถูกแบ่งซ้ำเป็นและเรามี เพื่อให้เราสามารถอัปเดตแต่ละค่าในเวลาคงที่เมื่อข้อมูลอื่นสำหรับ การเปลี่ยนแปลงช่วง แต่ละแบบสอบถามการสนับสนุนสามารถตอบได้โดยดูที่n)[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
u(x,y)u(1,n)

ในการดำเนินการเพิ่ม , แบ่งพาร์ติชันลงในช่วง , เพิ่มค่าสำหรับแต่ละช่วงเหล่านี้และใช้สูตรด้านบนเพื่อคำนวณสำหรับแต่ละช่วงเหล่านี้และแต่ละบรรพบุรุษของพวกเขา การดำเนินการลดลงจะเหมือนกันกับลดลงแทนการเพิ่มขึ้น[ a , b ] O ( บันทึกn ) c ( x , y ) u ( x , y )(a,b)[a,b]O(logn)c(x,y)u(x,y)


ฉันไม่คิดว่าฉันเข้าใจกระสุนนัดที่สองของคุณ ในทรีย่อยที่มีป้ายกำกับเน่าซึ่งเซลล์จะไม่ได้รับการคุ้มครองโดยการย่อยแบ่งพาร์ติชันของช่วงที่ ? ไม่ครอบคลุมช่วงทั้งหมดดังนั้นหรือไม่ [x,y][x,y][x,y]u(x,y)=0
jbapple

ขึ้นอยู่กับว่าคุณเพิ่มการดำเนินการใด เริ่มแรกพวกมันทั้งหมดจะถูกค้นพบ แต่เมื่อคุณเพิ่มช่วงเวลาเล็ก ๆ ภายใน (หรือช่วงเวลาใด ๆ ที่เริ่มต้นหรือสิ้นสุดภายในหรือที่มีในพาร์ติชัน) จะลดลง [x,y][x,y][x,y]
David Eppstein

คุณยกตัวอย่างได้ไหม
jbapple

สมมติว่าช่วงเวลาของคุณคือตัวเลข [1,8] มันแบ่งซ้ำเป็น [1,4], [4,8], จากนั้น [1,2], [3,4], [5,6] และ [7,8] จากนั้นช่วงหนึ่งองค์ประกอบทั้งหมด เริ่มแรกทุกอย่างจะถูกเปิดเผยทั้งหมด c [x, y] = 0 และแต่ละช่วงมี u = ความยาวของมัน แต่สมมติว่าคุณทำการเพิ่ม [2,6] ช่วงสูงสุด O (บันทึก n) ซึ่ง [2,6] สามารถจำแนกได้คือ [2,2], [3,4] และ [5,6] ดังนั้นเราจึงตั้งค่า c [x, y] สำหรับทั้งสาม ช่วงที่ 1 ตามสูตรในคำตอบของฉันนี่ทำให้ u [x, y] สำหรับสามช่วงนี้กลายเป็น 0. u [1,2] กลายเป็น 1, คุณ [1,4] กลายเป็น 1, u [ 5,8] = 2 และคุณ [1,8] = 1 + 2 = 3
David Eppstein

0

คุณสามารถสนับสนุนและในและในเวลา increasedecreaseO(nlogn)supportO(1)ความคิดที่สำคัญคือการทำลายขึ้นโต๊ะเป็นกลุ่มที่มีขนาด{n}) จากนั้นแต่ละการดำเนินการแก้ไข (หรือ ) ทำงานในกลุ่มมากที่สุดและมีเพียงกลุ่มที่ใกล้ถึงจุดสิ้นสุดของช่วง (และในสูตรของคุณ) ใช้เวลาเวลาΘ(n)increasedecreaseabω(บันทึกn)O(n)abω(logn)


ทำไมไม่ใช้วิธีนี้ถึงขีด จำกัด แทนที่จะเก็บไว้ในที่เก็บเราสามารถสร้างทรีที่คล้ายกับนี้ได้: 1 / \ 2 3 / \ / \ 4 5 6 7 ซึ่งจากการอัพเดทคุณใช้สำหรับการดำเนินการทั้งหมด O(บันทึกn)O(n)O(logn)
S. Pek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.