Tôi có một cấu trúc dữ liệu trong đó bao gồm các cặp giá trị, là người đầu tiên trong số đó là một số nguyên và lần thứ hai trong số đó là một chuỗi chữ và số (có thể bắt đầu với chữ số):Cấu trúc dữ liệu C# nào cho phép tìm kiếm một cặp dây có hiệu quả nhất đối với các đoạn mã?
+--------+-----------------+
| Number | Name |
+--------+-----------------+
| 15 | APPLES |
| 16 | APPLE COMPUTER |
| 17 | ORANGE |
| 21 | TWENTY-1 |
| 291 | 156TH ELEMENT |
+--------+-----------------+
Một bảng trong số này sẽ bao gồm tối đa 100.000 hàng.
Tôi muốn cung cấp chức năng tra cứu trong đó người dùng có thể tra cứu số đó (như thể đó là một chuỗi) hoặc các phần của chuỗi. Lý tưởng là tra cứu sẽ "sống" như kiểu người dùng; sau mỗi lần nhấn phím (hoặc có thể sau một khoảng thời gian trễ ngắn ~ 250-500 ms) một tìm kiếm mới sẽ được thực hiện để tìm các ứng cử viên có khả năng nhất. Vì vậy, ví dụ tìm kiếm trên
1
sẽ trở lại15 APPLES
,16 APPLE COMPUTER
,17 ORANGE
, và291 156TH ELEMENT
15
sẽ thu hẹp tìm kiếm để15 APPLES
,291 156TH ELEMENT
AP
sẽ trở lại15 APPLES
và16 APPLE COMPUTER
- (lý tưởng , nhưng không bắt buộc)
ELEM
sẽ trả lại291 156TH ELEMENT
.
Tôi đã suy nghĩ về việc sử dụng hai Dictionary<string, string>
s kể từ cuối cùng là int
s đang được so sánh như string
s - một di chúc chỉ mục bằng phần số nguyên và các khác do phần chuỗi.
Nhưng thực sự tìm kiếm theo chuỗi con không nên sử dụng hàm băm và có vẻ như lãng phí khi sử dụng gấp đôi bộ nhớ mà tôi cảm thấy mình cần.
Cuối cùng câu hỏi là, có cách nào hoạt động tốt để tìm kiếm văn bản hai danh sách lớn đồng thời cho các bản chất không?
Nếu không, làm thế nào về một SortedDictionary
? Có thể tăng hiệu suất nhưng vẫn không giải quyết được vấn đề băm.
Nghĩ về việc tạo một regex khi đang bay, nhưng tôi nghĩ điều đó sẽ thực hiện khủng khiếp.
Tôi mới tham gia C# (có nguồn gốc từ thế giới Java) nên tôi chưa xem xét LINQ; đó có phải là câu trả lời không?
EDIT 18:21 EST: Không có chuỗi nào trong trường "Tên" sẽ dài hơn 12-15 ký tự, nếu điều đó ảnh hưởng đến giải pháp tiềm năng của bạn.
Tôi nghĩ rằng việc triển khai một chút sửa đổi của thuật toán Knuth – Morris – Pratt] (http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) sẽ có ích. – ChaosPandion
Khi bạn nói "hiệu quả", bạn có nghĩa là "nhanh" hoặc ít nhất là bộ nhớ? Nói chung trong những tình huống này, bạn giao dịch tốc độ cho bộ nhớ, hoặc tìm một số cân bằng chấp nhận được của cả hai. Cũng có chuỗi 100k khá tĩnh, nghĩa là có ít doanh thu và chúng được tìm kiếm nhiều lần? – EBarr
@EBarr: Trí nhớ không phải là một mối quan tâm lớn, nhưng tôi không muốn lãng phí. Tốc độ là quan trọng hơn ở đây. – Tenner