Tôi là một sinh viên làm việc trên một dự án nhỏ cho một khóa học điện toán hiệu suất cao, do đó hiệu quả đó là một vấn đề quan trọng.Có cấu trúc dữ liệu giống mảng nào có thể tăng kích thước ở cả hai bên không?
Giả sử tôi có vectơ N float và tôi muốn loại bỏ các phần tử n nhỏ nhất và các phần tử n lớn nhất. Có hai cách đơn giản để làm điều này:
Một
sort in ascending order // O(NlogN)
remove the last n elements // O(1)
invert elements order // O(N)
remove the last n elements // O(1)
B
sort in ascending order // O(NlogN)
remove the last n elements // O(1)
remove the first n elements // O(N)
In A đảo ngược các yếu tố đơn hàng yêu cầu trao đổi tất cả các yếu tố, trong khi ở B tháo đầu tiên n yếu tố yêu cầu di chuyển tất cả những người khác để chiếm các vị trí còn trống. Sử dụng std :: remove sẽ đưa ra cùng một vấn đề.
Nếu tôi có thể loại bỏ các phần tử n đầu tiên miễn phí thì giải pháp B sẽ rẻ hơn. Điều đó phải dễ dàng đạt được, nếu thay vì có vectơ, tức là một mảng có một số khoảng trống sau vector::end()
, tôi sẽ có một vùng chứa có một số khoảng trống miễn phí trước vector::begin()
. Vì vậy, câu hỏi là: không tồn tại đã là giống như mảng (nghĩa là bộ nhớ liền kề, không có danh sách liên kết) trong một số thư viện (STL, Boost) cho phép O (1) chèn/xóa trên cả hai mặt của mảng?
Nếu không, bạn có nghĩ rằng có giải pháp tốt hơn là tạo cấu trúc dữ liệu như vậy không?
yeap 'std :: deque'. – 101010
@ 40two: Tôi nghĩ 'deque' là một danh sách liên kết ở phía sau. – deepmax
Từ cpluplus: "các yếu tố của một deque có thể được phân tán trong các phần khác nhau của lưu trữ". Vẫn còn là một gợi ý rất tốt, mặc dù! – Fabio