2013-04-17 40 views
6

Phần 6.3.6 Vectors ở các bang chuẩn Đề án R5RS sau đây về vectơ:Sự phức tạp của Đề án vectơ

Vectors là các cấu trúc không đồng nhất mà các thành phần được lập chỉ mục bởi các số nguyên. Một vectơ thường chiếm ít không gian hơn một danh sách có cùng độ dài và thời gian trung bình cần thiết để truy cập một phần tử được chọn ngẫu nhiên thường ít hơn đối với vectơ so với danh sách.

Mô tả vectơ này có chút khuếch tán.

Tôi muốn biết điều này thực sự là gì nghĩa là về các hoạt động vector-reflist-ref và sự phức tạp của chúng. Cả hai thủ tục trả về phần tử thứ k của một vectơ và một danh sách. Là hoạt động vector O (1) và là hoạt động danh sách O (n)? Các vectơ khác với danh sách như thế nào? Tôi có thể tìm thêm thông tin về điều này ở đâu?

Hiện tại tôi đang sử dụng danh sách liên kết làm cấu trúc dữ liệu để lưu trữ cặp khóa/giá trị để dễ dàng tra cứu. Nếu các phím là số nguyên thì có lẽ tốt hơn là sử dụng vectơ để lưu trữ các giá trị.

Trả lời

4

Các chi tiết rất cụ thể của vector-reflist-ref đang thực hiện phụ thuộc, có nghĩa là: mỗi dịch viên Đề án có thể thực hiện các đặc điểm kỹ thuật vì nó thấy phù hợp, vì vậy một câu trả lời cho câu hỏi của bạn có thể không được tổng quát cho tất cả các thông dịch viên phù hợp với R5RS, nó phụ thuộc vào trên trình thông dịch thực tế bạn đang sử dụng.

Nhưng có, trong bất kỳ việc triển khai thực hiện nào là đặt cược an toàn để giả định rằng hoạt động vector-ref là O (1) và hoạt động list-ref có thể là O (n). Tại sao? bởi vì một vector, dưới mui xe, nên được thực hiện bằng cách sử dụng cấu trúc dữ liệu có nguồn gốc ngôn ngữ thực hiện, cho phép O (1) truy cập vào một phần tử được chỉ định của nó (ví dụ, một mảng nguyên thủy) - do đó làm cho việc thực hiện vector-ref đơn giản. Trong khi các danh sách trong Lisp được tạo ra bằng cách liên kết các ô cons và việc tìm một phần tử tại bất kỳ chỉ mục đã cho nào đi qua tất cả các phần tử trước nó trong danh sách - do đó có độ phức tạp O (n). Là một lưu ý phụ - có, sử dụng vec-tơ sẽ là giải pháp thay thế nhanh hơn sử dụng danh sách liên kết các cặp khóa/giá trị, miễn là các phím là số nguyên và số lượng các phần tử được lập chỉ mục được biết trước (vector Đề cương không thể phát triển kích thước của nó sau khi tạo ra nó). Đối với trường hợp chung (các phím khác với số nguyên, kích thước biến), hãy kiểm tra xem trình thông dịch của bạn có hỗ trợ bảng băm hay không hoặc sử dụng thư viện bên ngoài cung cấp cho chúng (ví dụ: SRFI 69).

+0

Cảm ơn bạn đã cho tôi biết về bảng băm. –

+0

Chấp nhận câu trả lời này muộn một chút, nhưng hey. –

1

Một danh sách được tạo từ cons ô. Từ số R5RS list section:

Đối tượng trong các trường liên tiếp của danh sách là các thành phần của danh sách. Ví dụ: danh sách hai phần tử là một cặp có ô tô là phần tử đầu tiên và có cdr là cặp có ô tô là phần tử thứ hai và có cdr là danh sách trống. Độ dài của một danh sách là số lượng các phần tử, giống như số lượng các cặp.

Ví dụ, danh sách (a b c) là tương đương với các dòng sau đây của cặp: (a . (b . (c .())))

Và có thể được đại diện trong bộ nhớ bằng các "nút" như sau:

[p] --> [p] --> [p] --> null 
|  |  | 
|==> a |==> b |==> c 

Với mỗi nút [] có chứa một con trỏ p với giá trị (đó là car) và một con trỏ khác đến phần tử tiếp theo (đó là cdr).

Điều này cho phép danh sách phát triển đến độ dài không giới hạn, nhưng yêu cầu hoạt động ref để bắt đầu ở đầu danh sách và đi qua các phần tử k để tìm danh sách được yêu cầu. Như bạn đã nói, đây là O (n).


Ngược lại, một vector về cơ bản là một mảng các giá trị có thể được biểu diễn như trong nội bộ một mảng của con trỏ. Ví dụ, các vector #(a b c) có thể được biểu diễn như:

[p p p] 
| | | 
| | |==> c 
| | 
| |==> b 
| 
|==> a 

Trong trường hợp mảng [] chứa một loạt ba con trỏ, và mỗi con trỏ được gán cho một giá trị trong vector. Vì vậy, nội bộ bạn có thể tham khảo phần tử thứ ba của vectơ v bằng cách sử dụng ký hiệu v[3]. Vì bạn không cần phải đi qua các phần tử trước, vector-ref là một hoạt động O (1).

Điểm bất lợi chính là vectơ có kích thước cố định, vì vậy nếu bạn cần thêm nhiều phần tử hơn vectơ có thể giữ, bạn phải phân bổ một vectơ mới và sao chép các phần tử cũ vào vectơ mới này. Điều này có khả năng có thể là một hoạt động tốn kém nếu ứng dụng của bạn thực hiện điều này một cách thường xuyên.


Có rất nhiều tài nguyên trực tuyến - bài viết này trên Scheme Data Structures đi vào chi tiết hơn và đưa ra một số ví dụ, mặc dù nó là nhiều hơn nữa tập trung vào danh sách.


Tất cả những gì đã nói, nếu phím của bạn (hoặc có thể trở thành) số nguyên và bạn có thể có một số cố định của các yếu tố hoặc có thể quản lý với một số lượng hợp lý của tái phân bổ vector - ví dụ, bạn tải các vector lúc khởi động và sau đó thực hiện chủ yếu là đọc - một vector có thể là một thay thế hấp dẫn cho một danh sách liên kết.

Các vấn đề liên quan