2010-03-18 22 views
6

tôi đang làm việc trên một dự án mà Mảng là những cấu trúc dữ liệu mặc định cho tất cả mọi thứ, và mọi truy vấn là một tìm kiếm tuyến tính trong các hình thức:cấu trúc dữ liệu tốt cho chèn/truy vấn trên các thuộc tính tùy tiện hiệu quả

  • Cần một khách hàng có tên cụ thể? customer.Find(x => x.Name == name)
  • Cần một khách hàng có id duy nhất cụ thể? customer.Find(x => x.Id == id)
  • Cần một khách hàng thuộc một loại và tuổi cụ thể? customer.Find(x => x is PreferredCustomer && x.Age >= age)
  • Cần một khách hàng có tên và tuổi cụ thể? customer.Find(x => x.Name == name && x.Age == age)

Trong hầu hết các trường hợp, tiêu chí tra cứu được xác định rõ. Ví dụ: chúng tôi chỉ tìm kiếm khách hàng theo một hoặc nhiều Id thuộc tính, Loại, Tên hoặc Tuổi. Chúng tôi hiếm khi tìm kiếm bằng bất cứ thứ gì khác.

Cấu trúc dữ liệu tốt để hỗ trợ truy vấn tùy ý của các loại này với tra cứu tốt hơn O (n)? Bất kỳ triển khai out-of-the-box cho .NET?

+1

Cơ sở dữ liệu ... Zing! –

Trả lời

4

Đối với bộ nhớ, bạn có một vài tùy chọn.

Hầu hết các tùy chọn sẽ là O (n). Điều đó đang được nói, tra cứu từ điển có thể tiếp cận O (1).

Một tùy chọn là lưu trữ khách hàng của bạn trong nhiều Từ điển, mỗi tùy chọn có khóa được đặt thành Tên, Id và Độ tuổi. Nếu bạn sử dụng cùng một tham chiếu đối tượng trong các từ điển, bạn có thể thực hiện bất kỳ tra cứu đơn lẻ nào (1), mà không cần một lượng lớn chi phí.

Cấp, điều này trở nên kém thực tế hơn khi số tiêu chí của bạn tăng lên, nhưng với 3, nó không quá tệ.

Nếu bạn muốn linh hoạt hơn, thì cơ sở dữ liệu là một tùy chọn thích hợp. Nhiều cơ sở dữ liệu có tùy chọn làm việc như một cơ sở dữ liệu trong bộ nhớ hoàn chỉnh, bao gồm SQLite, cho phép truy vấn tùy ý ở tốc độ tốt hơn nhiều so với tốc độ O (n).

+0

Vấn đề với nhiều từ điển là chúng không hỗ trợ tra cứu tổng hợp: Từ điển độ tuổi > trả về một loạt khách hàng cho một độ tuổi nhất định trong thời gian không đổi, nhưng nếu tôi cũng muốn tìm kiếm theo tên? Tôi quay lại tìm kiếm tuyến tính. – Juliet

+0

Nếu bạn kết hợp các kết quả (qua ANDING/ORING), tôi nghĩ bạn sẽ tốt hơn tuyến tính. – micahtan

+0

@Juliet: Bạn quay lại tìm kiếm tuyến tính, nhưng trong một không gian rất hạn chế. Mỗi tìm kiếm bổ sung được giới hạn chỉ là các phần tử hợp lệ từ đầu tiên, do đó không gian tìm kiếm nhỏ hơn nhiều. Tìm kiếm thứ hai là O (n), nhưng N trở nên rất nhỏ. Điều đó đang được nói, tùy chọn khác vẫn là sử dụng một DB trong bộ nhớ, cung cấp cho bạn truy vấn nhanh với các tiêu chí tùy ý ... –

0

Tại sao bạn không thể đưa dữ liệu của mình vào một số từ điển? Một tên bản đồ từ điển cho dữ liệu, một độ tuổi bản đồ khác, v.v.

+0

Để bắt đầu, nó không phải là một giải pháp rất chung chung. Chúng tôi có các loại tìm kiếm này không chỉ trên các khách hàng và sẽ hơi điên rồ khi tạo 1000 từ điển cho 100 loại bộ sưu tập mà chúng tôi thường xuyên tìm kiếm. Thứ hai, nhiều từ điển không hỗ trợ tìm kiếm trên các phím tổng hợp trong thời gian hợp lý, ví dụ: tôi không thể tìm kiếm những người có tên VÀ tuổi cụ thể mà không tìm kiếm tuyến tính thông qua một trong các từ điển của tôi. – Juliet

-1

Tôi giả sử tất cả các mảng là IEnumerable?

Làm thế nào để sử dụng LINQ cho các đối tượng?

http://www.beansoftware.com/ASP.NET-Tutorials/Linq-Objects-Collections-Arrays.aspx

Sau đó, bạn có thể viết truy vấn như cú pháp LINQ để có được kết quả từ các mảng của bạn.

+0

Điều đó có liên quan gì đến cấu trúc dữ liệu? –

+0

Không phải là một cấu trúc nhưng nếu anh ta đang cố gắng truy vấn các mảng này và không muốn quay bánh xe của mình cố gắng tìm ra thiết kế hoàn hảo, chỉ cần làm LINQ chống lại mảng của bạn và gọi nó là một ngày. – RS999

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