คำถามติดแท็ก linked-list

7
มีวิธีปฏิบัติสำหรับโครงสร้างโหนดที่เชื่อมโยงที่จะไม่เปลี่ยนรูป?
ฉันตัดสินใจเขียนรายการที่ลิงก์เดี่ยว ๆ และมีแผนที่จะทำให้โครงสร้างโหนดเชื่อมโยงภายในไม่เปลี่ยนรูป ฉันวิ่งเข้าไปในอุปสรรค์ ว่าฉันมีโหนดเชื่อมโยงต่อไปนี้ (จากaddการดำเนินการก่อนหน้า): 1 -> 2 -> 3 -> 4 5และบอกว่าผมต้องการที่จะผนวก การทำเช่นนี้ตั้งแต่โหนด4จะไม่เปลี่ยนรูปฉันต้องสร้างสำเนาใหม่ของ4แต่แทนที่ของสนามใหม่ที่มีโหนดnext 5ปัญหาคือตอนนี้3กำลังอ้างอิงเก่า4; 5หนึ่งโดยไม่ต้องต่อท้าย ตอนนี้ฉันต้องการคัดลอก3และแทนที่nextฟิลด์เพื่ออ้างอิง4สำเนา แต่ตอนนี้2กำลังอ้างอิงเก่า3... หรือกล่าวอีกนัยหนึ่งเมื่อต้องการต่อท้ายรายการทั้งหมดจะต้องคัดลอก คำถามของฉัน: ความคิดของฉันถูกต้องหรือไม่ มีวิธีการผนวกโดยไม่คัดลอกโครงสร้างทั้งหมดหรือไม่ เห็นได้ชัดว่า "จาวาที่มีประสิทธิภาพ" มีคำแนะนำ: คลาสควรจะไม่เปลี่ยนรูปเว้นแต่จะมีเหตุผลที่ดีมากที่ทำให้พวกเขาเปลี่ยนแปลงได้ ... นี่เป็นกรณีที่ดีสำหรับการเปลี่ยนแปลงหรือไม่? ฉันไม่คิดว่านี่เป็นคำตอบที่ซ้ำกันเนื่องจากฉันไม่ได้พูดถึงรายการ เห็นได้ชัดว่าจะต้องมีการเปลี่ยนแปลงเพื่อให้สอดคล้องกับอินเทอร์เฟซ (โดยไม่ต้องทำอะไรบางอย่างเช่นการรักษารายการใหม่ภายในและดึงมันออกมาผ่านทะเยอทะยานในความคิดที่สองแม้ว่าแม้จะต้องมีการกลายพันธุ์; ฉันกำลังพูดถึงว่า internals ของรายการจะต้องไม่เปลี่ยนรูป

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

4
อะไรคือกฎเกณฑ์ที่เป็นรูปธรรมสำหรับการใช้รายการที่เชื่อมโยงแทนที่จะเป็นอาร์เรย์
รายการที่เชื่อมโยงสามารถใช้เมื่อคุณต้องการแทรกและลบองค์ประกอบราคาถูกและเมื่อมันไม่สำคัญว่าองค์ประกอบไม่ได้อยู่ติดกันในหน่วยความจำ นี่เป็นนามธรรมมากและฉันต้องการคำอธิบายที่เป็นรูปธรรมว่าทำไมรายการที่เชื่อมโยงจึงควรใช้แทนที่จะเป็นอาร์เรย์ ฉันไม่ได้มีประสบการณ์ในการเขียนโปรแกรมมากนักดังนั้นฉันจึงไม่ได้รับประสบการณ์จริงมาก (ถ้ามี)

3
รายการที่เชื่อมโยงควรมีตัวชี้หางหรือไม่?
ความเข้าใจของฉัน ... ข้อดี: การแทรกท้ายคือ O (1) แทน O (N) หากรายการนั้นเป็น Doubly Linked List การลบออกจากจุดสิ้นสุดคือ O (1) แทน O (N) ข้อด้อย: จะขึ้นเป็นจำนวนเล็กน้อยของหน่วยความจำเสริม: 4-8 ไบต์ ผู้ดำเนินการจะต้องติดตามหาง เมื่อมองถึงข้อดีและข้อเสียเหล่านี้ฉันไม่สามารถเห็นได้ว่าเหตุใดรายการที่เชื่อมโยงจะหลีกเลี่ยงการใช้ตัวชี้หาง มีบางอย่างที่ฉันขาดหายไปหรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.