คำถามติดแท็ก data-structures

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

1
มีโครงสร้างข้อมูลที่มีขนาดคงที่และจะผลักองค์ประกอบที่เก่าที่สุด / สุดท้ายออกหากใส่องค์ประกอบใหม่หรือไม่
ฉันกำลังมองหาโครงสร้างข้อมูลที่จะผลักองค์ประกอบที่เก่าที่สุด / สุดท้ายออกหากมีการแทรกองค์ประกอบใหม่ ตัวอย่างเช่นให้Dเป็นตัวแทนของโครงสร้าง Dมี 3 องค์ประกอบของประเภทNumber Dของค่าเริ่มต้นจะเริ่มต้นได้และ1, 23 D = [ 1 , 2 , 3 ]D=[1,2,3]D = [1, 2, 3] หากผู้Numberที่มีค่าที่5ถูกแทรกลงD, 3จะถูกผลักออกไปในขณะที่1และ2จะถูกเลื่อนขวา D = [ 5 , 1 , 2 ]D=[5,1,2]D = [5, 1, 2] สิ่งแรกที่อยู่ในใจคืออาร์เรย์ แต่คำจำกัดความไม่รวมถึงพฤติกรรมการผลัก

1
ปัญหาที่อัลกอริทึมที่ยึดตามการปรับแต่งพาร์ติชันทำงานเร็วกว่าในเวลาบันทึก
การปรับแต่งพาร์ติชันเป็นเทคนิคที่คุณเริ่มต้นด้วยชุด จำกัด ของวัตถุและแบ่งชุดอย่างต่อเนื่อง ปัญหาบางอย่างเช่นการย่อขนาด DFA สามารถแก้ไขได้โดยใช้การปรับแต่งพาร์ติชันอย่างมีประสิทธิภาพ ฉันไม่ทราบปัญหาอื่น ๆ ที่มักแก้ไขได้โดยใช้การปรับแต่งพาร์ติชันที่นอกเหนือจากที่ระบุไว้ในหน้า Wikipedia จากปัญหาเหล่านี้ทั้งหมดหน้า Wikipedia กล่าวถึงสองขั้นตอนวิธีซึ่งใช้การปรับแต่งพาร์ติชันในเวลาเชิงเส้น มีการจัดเรียงทอพอโลยีแบบเรียงลำดับตามคำศัพท์ [1] และอัลกอริธึมสำหรับการค้นหาพจนานุกรมแบบกว้างคำแรก [2] มีตัวอย่างอื่น ๆ หรือการอ้างอิงถึงปัญหาที่สามารถแก้ไขได้โดยใช้การปรับแต่งพาร์ทิชันอย่างมีประสิทธิภาพมากหมายถึงสิ่งที่ดีกว่า loglinear ในแง่ของเวลา? [1] Sethi, Ravi, "กราฟการกำหนดเวลาในโปรเซสเซอร์สองตัว", SIAM Journal on Computing 5 (1): 73–82, 1976 [2] Rose, DJ, Tarjan, RE, Lueker, GS, "อัลกอริทึมของการกำจัดจุดยอดบนกราฟ", SIAM Journal on Computing 5 (2): 266–283, 1976

1
สนับสนุนโครงสร้างข้อมูลสำหรับการค้นหาในท้องถิ่นของ SAT
WalkSAT และ GSATเป็นอัลกอริทึมการค้นหาในท้องถิ่นที่รู้จักกันดีและเรียบง่ายสำหรับการแก้ปัญหาความพึงพอใจบูลีน pseudocode สำหรับอัลกอริทึม GSAT ถูกคัดลอกมาจากคำถามการใช้อัลกอริทึม GSAT - วิธีการเลือกตัวอักษรที่จะพลิก? และนำเสนอด้านล่าง procedure GSAT(A,Max_Tries,Max_Flips) A: is a CNF formula for i:=1 to Max_Tries do S <- instantiation of variables for j:=1 to Max_Iter do if A satisfiable by S then return S endif V <- the variable whose flip yield the …

2
การสร้างแผนภูมิต้นไม้สั่งซื้อด้วยตนเอง
ฉันมีการมอบหมายที่ฉันต้องใช้ต้นไม้ค้นหาแบบทวิภาคและปรับเปลี่ยนเพื่อเรียงลำดับตัวเองเช่นรายการที่เข้าถึงได้มากที่สุด (มีลำดับความสำคัญสูงกว่า) อยู่ที่ด้านบนของต้นไม้รากเป็นโหนดที่เข้าถึงได้มากที่สุด . ศาสตราจารย์ให้ BST และโหนดโครงสร้างเพื่อทำงานร่วมกับฉัน แต่การพยายามเอาสมองของฉันไปรอบ ๆ อัลกอริทึมเพื่ออัปเดตต้นไม้เมื่อสิ่งต่าง ๆ แทรกอยู่ทำให้ฉันสับสน ฉันรู้ว่าเมื่อมีการแทรกเกิดขึ้นมันจะตรวจสอบว่าข้อมูลของโหนดปัจจุบันน้อยกว่าหรือมากกว่าโหนดปัจจุบันจากนั้นจะวนซ้ำในทิศทางที่ถูกต้องจนกว่าจะพบตัวชี้ null และแทรกตัวเองที่นั่น และหลังจากใส่แล้วจะเพิ่มระดับความสำคัญเป็น 1 template <class Type> void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t ) { if( t == NULL ) t = new BinaryNode<Type>( x, NULL, NULL ); else if( x …

5
การบีบอัดที่มีประสิทธิภาพของต้นไม้ที่ไม่มีชื่อ
พิจารณาต้นไม้ไบนารีแบบไม่มีป้ายกำกับ เราสามารถบีบอัดต้นไม้ดังกล่าวเมื่อมีการชี้ไปยัง subtreesและกับ (การตีความความเท่าเทียมกันของโครงสร้าง) เราเก็บ (WLOG)และแทนที่คำแนะนำทุกคนที่จะกับตัวชี้ไปยังTดูคำตอบของ uliสำหรับตัวอย่างT ′ T = T ′ = T T ′ TTTTT'T′T'T= T'T=T′T = T'===TTTT'T′T'TTT ให้อัลกอริทึมที่ใช้ต้นไม้ในความหมายข้างต้นเป็นอินพุตและคำนวณจำนวนโหนดที่เหลือหลังจากการบีบอัด อัลกอริทึมควรใช้ในเวลาที่ (ในรูปแบบค่าใช้จ่ายในเครื่องแบบ) กับจำนวนโหนดในการป้อนข้อมูลnO (nบันทึกn )O(nlog⁡n)\cal{O}(n\log n)nnn นี่เป็นคำถามสอบและฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีและฉันไม่ได้เห็น

2
ต้นไม้ที่ถูกลิงค์ตัดเคยถูกใช้ในทางปฏิบัติสำหรับการคำนวณการไหลสูงสุดหรือการใช้งานอื่น ๆ หรือไม่?
อัลกอริธึมการไหลสูงสุดจำนวนมากที่ฉันเห็นโดยทั่วไปว่านำไปใช้งานอัลกอริทึมของ Dinic พุช relabel และอื่น ๆ สามารถทำให้ต้นทุนเวลาของพวกเขาดีขึ้นด้วยการใช้ต้นไม้ไดนามิก (หรือที่รู้จักกันในชื่อต้นไม้ตัดลิงก์) Push relabel ทำงานในหรือหรือตามปกติ แต่มีต้นไม้แบบไดนามิกO ( V2E)O(V2E)O(V^2E)O ( V3)O(V3)O(V^3)O ( V2E--√)O(V2E)O(V^2\sqrt{E})O ( VEเข้าสู่ระบบ( ฉบับที่2/ E) )O(VElog⁡(V2/E))O(VE \log(V^2/E)) อัลกอริทึมของ Dinic ทำงานในแต่ด้วยต้นไม้แบบไดนามิกO ( V2E)O(V2E)O(V^2E)O ( VEเข้าสู่ระบบ( ฉบับที่) )O(VElog⁡(V))O(VE\log(V)) อย่างไรก็ตามการใช้งานจริงของอัลกอริธึม max-flow ในไลบรารีส่วนใหญ่ดูเหมือนจะไม่ใช้ประโยชน์จากโครงสร้างข้อมูลนี้ ต้นไม้แบบไดนามิกเคยใช้ในทางปฏิบัติสำหรับการคำนวณการไหลสูงสุดหรือไม่ หรือพวกเขามีค่าใช้จ่ายมากเกินไปที่จะเป็นประโยชน์สำหรับขนาดของปัญหาโลกแห่งความจริง? มีโดเมนปัญหาอื่น ๆ อีกหรือไม่ที่มีการใช้การเชื่อมโยงทรี? คำถามนี้เกี่ยวข้องกับคำถามที่ฉันถามใน cstheory: มีอัลกอริธึม Maximum Flow อันทันสมัยที่สุดหรือไม่?

1
เหตุใดการเขียนโปรแกรมแบบไม่ทำงานจึงค้นคว้าต้นไม้แบบไดนามิก
ต้นไม้ไดนามิกมีบทบาทสำคัญในการแก้ปัญหาต่าง ๆ เช่นการไหลของเครือข่ายกราฟไดนามิกปัญหา combinatorial ("Dynamic Trees in Practice" โดย Tarjan และ Werneck) และเมื่อเร็ว ๆ นี้ได้รวมพจนานุกรม ("A Mergeable Dictionary" โดย Adam Karczmarz) โดยต้นไม้ไดนามิกฉันอ้างถึงคำจำกัดความที่ระบุไว้ในกระดาษของ Sleator & Tarjan "โครงสร้างข้อมูลสำหรับต้นไม้ไดนามิก" ในปี 1983 ความพยายามน้อยได้รับการเผยแพร่ภายในขอบเขตการวิจัยการเขียนโปรแกรมการทำงานตั้งแต่ เอ็ดเวิร์ด Kmett ดำเนินการรุ่นของต้นไม้ ST ส่วนใหญ่เป็นคำแปลของภาษา C ++ คู่ให้ดูต้นไม้ Link-ตัด Chris Okasaki เขียนการนำต้นไม้ Splay ไปใช้อย่าง จำกัด ในหนังสือที่โด่งดังของเขา Ralf Hinze และ Ross Paterson …

12
โครงสร้างข้อมูลหรืออัลกอริทึมสำหรับค้นหาความแตกต่างระหว่างสตริงได้อย่างรวดเร็ว
ฉันมีอาร์เรย์ของ 100,000 สตริงทั้งหมดของความยาวkkkkฉันต้องการเปรียบเทียบแต่ละสตริงกับสตริงอื่น ๆ เพื่อดูว่ามีสองสตริงที่แตกต่างกัน 1 อักขระหรือไม่ ตอนนี้ที่ผมเพิ่มแต่ละสายไปยังอาร์เรย์ที่ฉันตรวจสอบกับทุกสตริงแล้วในอาร์เรย์ซึ่งมีความซับซ้อนเวลาของการkn(n−1)2kn(n−1)2k\frac{n(n-1)}{2} k มีโครงสร้างข้อมูลหรืออัลกอริทึมที่สามารถเปรียบเทียบสตริงได้เร็วกว่าสิ่งที่ฉันกำลังทำอยู่หรือไม่? ข้อมูลเพิ่มเติมบางส่วน: หัวข้อการสั่งซื้อ: abcdeและxbcdeแตกต่างกัน 1 ตัวอักษรในขณะที่abcdeและedcbaแตกต่างกัน 4 ตัว สำหรับแต่ละคู่ของสตริงที่แตกต่างกันโดยตัวละครตัวหนึ่งฉันจะลบหนึ่งในสายเหล่านั้นออกจากอาร์เรย์ ตอนนี้ฉันกำลังมองหาสตริงที่แตกต่างกันเพียง 1 ตัวอักษร แต่มันจะดีถ้าความแตกต่างของตัวละคร 1 ตัวนั้นสามารถเพิ่มขึ้นได้เช่น 2, 3 หรือ 4 ตัวอักษร อย่างไรก็ตามในกรณีนี้ฉันคิดว่าประสิทธิภาพสำคัญกว่าความสามารถในการเพิ่มขีดจำกัดความแตกต่างของตัวละคร kkkมักจะอยู่ในช่วง 20-40

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

1
max-heaps ที่แตกต่างกันมีอยู่เท่าไหร่สำหรับรายการจำนวนเต็ม n ตัว?
max-heaps ที่แตกต่างกันมีอยู่เท่าไหร่สำหรับรายการจำนวนเต็มnnnตัว? ตัวอย่าง: รายการ [1, 2, 3, 4] heap สูงสุดสามารถเป็นได้ทั้ง4 3 2 1: 4 / \ 3 2 / 1 หรือ4 2 3 1: 4 / \ 2 3 / 1

1
ผลรวมถ่วงน้ำหนักของหมายเลข N ล่าสุด
สมมติว่าเราได้รับตัวเลขในสตรีม หลังจากได้รับแต่ละตัวเลขแล้วจะต้องคำนวณผลรวมถ่วงน้ำหนักของตัวเลขสุดท้ายโดยที่น้ำหนักจะเหมือนกันเสมอ แต่ตามอำเภอใจNNN ทำได้อย่างมีประสิทธิภาพแค่ไหนหากเราได้รับอนุญาตให้เก็บโครงสร้างข้อมูลไว้เพื่อช่วยในการคำนวณ? เราสามารถทำได้ดีกว่าคือการคำนวณผลรวมทุกครั้งที่ได้รับตัวเลขหรือไม่Θ(N)Θ(N)\Theta(N) ตัวอย่างเช่นสมมติว่าน้ำหนักที่มีw_4 เมื่อมาถึงจุดหนึ่งที่เรามีรายชื่อของที่ผ่านมาตัวเลขและน้ำหนักรวม dW=⟨w1,w2,w3,w4⟩W=⟨w1,w2,w3,w4⟩W= \langle w_1, w_2, w_3, w_4\rangleNNNL1=⟨a,b,c,d⟩>L1=⟨a,b,c,d⟩>L_1= \langle a, b, c, d \rangle>S1=w1∗a+w2∗b+w3∗c+w4∗dS1=w1∗a+w2∗b+w3∗c+w4∗dS_1=w_1*a+w_2*b+w_3*c+w_4*d เมื่อจำนวนอีกจะได้รับเราปรับปรุงรายการที่จะได้รับและเราจำเป็นต้องคำนวณ .eeeL2=⟨b,c,d,e⟩L2=⟨b,c,d,e⟩L_2= \langle b,c,d,e\rangleS2=w1∗b+w2∗c+w3∗d+w4∗eS2=w1∗b+w2∗c+w3∗d+w4∗eS_2=w_1*b+w_2*c+w_3*d+w_4*e การพิจารณาโดยใช้ FFT กรณีพิเศษของปัญหานี้ดูเหมือนจะแก้ไขได้อย่างมีประสิทธิภาพโดยใช้การแปลงฟูริเยร์อย่างรวดเร็ว ที่นี่เราคำนวณจำนวนเงินชั่งน้ำหนักหลายรายการNกล่าวอีกนัยหนึ่งเราได้รับหมายเลขNและจากนั้นเราสามารถคำนวณผลรวมNน้ำหนักที่เกี่ยวข้อง การทำเช่นนี้เราต้องN-1หมายเลขที่ผ่านมา (ซึ่งจำนวนเงินที่ได้รับการคำนวณแล้ว) และยังไม่มีตัวเลขใหม่ทั้งหมด2N-1หมายเลขSSSNNNNNNNNNN−1N−1N-1NNN2N−12N−12N-1 ถ้าเวกเตอร์ของตัวเลขอินพุตและเวกเตอร์น้ำหนักWWWกำหนดสัมประสิทธิ์ของพหุนามP(x)P(x)P(x)และQ(x)Q(x)Q(x)โดยมีค่าสัมประสิทธิ์ในQQQกลับด้านเราจะเห็นว่าผลิตภัณฑ์P(x)×Q(x)P(x)×Q(x)P(x)\times Q(x)เป็น พหุนามซึ่งมีค่าสัมประสิทธิ์อยู่ด้านหน้าxN−1xN−1x^{N-1}สูงสุดx2N−2x2N−2x^{2N-2}เป็นผลรวมของน้ำหนักที่เราแสวงหา สิ่งเหล่านี้สามารถคำนวณได้โดยใช้ FFT ในเวลาΘ(N∗log(N))Θ(N∗log⁡(N))\Theta(N*\log (N))ซึ่งทำให้เรามีเวลาเฉลี่ยΘ(log(N))Θ(log⁡(N))Θ(\log (N))ต่อจำนวนอินพุต อย่างไรก็ตามนี่ไม่ใช่วิธีแก้ปัญหาตามที่ระบุไว้เนื่องจากจำเป็นต้องมีการคำนวณผลรวมถ่วงน้ำหนักอย่างมีประสิทธิภาพทุกครั้งที่รับหมายเลขใหม่ - เราไม่สามารถหน่วงเวลาการคำนวณได้

1
การทำงานของอัลกอริทึมของ Ukkonen ขึ้นอยู่กับขนาดตัวอักษรอย่างไร
ฉันกังวลกับคำถามเกี่ยวกับเวลาที่ใช้ในการทำงานแบบไม่แสดงอาการของอัลกอริทึมของ Ukkonenซึ่งอาจเป็นอัลกอริทึมที่ได้รับความนิยมมากที่สุดสำหรับการสร้างต้นไม้ต่อท้ายในเวลาเชิงเส้น (?) นี่คือการอ้างอิงจากหนังสือ "อัลกอริทึมในสตริงต้นไม้และลำดับ" โดย Dan Gusfield (ส่วน 6.5.1): "... อัลกอริธึมAho-Corasick, Weiner, Ukkonenและ McCreight นั้นต้องการพื้นที่หรือเวลาต้องถูกแทนที่ด้วยค่าต่ำสุดของและ "Θ(m|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)O(m)O(m)O(m)O(mlogm)O(mlog⁡m)O(m \log m)O(mlog|Σ|)O(mlog⁡|Σ|)O(m \log|\Sigma|) [คือความยาวสตริงและคือขนาดของตัวอักษร]mmmΣΣ\Sigma ฉันไม่เข้าใจว่าทำไมถึงเป็นจริง พื้นที่:ดีในกรณีที่เราเป็นตัวแทนของสาขาออกจากโหนดใช้อาร์เรย์ขนาดแล้วแน่นอนเราจบลงด้วยการใช้พื้นที่ อย่างไรก็ตามเท่าที่ฉันเห็นมันเป็นไปได้ที่จะจัดเก็บกิ่งไม้โดยใช้ตารางแฮช (เช่นพจนานุกรมใน Python) จากนั้นเราจะมีเฉพาะตัวชี้เก็บไว้ในตารางแฮชทั้งหมด (เนื่องจากมีขอบในต้นไม้) ในขณะที่ยังคงสามารถเข้าถึงโหนดลูกในเวลาเร็วที่สุด เช่นเดียวกับเมื่อใช้อาร์เรย์Θ(|Σ|)Θ(|Σ|)\Theta(|\Sigma|)Θ(m|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)Θ(m)Θ(m)\Theta(m)Θ(m)Θ(m)\Theta(m)O(1)O(1)O(1) เวลา : ดังกล่าวข้างต้นโดยใช้ตารางแฮชช่วยให้เราสามารถเข้าถึงสาขาขาออกของโหนดใด ๆ ในเวลา ตั้งแต่ขั้นตอนวิธี Ukkonen ต้องใช้การดำเนินงาน (รวมถึงการเข้าถึงโหนดเด็ก) เวลาการทำงานโดยรวมแล้วจะเป็นยัง(เมตร)O(1)O(1)O(1)O(m)O(m)O(m)O(m)O(m)O(m) ฉันจะขอบคุณคุณเป็นอย่างมากสำหรับคำแนะนำใด ๆ ว่าทำไมฉันถึงเข้าใจผิดในข้อสรุปของฉันและทำไม Gusfield ถึงถูกต้องเกี่ยวกับการพึ่งพาอัลกอริทึมของ Ukkonen ในตัวอักษร

1
ประหยัดในการเริ่มต้นอาร์เรย์
ฉันเพิ่งอ่านว่ามันเป็นไปได้ที่จะมีอาร์เรย์ที่ไม่จำเป็นต้องเริ่มต้นคือมันเป็นไปได้ที่จะใช้พวกเขาโดยไม่ต้องใช้เวลาพยายามตั้งสมาชิกแต่ละคนเป็นค่าเริ่มต้น เช่นคุณสามารถเริ่มใช้อาร์เรย์ราวกับว่ามันได้รับการเริ่มต้นโดยค่าเริ่มต้นโดยไม่ต้องเริ่มต้นได้ (ขออภัยฉันจำไม่ได้ว่าอ่านตรงไหน) ตัวอย่างเช่นสาเหตุที่อาจเป็นเรื่องน่าประหลาดใจ: สมมติว่าคุณกำลังพยายามที่จะจำลอง ที่เลวร้ายที่สุดกรณี Hashtable (สำหรับแต่ละแทรก / search / ลบ) ของจำนวนเต็มในช่วง[ 1 , n 2 ]O (1)O(1)\mathcal{O}(1)[ 1 , n2][1,n2][1, n^2] คุณสามารถจัดสรรอาเรย์ที่มีขนาดบิต2บิตและใช้แต่ละบิตเพื่อแสดงการมีอยู่ของจำนวนเต็มใน hashtable หมายเหตุ: หน่วยความจำจัดสรรถือว่าO ( 1 )เวลาn2n2n^2O (1)O(1)\mathcal{O}(1) ตอนนี้ถ้าคุณไม่ได้มีการเริ่มต้นอาร์เรย์นี้ทั้งหมดลำดับใด ๆ ของการพูดดำเนินการเมื่อวัน Hashtable ตอนนี้กรณีที่เลวร้ายO ( n )nnnO (n)O(n)\mathcal{O}(n) ดังนั้นในความเป็นจริงคุณจะต้องมีการนำแฮช "สมบูรณ์แบบ" มาใช้ซึ่งลำดับของการปฏิบัติการใช้พื้นที่Θ ( n 2 )แต่ทำงานในเวลาO ( n ) …

5
การใช้ "ต้นไม้" เร็วที่สุดในวิทยาการคอมพิวเตอร์คืออะไร?
ฉันมีคำถามประวัติเล็กน้อยคือตามที่ชื่อบอกว่าฉันกำลังมองหาการใช้ต้นไม้ในช่วงต้น (เช่นโครงสร้างข้อมูลต้นไม้ค้นหาอะไรก็ตาม) ในสาขาวิทยาศาสตร์คอมพิวเตอร์

2
อัลกอริทึมที่มีประสิทธิภาพสำหรับปัญหาการมองเห็นในแนวตั้ง
ในระหว่างที่คิดถึงปัญหาหนึ่งฉันรู้ว่าฉันต้องสร้างอัลกอริทึมที่มีประสิทธิภาพในการแก้ไขงานต่อไปนี้: ปัญหา:เราได้รับกล่องสี่เหลี่ยมสองมิติของด้านซึ่งด้านขนานกับแกน เราสามารถตรวจสอบมันผ่านด้านบน อย่างไรก็ตามยังมีส่วนแนวนอนแต่ละเซกเมนต์มีจำนวนเต็ม -coordinate ( ) และ -coordinates ( ) และเชื่อมต่อจุดและ (ดูที่ ภาพด้านล่าง)nnnmmmyyy0≤y≤n0≤y≤n0 \le y \le nxxx0≤x1&lt;x2≤n0≤x1&lt;x2≤n0 \le x_1 < x_2 \le n(x1,y)(x1,y)(x_1,y)(x2,y)(x2,y)(x_2,y) เราอยากทราบว่าแต่ละเซ็กเมนต์ที่ด้านบนของกล่องเราจะมองลึกเข้าไปในแนวตั้งได้อย่างไรถ้ามองผ่านเซ็กเมนต์นี้ อย่างเป็นทางการสำหรับx∈{0,…,n−1}x∈{0,…,n−1}x \in \{0,\dots,n-1\}เราต้องการหาmaxi: [x,x+1]⊆[x1,i,x2,i]yimaxi: [x,x+1]⊆[x1,i,x2,i]yi\max_{i:\ [x,x+1]\subseteq[x_{1,i},x_{2,i}]} y_iy_i ตัวอย่าง: รับn=9n=9n=9และm=7m=7m=7กลุ่มตั้งอยู่ในภาพด้านล่างผลที่ได้คือ(5,5,5,3,8,3,7,8,7)(5,5,5,3,8,3,7,8,7)(5, 5, 5, 3, 8, 3, 7, 8, 7)7) ดูว่าแสงที่ลึกสามารถเข้าไปในกล่องได้ โชคดีสำหรับเราทั้งnnnและmmmมีขนาดค่อนข้างเล็กและเราสามารถทำการคำนวณแบบออฟไลน์ได้ อัลกอริธึมที่ง่ายที่สุดในการแก้ปัญหานี้คือแรงเดรัจฉาน: สำหรับแต่ละเซกเมนต์เคลื่อนที่อาร์เรย์ทั้งหมดและอัพเดตในกรณีที่จำเป็น แต่ก็จะช่วยให้เราไม่ได้น่าประทับใจมากO(mn)O(mn)O(mn)(ล้านบาท) การปรับปรุงที่ดีมากคือการใช้แผนภูมิส่วนซึ่งสามารถเพิ่มค่าสูงสุดในส่วนในระหว่างการค้นหาและอ่านค่าสุดท้าย ผมจะไม่อธิบายมันต่อไป แต่เราจะเห็นว่าเวลาซับซ้อนคือn)O((m+n)logn)O((m+n)log⁡n)O((m+n) …

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