2010-10-25 46 views
5

Tôi cần một cấu trúc dữ liệu với các thuộc tính sau:Cấu trúc dữ liệu nào sẽ sử dụng?

  • Tiếp cận các yếu tố cần phải hết sức nhanh
  • Elements, mà không được thêm vào, không nên mất trí nhớ (như lý tưởng, kích thước của cấu trúc rỗng gần zero)
  • Mỗi phần tử có hai tọa độ số nguyên (x, y) (truy cập đến các yếu tố duy nhất của họ)
  • đếm tối đa yếu tố được biết đến vào thời gian tạo (hơn 10^3)
  • phần tử chứa vài phao đánh giá cao

Sẽ tốt nếu bạn cũng hướng đến việc triển khai cấu trúc này trong C hoặc C++.

+1

Đây có phải là bài tập về nhà không? –

+1

Chọn ngôn ngữ của bạn. Không có những thứ như C/C++, và việc triển khai cho 2 ngôn ngữ này sẽ rất khác nhau. –

+2

@R .. điểm của bạn được thực hiện, nhưng lập luận đó thực sự là mệt mỏi. Tôi tham khảo C/C++ mọi lúc. Tại sao? Bởi vì các gói của chúng ta thường kết thúc là trình bao bọc C++ xung quanh các gói C. Tôi không nghĩ ai bị xúc phạm khủng khiếp, hãy cứu lấy những người theo chủ nghĩa thuần túy trong cả hai trại có sự sang trọng của việc chọn một ngôn ngữ hay ngôn ngữ kia. –

Trả lời

3

Kiểm tra điều này - bạn có thể thay đổi loại thành phần thành float nếu điều này làm mọi thứ bạn muốn.

Concise Sparse Matrix Package in C

Đối với C++ bạn có thể sử dụng Boost.uBLAS - chi tiết sparse_matrix here.

7

Bạn đang tìm kiếm sparse matrix?

+1

Điểm tốt. Ngoại trừ điều đó, nếu nhận xét của OP "hơn 10^3" thực sự có nghĩa là "một vài nghìn", tôi muốn giới thiệu một mảng 2-d đơn giản. –

1

Nếu X và Y của bạn tương đối nhỏ thì mảng con trỏ hai chiều sẽ hoạt động. 10000 con trỏ sẽ là 40K trong mã 32 bit.

+0

Ngay cả ở chế độ 64 bit, anh ta có thể sử dụng các chỉ mục 32 bit. –

1

 

typdef ElementAccessor std::pair<int, int>; 

struct Element 
{ 
    float f1; 
    float f2; 
    //etc. 

}; 

std::map< ElementAccessor, Element > myElementMap; 

Bây giờ bạn có thể sử dụng bản đồ này như một ma trận. ElementAccessor đề cập đến x, y. Chỉ cần đảm bảo xem liệu phần tử có tồn tại trong bản đồ hay không trước khi bạn cố gắng truy cập nó hoặc một phần tử được tạo theo mặc định.

http://www.cplusplus.com/reference/std/utility/pair/ http://www.cplusplus.com/reference/stl/map/find/

chỉnh sửa: khung mẫu được hiển thị cho bản đồ. loại khóa bản đồ là ElementAccessor, giá trị là Element. Ngoài ra, đối với các cặp, templating là int, int.

+0

Truy cập vào các phần tử này là thời gian logarit. Vì vậy, nếu bạn đặt 1 triệu phần tử trong bản đồ, nó vẫn sẽ không thực hiện nhiều thao tác để truy cập dữ liệu của bạn. Không phải là một tham số mảng liên tục, mà là một trình tiết kiệm không gian lớn. –

+0

đánh dấu đã được sửa. Có (hoặc được sử dụng để được, tôi đã không kiểm tra) một lỗi khó chịu trong SO mã thụt lề không hoạt động trên dòng đầu tiên, do đó các nbsp. –

+0

@steve cảm ơn bạn! –

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