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

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

6
การสร้างชุดค่าผสมจากชุดคู่โดยไม่มีการทำซ้ำองค์ประกอบ
ฉันมีชุดของคู่ แต่ละคู่เป็นรูปแบบ (x, y) เช่นว่า x, y [0,n)เป็นจำนวนเต็มจากช่วง ดังนั้นถ้า n คือ 4 ดังนั้นฉันมีคู่ต่อไปนี้: (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) ฉันมีคู่แล้ว ตอนนี้ฉันต้องสร้างชุดค่าผสมโดยใช้n/2คู่ที่ไม่มีจำนวนเต็มซ้ำ (กล่าวอีกอย่างหนึ่งว่าจำนวนเต็มแต่ละค่าปรากฏอย่างน้อยหนึ่งครั้งในชุดค่าผสมสุดท้าย) ต่อไปนี้เป็นตัวอย่างของชุดค่าผสมที่ถูกต้องและไม่ถูกต้องเพื่อความเข้าใจที่ดีขึ้น 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] มีคนแนะนำฉันถึงวิธีในการสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดเมื่อฉันมีคู่

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

2
โครงสร้างข้อมูลพร้อมการค้นหาแทรกและลบในเวลาตัดจำหน่าย
มีโครงสร้างข้อมูลเพื่อรักษารายการที่สั่งซื้อซึ่งสนับสนุนการดำเนินการต่อไปนี้ในเวลาตัดจำหน่ายหรือไม่O ( 1 )O(1)O(1) GetElement (k) : ส่งคืนองค์ประกอบที่ของรายการkkk InsertAfter (x, y) : ใส่องค์ประกอบใหม่ y ลงในรายการทันทีหลังจาก x ลบ (x) : ลบ x ออกจากรายการ สำหรับการดำเนินการสองครั้งล่าสุดคุณสามารถสมมติได้ว่า x ถูกกำหนดให้เป็นตัวชี้ไปยังโครงสร้างข้อมูลโดยตรง InsertElement ส่งคืนตัวชี้ที่สอดคล้องกันสำหรับ y InsertAfter (NULL, y) แทรก y ที่จุดเริ่มต้นของรายการ ตัวอย่างเช่นเริ่มต้นด้วยโครงสร้างข้อมูลที่ว่างเปล่าการดำเนินการต่อไปนี้จะอัพเดตรายการที่สั่งซื้อตามที่แสดงด้านล่าง: InsertAfter (NULL, a) [a]⟹⟹\implies InsertAfter (NULL, b) [b, a]⟹⟹\implies InsertAfter (b, c) [b, c, a]⟹⟹\implies …

5
มีตัวกรอง anti-Bloom หรือไม่?
กรองบลูมทำให้มันเป็นไปได้อย่างมีประสิทธิภาพติดตามว่าค่าต่างๆได้รับการได้พบระหว่างการประมวลผล เมื่อมีรายการข้อมูลจำนวนมากตัวกรอง Bloom จะส่งผลให้มีการบันทึกหน่วยความจำที่สำคัญบนตารางแฮช คุณสมบัติหลักของตัวกรอง Bloom ซึ่งใช้ร่วมกับตารางแฮชคือมันมักจะพูดว่า "ไม่ใหม่" หากรายการนั้นไม่ใหม่ แต่มีความน่าจะเป็นที่ไม่เป็นศูนย์ที่รายการจะถูกตั้งค่าสถานะเป็น "ไม่ใหม่ "แม้ว่ามันจะเป็นของใหม่ มี "ฟิลเตอร์ต่อต้านบลูม" ซึ่งมีพฤติกรรมตรงกันข้ามหรือไม่? กล่าวอีกนัยหนึ่ง: มีโครงสร้างข้อมูลที่มีประสิทธิภาพซึ่งระบุว่า "ใหม่" หากรายการนั้นเป็นของใหม่ แต่อาจจะพูดว่า "ใหม่" สำหรับบางรายการที่ไม่ใช่ของใหม่ การเก็บรายการที่เห็นก่อนหน้านี้ทั้งหมด (ตัวอย่างเช่นในรายการลิงก์ที่เรียงลำดับ) เป็นไปตามข้อกำหนดแรก แต่อาจใช้หน่วยความจำมาก ฉันหวังว่ามันจะไม่จำเป็นเช่นกันเนื่องจากข้อกำหนดที่สองที่ผ่อนคลาย สำหรับผู้ที่ต้องการการรักษาที่เป็นทางการมากขึ้นให้เขียนถ้าตัวกรอง Bloom คิดว่าเป็นของใหม่,มิฉะนั้นและเขียนถ้าเป็นจริงและมิฉะนั้นx b ( x ) = 0 n ( x ) = 1 x n ( x ) = 0b ( …

2
โครงสร้างข้อมูลแผนที่ที่มีประสิทธิภาพรองรับการค้นหาโดยประมาณ
ฉันกำลังมองหาโครงสร้างข้อมูลที่สนับสนุนการค้นหาคีย์โดยประมาณอย่างมีประสิทธิภาพ (เช่นระยะทางของ Levenshtein สำหรับสตริง) โดยคืนค่าการจับคู่ที่ใกล้เคียงที่สุดสำหรับคีย์อินพุต โครงสร้างข้อมูลที่เหมาะสมที่สุดที่ฉันเคยพบคือต้นไม้ Burkhard-Kellerแต่ฉันสงสัยว่ามีโครงสร้างข้อมูลอื่น ๆ / ดีกว่าสำหรับจุดประสงค์นี้ แก้ไข: รายละเอียดเพิ่มเติมเกี่ยวกับกรณีเฉพาะของฉัน: สายอักขระมักจะมีความแตกต่างกันมากในระดับที่ค่อนข้างใหญ่ สตริงมีความยาวสูงสุดประมาณ 20-30 ตัวอักษรโดยมีค่าเฉลี่ยใกล้เคียงกับ 10-12 ฉันสนใจในการค้นหาที่มีประสิทธิภาพมากกว่าการแทรกเนื่องจากฉันจะสร้างชุดข้อมูลสแตติกส่วนใหญ่ที่ฉันต้องการค้นหาอย่างมีประสิทธิภาพ

1
เหตุใดอัลกอริทึมการหมุนแผนภูมิต้นไม้จึงคำนึงถึงทั้งโหนดหลักและโหนดปู่ย่าตายาย
ฉันไม่เข้าใจว่าทำไมการหมุนในโครงสร้างข้อมูลแผนภูมิต้นไม้ไม่ได้คำนึงถึงเฉพาะพาเรนต์ของโหนดการจัดอันดับ แต่ยังรวมถึงปู่ย่าตายาย (การดำเนินการ zig-zag และ zig-zig) ทำไมสิ่งต่อไปนี้ถึงไม่ทำงาน: ในขณะที่เราแทรกเช่นโหนดใหม่ไปยังทรีเราตรวจสอบว่าเราแทรกลงในทรีย่อยทางซ้ายหรือขวา หากเราแทรกเข้าไปทางซ้ายเราจะหมุน RIGHT ผลลัพธ์และในทางกลับกันสำหรับแผนผังย่อยที่เหมาะสม มันจะเป็นแบบนี้ซ้ำ ๆ ซ้ำ ๆ Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } ที่ควรหลีกเลี่ยงกระบวนการ "กาง" ทั้งหมดคุณคิดหรือไม่?

3
การดึงเส้นทางที่สั้นที่สุดของกราฟแบบไดนามิก
ฉันกำลังศึกษาเส้นทางที่สั้นที่สุดในกราฟกำกับ มีอัลกอริธึมที่มีประสิทธิภาพมากมายสำหรับการค้นหาเส้นทางที่สั้นที่สุดในเครือข่ายเช่น dijkstra's หรือ bellman-ford's แต่ถ้ากราฟเป็นไดนามิก? โดยการพูดแบบไดนามิกฉันหมายความว่าเราสามารถแทรกหรือลบจุดยอดในระหว่างการดำเนินการของโปรแกรม ฉันพยายามที่จะหาขั้นตอนวิธีการที่มีประสิทธิภาพสำหรับการปรับปรุงเส้นทางที่สั้นที่สุดจากจุดสุดยอดทุกจุดสุดยอดอื่น ๆUหลังจากการใส่ขอบอีโดยไม่จำเป็นต้องเรียกใช้อัลกอริทึมเส้นทางที่สั้นที่สุดในกราฟใหม่อีกครั้ง ฉันจะทำสิ่งนี้ได้อย่างไร ขอบคุณล่วงหน้า.vvvuuueee หมายเหตุ:การเปลี่ยนแปลงสามารถทำได้หลังจากการวนซ้ำครั้งแรกของอัลกอริทึม หมายเหตุ [2]: ให้สองโหนดคือต้นทางและtเป้าหมาย ฉันต้องการค้นหาเส้นทางที่สั้นที่สุดระหว่างโหนดเหล่านี้ เมื่อกราฟมีการปรับปรุงฉันมีเพียงแค่การปรับปรุงπ ( s , T )ซึ่งเป็นเส้นทางที่สั้นที่สุดระหว่างsและเสื้อssstttπ(s,t)π(s,t)\pi(s,t)sssttt หมายเหตุ [3]:ฉันสนใจเฉพาะเคสใส่ขอบเท่านั้น ความหมายอย่างเป็นทางการ : ให้กราฟ ) กำหนดดำเนินการปรับปรุงเป็น 1) แทรกของขอบอีเพื่อEหรือ 2) การลบขอบ AA อีจากE วัตถุประสงค์คือการหาค่าใช้จ่ายของเส้นทางที่สั้นที่สุดของคู่ทั้งหมดอย่างมีประสิทธิภาพหลังจากการดำเนินการอัพเดท อย่างมีประสิทธิภาพเราหมายถึงอย่างน้อยก็ดีกว่าดำเนินการอัลกอริทึม All-Pairs-Shortest-Path เช่นอัลกอรึทึมของ Bellman-Ford หลังจากการดำเนินการอัพเดทแต่ละครั้งG=(V,E)G=(V,E)G = (V,E)eeeEEEeeeEEE แก้ไข:ด้านล่างมีปัญหาในเวอร์ชันที่ง่ายขึ้น: กราฟถ่วงน้ำหนักจะได้รับประกอบด้วยขอบทิศทางเดียวและสองจุดสำคัญsและเสื้อ ชุดของขอบสองทิศทางของผู้สมัครจะได้รับเช่นกัน ฉันจะต้องสร้างขอบเพื่อลดระยะทางจากไปทีG(V,E)G(V,E)G(V,E)ssstttCCC(u,v)∈C(u,v)∈C(u,v) \in Csssttt

1
การเติมตารางการกำหนดเส้นทางของ Pastry ทำงานอย่างไร
คำถามนี้ถูกย้ายจากการแลกเปลี่ยนกองวิศวกรรมซอฟต์แวร์เพราะสามารถตอบได้ใน Computer Science Stack Exchange อพยพ 7 ปีที่ผ่านมา ฉันพยายามใช้ตารางแฮชแบบกระจายของ Pastry แต่มีบางสิ่งที่หลีกเลี่ยงความเข้าใจของฉัน ฉันหวังว่าบางคนสามารถชี้แจงได้ คำเตือน : ฉันไม่ใช่นักเรียนวิทยาศาสตร์คอมพิวเตอร์ ฉันเรียนวิชาวิทยาการคอมพิวเตอร์สองหลักสูตรในชีวิตของฉันและไม่ได้จัดการกับสิ่งที่ซับซ้อนจากระยะไกล ฉันทำงานกับซอฟต์แวร์มาหลายปีแล้วดังนั้นฉันจึงรู้สึกว่าขึ้นอยู่กับภารกิจการนำไปปฏิบัติถ้าฉันสามารถสรุปแนวคิดได้ ดังนั้นฉันอาจจะพลาดอะไรบางอย่างที่ชัดเจน ฉันได้อ่านกระดาษที่ผู้แต่งตีพิมพ์ [1] และฉันมีความก้าวหน้าที่ดี แต่ฉันก็ยังคงติดใจอยู่กับประเด็นนี้ในตารางการจัดเส้นทาง: กระดาษอ้างว่า ตารางการจัดเส้นทางของโหนดคือถูกจัดเป็น แถวที่มีรายการแต่ละรายการ รายการที่แถวของตารางเส้นทางแต่ละอ้างถึงโหนดที่ nodeId แบ่งปัน nodeId ของโหนดปัจจุบันในตัวเลข fi rst n หลัก แต่มีหลักหนึ่งมีค่าที่เป็นไปได้หนึ่งในนอกเหนือจากหลักใน id ของโหนดปัจจุบันRRR⌈log2bN⌉⌈เข้าสู่ระบบ2ข⁡ยังไม่มีข้อความ⌉\lceil \log_{2^b} N\rceil2b−12ข-12^b - 12b−12ข-12^b - 1nnnn+1n+1n + 12b−12ข-12^b - 1n+1n+1n + 1 ย่อมาจากตัวแปรโปรแกรมเฉพาะมัก4 …

1
มีเชือกของ Van Emde Boas ที่เทียบเท่ากับเชือกไหม?
บางคนที่ฉันรู้จักกำลังวางแผนที่จะใช้ตัวแก้ไขข้อความในอนาคตอันใกล้นี้ซึ่งทำให้ฉันคิดว่าโครงสร้างข้อมูลชนิดใดที่รวดเร็วสำหรับตัวแก้ไขข้อความ โครงสร้างที่ใช้มากที่สุดจะเห็นได้ชัดเชือกหรือบัฟเฟอร์ช่องว่าง ต้น Van Emde Boasเป็นคิวลำดับความสำคัญที่เร็วที่สุดรอบ ๆ หากคุณไม่คำนึงถึงขอบเขตบนจำนวนรายการที่คุณสามารถใส่ลงไปและค่าใช้จ่ายในการเริ่มต้นจำนวนมาก คำถามของฉันคือว่ามีโครงสร้างข้อมูลบางส่วนที่เร็วเท่ากับทรี Emde Boas หรือไม่ แต่รองรับการทำงานของโปรแกรมแก้ไขข้อความ เราต้องรองรับอักขระได้ไม่เกินในโครงสร้างข้อมูลของเรา (ดังนั้นหากเราจะสนับสนุนอักขระ ASCII ได้สูงสุด 4GB) เราได้รับอนุญาตเวลาในการเริ่มต้นโครงสร้างข้อมูลใหม่ เราต้องการสนับสนุนการดำเนินงานต่อไปนี้:mmmlogm=32log⁡m=32\log m = 32m−−√m\sqrt{m} แทรกอักขระที่ตำแหน่งใน (และเพิ่มตำแหน่งของอักขระที่ตามมาทุก ๆ 1)iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) ลบตัวอักษรที่ตำแหน่งในบันทึกเมตร)iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) กลับตัวอักษรที่ตำแหน่งในบันทึกเมตร)iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) ดังนั้นการแทรก (0, 'a') ตามด้วยการแทรก (0, 'b') ให้ผลลัพธ์เป็น "ba" จะดีกว่านี้: กลับมาเป็น 'ชี้' เพื่อดัชนีบางในบันทึกเมตร)iiiO(loglogm)O(log⁡log⁡m)O(\log \log m) ได้รับ …

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

2
การรวมกันของโครงสร้างข้อมูลใดที่จัดเก็บเครือข่ายแบบเบย์โดยสิ้นเชิง
ฉันเข้าใจทฤษฎีที่อยู่เบื้องหลังเครือข่าย Bayesian และฉันสงสัยว่าจะต้องสร้างสิ่งใดในทางปฏิบัติ สมมุติว่าสำหรับตัวอย่างนี้ฉันมีเครือข่ายแบบเบย์ (กำกับ) ที่มีตัวแปรสุ่มไม่ต่อเนื่อง 100 ตัว ตัวแปรแต่ละตัวสามารถรับได้สูงสุด 10 ค่า ฉันจะเก็บโหนดทั้งหมดใน DAG และสำหรับแต่ละโหนดจะเก็บ Conditional Probability Table (CPT) หรือไม่ มีโครงสร้างข้อมูลอื่น ๆ ที่ฉันควรใช้เพื่อให้แน่ใจว่าการคำนวณค่ามีประสิทธิภาพเมื่อ CPT บางอย่างเปลี่ยนไป (นอกเหนือจาก DAG ที่ใช้)

1
ต้นไม้ AVL ไม่ได้มีความสมดุลของน้ำหนัก?
ในคำถามก่อนหน้านี้มีคำจำกัดความของต้นไม้สมดุลน้ำหนักและคำถามเกี่ยวกับต้นไม้สีแดงดำ คำถามนี้เป็นคำถามที่จะถามคำถามเดียวกัน แต่สำหรับต้นไม้ AVL คำถามคือให้ความหมายของ -balanced ต้นไม้ในขณะที่คำถามอื่น ๆμμ\mu มีบ้างไหมที่ต้นไม้ AVL ที่มีขนาดใหญ่ทั้งหมดนั้นมีความสมดุล ?μ>0μ>0\mu \gt 0μμ\mu ฉันคิดว่ามีเพียงคำจำกัดความเดียวของต้นไม้ AVL และไม่มีความกำกวม

8
ข้อมูลทุกชนิดเพิ่งต้มลงไปยังโหนดที่มีตัวชี้หรือไม่?
อาร์เรย์หรือเวกเตอร์เป็นเพียงลำดับของค่า พวกเขาสามารถดำเนินการได้อย่างแน่นอนด้วยรายการที่เชื่อมโยง นี่เป็นเพียงโหนดจำนวนมากที่มีตัวชี้ไปยังโหนดถัดไป สแต็คและคิวเป็นข้อมูลนามธรรมสองประเภทที่สอนกันทั่วไปในหลักสูตร Intro CS ที่ไหนสักแห่งในชั้นเรียนนักเรียนมักจะต้องใช้สแต็คและคิวโดยใช้รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลพื้นฐานซึ่งหมายความว่าเรากลับไปที่แนวคิด "การรวบรวมโหนด" เดียวกัน คิวลำดับความสำคัญสามารถสร้างขึ้นได้โดยใช้ Heap ฮีปสามารถถูกคิดเป็นต้นไม้ที่มีค่า min ที่รูท ต้นไม้ทุกประเภทรวมถึง BSTs, AVL, ฮีปสามารถถือเป็นชุดของโหนดที่เชื่อมต่อกันด้วยขอบ โหนดเหล่านี้เชื่อมโยงกันโดยที่หนึ่งโหนดชี้ไปที่อื่น ดูเหมือนว่าทุกแนวคิดของข้อมูลสามารถต้มลงไปยังโหนดที่มีพอยน์เตอร์ไปยังโหนดอื่นที่เหมาะสมเท่านั้น นั่นถูกต้องใช่ไหม? ถ้ามันง่ายขนาดนี้ทำไมตำราเรียนไม่อธิบายว่าข้อมูลเป็นเพียงแค่จุดเชื่อมต่อที่มีตัวชี้? เราจะไปจากโหนดไปยังรหัสไบนารีได้อย่างไร

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

1
ไม่มีโครงสร้างล็อคข้อมูลต้นไม้พร้อมกันอย่างต่อเนื่องที่ล็อคตลอดเวลา?
ฉันอ่านวรรณกรรมเมื่อเร็ว ๆ นี้และพบว่ามีโครงสร้างข้อมูลที่น่าสนใจอยู่บ้าง ฉันได้ค้นคว้าวิธีที่แตกต่างหลากหลายในการทำให้เวลาการอัปเดตลดลงเป็นเวลาอัปเดตกรณีที่เลวร้ายที่สุด [1-7]O ( 1 )O(1)\mathcal{O}(1) เมื่อเร็ว ๆ นี้ฉันเริ่มค้นหาโครงสร้างข้อมูลที่ไม่ล็อคเพื่อสนับสนุนการเข้าถึงพร้อมกันอย่างมีประสิทธิภาพ มีกรณีที่เลวร้ายที่สุดเทคนิคการอัปเดตใด ๆ เหล่านี้ถูกนำมาใช้ในการใช้โครงสร้างข้อมูลที่ไม่ล็อคหรือไม่?O ( 1 )O(1)\mathcal{O}(1) ฉันถามเพราะ; สำหรับฉันพวกเขาดูเหมือนการขยายการปฏิบัติที่ชัดเจนของ "การเพิ่มประสิทธิภาพเชิงทฤษฎี" นี้ Tarjan, Robert Endre “ การปรับปรุงโครงสร้างการค้นหาที่สมดุลในการหมุน O (1)” ตัวประมวลผลข้อมูล 16, ไม่ใช่ 5 (1983): 253 - 257 Driscoll, JR, N Sarnak, DD Sleator และ RE Tarjan “ การทำให้โครงสร้างข้อมูลคงทน” ในการประชุมวิชาการ ACM ประจำปีที่สิบแปดเรื่องทฤษฎีคอมพิวเตอร์, …

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