ภาษาที่ใช้งานได้ส่วนใหญ่ใช้รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลหลักที่ไม่เปลี่ยนแปลง ทำไมจึงมีรายการและไม่ใช่เช่นต้นไม้ ต้นไม้ยังสามารถใช้เส้นทางใหม่และแม้แต่รายการแบบจำลองได้อีกด้วย
ภาษาที่ใช้งานได้ส่วนใหญ่ใช้รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลหลักที่ไม่เปลี่ยนแปลง ทำไมจึงมีรายการและไม่ใช่เช่นต้นไม้ ต้นไม้ยังสามารถใช้เส้นทางใหม่และแม้แต่รายการแบบจำลองได้อีกด้วย
คำตอบ:
เพราะรายการนั้นง่ายกว่าต้นไม้ (คุณสามารถเห็นสิ่งนี้ได้เล็กน้อยโดยความจริงที่ว่ารายการนั้นเป็นต้นไม้ที่เสื่อมซึ่งทุกโหนดมีลูกเพียงลูกเดียว)
รายการข้อเสียคือโครงสร้างข้อมูลแบบเรียกซ้ำที่ง่ายที่สุดเท่าที่จะเป็นไปได้
Guy Steele แย้งระหว่างการออกแบบภาษาโปรแกรม Fortress เพื่อการคำนวณแบบขนานอย่างมากในอนาคตทั้งโครงสร้างข้อมูลของเราและการควบคุมการไหลของเราควรเป็นรูปต้นไม้ที่มีหลายสาขาไม่ใช่เชิงเส้นเหมือนตอนนี้ แต่ในขณะนี้ห้องสมุดโครงสร้างข้อมูลหลักของเราส่วนใหญ่ได้รับการออกแบบตามลำดับการประมวลผลซ้ำ (หรือเรียกซ้ำแบบหางมันไม่สำคัญเลยพวกมันเป็นสิ่งเดียวกัน) ในใจไม่ใช่การประมวลผลแบบขนาน
โปรดสังเกตว่าเช่นใน Clojure ซึ่งมีการออกแบบโครงสร้างข้อมูลสำหรับขนานกระจาย "เมฆ" โลกวันนี้แม้แต่อาร์เรย์ (เรียกว่าเวกเตอร์ใน Clojure) อาจเป็นโครงสร้างข้อมูล "เชิงเส้น" ที่สุดของพวกเขาทั้งหมดจริง ๆ แล้วมีการนำมาใช้เป็น ต้นไม้
ดังนั้นโดยย่อ: รายการข้อเสียคือโครงสร้างข้อมูลแบบเรียกซ้ำแบบถาวรที่ง่ายที่สุดและไม่จำเป็นต้องเลือก "ค่าเริ่มต้น" ที่ซับซ้อนมากขึ้น มีหลักสูตรอื่น ๆ ให้เลือกเป็นตัวเลือกเช่น Haskell มีอาร์เรย์คิวลำดับความสำคัญแผนที่ฮีปทรีทรีทลองและทุกสิ่งที่คุณอาจนึกออก แต่ค่าเริ่มต้นคือรายการข้อเสียอย่างง่าย
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
ของคุณ นี่เป็นการตอกย้ำข้อโต้แย้ง "ความเรียบง่าย" ของคุณ
Sequence
หรือ Scala's Vector
) แต่ไม่ใช้ต้นไม้เมื่อพวกเขาต้องการเพียงอ่านเพราะพวกเขาสามารถบรรลุในเวลาคงที่ที่แท้จริง (เช่น Haskell Vector
หรือ F # ผ่าน. Net ImmutableArray
)
pmap
ping เวกเตอร์ใน Clojure ยังคงเข้าถึงแต่ละองค์ประกอบตามลำดับ โครงสร้างต้นไม้ของเวกเตอร์โดยทั่วไปจะถูกซ่อนจากผู้ใช้
จริงๆแล้วรายการเหล่านั้นเป็นต้นไม้! คุณมีโหนดที่มีสองฟิลด์car
และcdr
สามารถมีโหนดหรือใบไม้ดังกล่าวได้อีก มีเพียงสิ่งเดียวที่ทำให้ต้นไม้เหล่านั้นลงในรายการคือการประชุมที่จะตีความcdr
ลิงค์เชื่อมโยงไปยังโหนดถัดไปในรายการเชิงเส้นและcar
การเชื่อมโยงเป็นค่าของโหนดปัจจุบัน
ที่กล่าวว่าฉันเดาว่าความชุกของรายการที่เชื่อมโยงในการเขียนโปรแกรมฟังก์ชั่นเชื่อมโยงกับความชุกของการเรียกซ้ำมากกว่าการทำซ้ำ เมื่อโครงสร้างลูปเพียงอย่างเดียวของคุณคือการเรียกซ้ำ (หาง -) คุณต้องการโครงสร้างข้อมูลที่ใช้งานได้ง่าย และรายการที่เชื่อมโยงนั้นสมบูรณ์แบบสำหรับสิ่งนั้น