Tôi đã nhận thấy rằng hầu hết các ngôn ngữ chức năng sử dụng danh sách liên kết đơn (danh sách "khuyết điểm") làm loại danh sách cơ bản nhất của chúng. Ví dụ bao gồm Lisp chung, Haskell và F #. Điều này khác với các ngôn ngữ chính, trong đó các loại danh sách gốc là mảng.
Tại sao vậy?
Đối với Common Lisp (được gõ động) tôi có ý tưởng rằng khuyết điểm đủ chung để cũng là cơ sở của danh sách, cây, v.v ... Đây có thể là một lý do nhỏ.
Tuy nhiên, đối với các ngôn ngữ được nhập tĩnh, tôi không thể tìm thấy lý do chính đáng, thậm chí tôi có thể tìm thấy các đối số phản biện:
- Kiểu chức năng khuyến khích tính không thay đổi, do đó, việc dễ dàng chèn danh sách được liên kết ít có lợi thế hơn,
- Phong cách chức năng khuyến khích sự bất biến, cũng chia sẻ dữ liệu; một mảng dễ chia sẻ "một phần" hơn danh sách được liên kết,
- Bạn cũng có thể thực hiện khớp mẫu trên một mảng thông thường, và thậm chí tốt hơn (ví dụ bạn có thể dễ dàng gấp từ phải sang trái),
- Trên hết, bạn có thể truy cập ngẫu nhiên miễn phí,
- Và (một lợi thế thực tế) nếu ngôn ngữ được nhập tĩnh, bạn có thể sử dụng bố cục bộ nhớ thông thường và tăng tốc độ từ bộ đệm.
Vậy tại sao thích danh sách liên kết?
an array is easier to share "partially" than a linked list
cần làm rõ ý của bạn. Do tính chất đệ quy của chúng, điều ngược lại là đúng như tôi hiểu - bạn có thể chia sẻ một phần danh sách được liên kết dễ dàng hơn bằng cách chuyển qua bất kỳ nút nào trong đó, trong khi một mảng sẽ cần dành thời gian để tạo một bản sao mới. Hoặc về mặt chia sẻ dữ liệu, hai danh sách được liên kết có thể trỏ đến cùng một hậu tố, điều này chỉ đơn giản là không thể với các mảng.