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

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

1
ฮีปที่หลอมรวมแบบสุ่ม - ความสูงที่คาดหวัง
Randomized Meldable Heapsมีการดำเนินการ "meld" ซึ่งเราจะใช้เพื่อกำหนดการปฏิบัติการอื่น ๆ ทั้งหมดรวมถึงส่วนแทรก คำถามคืออะไรคือความสูงที่คาดหวังของต้นไม้นั้นด้วย nnn โหนด? ทฤษฎีบทที่ 1 ของ Gambin และ Malinkowski, คิวลำดับความสำคัญที่หลอมรวมแบบสุ่ม (การดำเนินการตาม SOFSEM 1998, บันทึกการบรรยายในวิทยาการคอมพิวเตอร์ปีที่ 1521, หน้า 344–349, 1998; PDF ) ให้คำตอบสำหรับคำถามนี้พร้อมหลักฐาน อย่างไรก็ตามฉันไม่เข้าใจว่าทำไมเราถึงเขียน: E[hQ]=12((1+E[hQL])+(1+E[hQR])).E[hQ]=12((1+E[hQL])+(1+E[hQR])).\mathbb{E} [ h_Q] = \frac{1}{2} ((1 + \mathbb{E}[h_{Q_L}]) + (1 + \mathbb{E}[h_{Q_R}]))\,. สำหรับฉันความสูงของต้นไม้คือ hQ=1+max{hQL,hQR},hQ=1+max{hQL,hQR},h_Q = 1 + \max\, \{ h_{Q_L}, h_{Q_R}\}\,, …

3
ความไม่เปลี่ยนแปลงในการเขียนโปรแกรมเชิงฟังก์ชั่นมีอยู่จริงหรือไม่?
แม้ว่าฉันจะทำงานเป็นโปรแกรมเมอร์ในชีวิตประจำวันของฉันและใช้ภาษายอดนิยมทั้งหมด (Python, Java, C, ฯลฯ ) ฉันยังไม่มีมุมมองที่ชัดเจนเกี่ยวกับการเขียนโปรแกรมที่ใช้งานได้ จากสิ่งที่ผมได้อ่านหนึ่งทรัพย์สินของภาษาหน้าที่คือว่าโครงสร้างข้อมูลจะไม่เปลี่ยนรูป สำหรับฉันคนเดียวนี่ทำให้เกิดคำถามมากมาย แต่ก่อนอื่นฉันจะเขียนสิ่งที่ฉันเข้าใจเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้และถ้าฉันผิดฉันรู้สึกอิสระที่จะแก้ไขให้ถูกต้อง ความเข้าใจของฉันเกี่ยวกับความไม่สามารถเปลี่ยนแปลงได้: เมื่อโปรแกรมเริ่มทำงานจะมีโครงสร้างข้อมูลคงที่พร้อมข้อมูลคงที่ ไม่มีใครสามารถเพิ่มข้อมูลใหม่ให้กับโครงสร้างเหล่านี้ ไม่มีตัวแปรในรหัส คุณสามารถ "คัดลอก" จากข้อมูลที่มีอยู่แล้วหรือข้อมูลที่คำนวณได้ในปัจจุบัน เนื่องจากทั้งหมดข้างต้นการเปลี่ยนแปลงไม่ได้เพิ่มความซับซ้อนของพื้นที่ขนาดใหญ่ให้กับโปรแกรม คำถามของฉัน: หากโครงสร้างข้อมูลควรจะยังคงเหมือนเดิม (ไม่เปลี่ยนรูป) จะมีคนเพิ่มรายการใหม่ในรายการได้อย่างไร อะไรคือจุดที่มีโปรแกรมที่ไม่สามารถรับข้อมูลใหม่ได้? สมมติว่าคุณมีเซ็นเซอร์ติดอยู่กับคอมพิวเตอร์ของคุณที่ต้องการป้อนข้อมูลเข้าสู่โปรแกรม นั่นหมายความว่าเราไม่สามารถจัดเก็บข้อมูลขาเข้าได้ทุกที่หรือไม่ การเขียนโปรแกรมใช้งานได้ดีสำหรับการเรียนรู้ของเครื่องอย่างไร เนื่องจากการเรียนรู้ของเครื่องสร้างขึ้นจากสมมติฐานของการปรับปรุง "การรับรู้" ของสิ่งต่าง ๆ - จึงเก็บข้อมูลใหม่

1
อัลกอริทึมและโครงสร้างข้อมูลที่มีประสิทธิภาพที่สุดสำหรับการบำรุงรักษาข้อมูลส่วนประกอบที่เชื่อมต่อบนกราฟแบบไดนามิกคืออะไร
สมมติว่าฉันมีกราฟหร็อมแหร็มไม่ จำกัด ทิศทางและจำเป็นต้องสามารถเรียกใช้แบบสอบถามต่อไปนี้ได้อย่างมีประสิทธิภาพ: ผมs Co n n e c t e d(ยังไม่มีข้อความ1,ยังไม่มีข้อความ2)IsConnected(N1,N2)IsConnected(N_1, N_2) - ส่งคืนหากมีเส้นทางระหว่างถึงมิฉะนั้นTTTยังไม่มีข้อความ1N1N_1ยังไม่มีข้อความ2N2N_2FFF คo n n e c t e dยังไม่มีข้อความo de s ( N)ConnectedNodes(N)ConnectedNodes(N) - ส่งคืนชุดของโหนดที่สามารถเข้าถึงได้จากยังไม่มีข้อความNN สิ่งนี้ทำได้ง่ายโดยการคำนวณส่วนประกอบที่เชื่อมต่อของกราฟไว้ล่วงหน้า คำสั่งทั้งสองสามารถทำงานในเวลาO ( 1 )O(1)O(1) ถ้าฉันยังต้องสามารถเพิ่มขอบโดยพลการ - - จากนั้นฉันสามารถเก็บส่วนประกอบไว้ในโครงสร้างข้อมูลที่ไม่จัดวางได้ เมื่อใดก็ตามที่มีการเพิ่มขอบถ้ามันเชื่อมต่อสองโหนดในองค์ประกอบที่แตกต่างกันฉันจะรวมองค์ประกอบเหล่านั้น สิ่งนี้จะเพิ่มค่าใช้จ่ายให้กับและราคาเป็นและ (ซึ่งอาจเป็น )ddEdก.e (ยังไม่มีข้อความ1,ยังไม่มีข้อความ2)AddEdge(N1,N2)AddEdge(N_1, N_2)O ( 1 )O(1)O(1)ddEdก.อีAddEdgeAddEdgeO ( ฉันn วีอีอาร์เอสอีคk …

3
การแสดงเส้นทางขนาดเล็กในกราฟ
ฉันเป็นเซตย่อยของเส้นทางแบบง่าย ๆ ในกราฟ ความยาวของเส้นทางถูกล้อมรอบด้วยddd. อะไรคือวิธีที่กะทัดรัดที่สุด (หน่วยความจำที่ชาญฉลาด) ฉันสามารถแสดงเส้นทางที่ไม่มีเส้นทางอื่นนอกเหนือจากเส้นทางที่เลือกได้ โปรดทราบว่าฉันต้องการใช้การเป็นตัวแทนนี้ในอัลกอริทึมที่จะวนซ้ำผ่านชุดย่อยของเส้นทางนี้ซ้ำแล้วซ้ำอีกและฉันต้องการที่จะค่อนข้างเร็วดังนั้นตัวอย่างเช่นฉันไม่สามารถใช้อัลกอริธึมการบีบอัดมาตรฐานได้ สิ่งหนึ่งที่ฉันนึกถึงคือการเป็นตัวแทนของต้นไม้ ฉันเดาว่าการทำให้ต้นไม้มีจำนวนที่เหมาะสมคือปัญหาที่ยากที่สุด? การเป็นตัวแทนอื่น ๆ จะดีอย่างไร

2
กำลังมองหาชุดการใช้งานที่มีหน่วยความจำขนาดเล็ก
ฉันกำลังมองหาการนำไปใช้ของชนิดข้อมูลชุด นั่นคือเราต้อง รักษาเซตย่อยแบบไดนามิก SSS (ขนาด nnn) จากเอกภพของขนาดด้วยยู= { 0 , 1 , 2 , 3 , … , u - 1 }ยู={0,1,2,3,...,ยู-1}U = \{0, 1, 2, 3, \dots , u – 1\}ยูยูu การดำเนินงานinsert(x)(เพิ่มองค์ประกอบxในSSS ) และfind(x)(ตรวจสอบว่าองค์ประกอบxเป็นสมาชิกของSSS ) ฉันไม่สนใจเกี่ยวกับการดำเนินงานอื่น ๆ สำหรับการวางแนวในการใช้งานฉันกำลังทำงานกับเรามีคุณ≈1010ยู≈1010u \approx 10^{10}{10} ฉันรู้ของการใช้งานที่ให้การดำเนินงานทั้งสองในเวลาO ( 1 )O(1)O(1)ดังนั้นฉันกังวลส่วนใหญ่เกี่ยวกับขนาดของโครงสร้างข้อมูล ฉันคาดว่าหลายพันล้านรายการรายการ แต่ต้องการหลีกเลี่ยงการแลกเปลี่ยนให้มากที่สุด ฉันยินดีเสียสละเวลาทำงานหากจำเป็น ค่าตัดจำหน่ายรันไทม์ของO ( …

1
Splay tree ที่มีการหมุนเป็นจำนวนคี่
เมื่อแทรกรายการลงในแผนภูมิต้นไม้การหมุนจะดำเนินการเป็นคู่โดยยึดตามรูปแบบ zig-zag หรือ zig-zig เมื่อมีการหมุนเป็นจำนวนคี่หนึ่งสามารถทำการหมุนพิเศษเริ่มต้นที่ใบไม้หรือบันทึกการหมุนเพิ่มเติมและทำที่ราก มันสำคัญไหม ตัวอย่างเช่นในภาพที่แนบมาฉันใส่ 4 ลงใน BST และ "splay it" ลงในรูท ที่ด้านบนของรูปฉันแรกหาคู่ซิกแซกที่โหนดใบและดำเนินการสเปรย์ซิกแซกจากด้านล่างออกจากการหมุนขวาสุดท้ายที่ราก ที่ด้านล่างของรูปฉันจะหมุนแปลก ๆ เริ่มจากใบไม้จากนั้นก็ทำรูปซิกซิกซิกไปยังราก อันไหนถูกต้อง? หรือทั้งสองอย่างจะนำไปสู่การแสดงต้นไม้แบบปกติ

2
โครงสร้างข้อมูลการค้นหาที่น่าจะเป็นประโยชน์หรือไม่
SkipList ให้เหมือนกัน O ( บันทึกn )O(เข้าสู่ระบบ⁡n)O(\log n)ขอบเขตสำหรับการค้นหาเป็นโครงสร้างที่สมดุลพร้อมข้อดีที่ไม่จำเป็นต้องปรับสมดุล เนื่องจาก SkipList ถูกสร้างขึ้นโดยใช้การสุ่มเหรียญแบบพลิกกลับขอบเขตเหล่านี้จะเก็บไว้ได้ตราบใดที่โครงสร้างของ SkipList นั้น "สมดุล" เพียงพอ โดยเฉพาะกับความน่าจะเป็น1 /nค1/nค1/n^cสำหรับค่าคงที่โครงสร้างที่สมดุลอาจหายไปหลังจากใส่องค์ประกอบc > 0ค>0c>0 สมมติว่าฉันต้องการใช้รายการข้ามเป็นแบ็กเอนด์พื้นที่เก็บข้อมูลในเว็บแอปพลิเคชันที่อาจทำงานได้ตลอดไป ดังนั้นหลังจากการดำเนินการจำนวนพหุนามจำนวนหนึ่งโครงสร้างที่สมดุลของ SkipList น่าจะหายไปมาก เหตุผลของฉันถูกต้องหรือไม่ โครงสร้างการค้นหา / จัดเก็บข้อมูลความน่าจะเป็นดังกล่าวมีแอปพลิเคชันที่ใช้งานได้จริงหรือไม่และถ้าเป็นเช่นนั้นแล้วปัญหาดังกล่าวจะหลีกเลี่ยงได้อย่างไร? แก้ไข: ฉันทราบว่ามีตัวแปรที่กำหนดขึ้นของ SkipList ซึ่งมีความซับซ้อนมากกว่าที่จะนำมาใช้เปรียบเทียบกับ SkipList แบบสุ่ม (คลาสสิก)

1
การลบรายการที่ซ้ำกันได้อย่างมีประสิทธิภาพและมีค่าใช้จ่ายหน่วยความจำเหลือน้อย
ฉันต้องการกรองรายการจำนวนเต็มอย่างมีประสิทธิภาพสำหรับรายการที่ซ้ำกันในแบบที่ต้องเก็บชุดผลลัพธ์เท่านั้น วิธีนี้สามารถเห็นได้: เรามีช่วงของจำนวนเต็ม S={1,…,N}S={1,…,N}S = \{1, \dots{}, N\} กับ NNN ใหญ่ (พูด 2402402^{40}) เรามีฟังก์ชั่น f:S→Sf:S→Sf : S \to S มีการชนหลายครั้ง (ภาพมีการกระจายอย่างสม่ำเสมอ SSS) เราต้องไปเก็บของ f[S]f[S]f[S], นั่นคือ {f(x)|x∈S}{f(x)|x∈S}\{f(x) | x \in S\} ฉันมีการประมาณความแม่นยำ (ความน่าจะเป็น) ของสิ่งที่ |f[S]||f[S]||f[S]| คือและสามารถจัดสรรโครงสร้างข้อมูลล่วงหน้าได้ (พูด |f[S]|≈230|f[S]|≈230|f[S]| \approx 2^{30}) ฉันมีความคิดเล็กน้อย แต่ฉันไม่แน่ใจว่าอะไรจะเป็นวิธีที่ดีที่สุด: บิตเซตไม่อยู่ในคำถามเนื่องจากชุดอินพุตไม่พอดีกับหน่วยความจำ ตารางแฮช แต่ (1) ต้องการหน่วยความจำโอเวอร์เฮดประมาณ 150% |f[S]||f[S]||f[S]| และ (2) …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.