Điều thú vị là, nếu bạn liệt kê trên từ điển (chiều dài N) đầu tiên và kiểm tra danh sách (chiều dài M) để đưa vào, sau đó bạn nhận được hiệu suất O (NM).
Bạn có thể tạo HashSet<>
trong số các id nhưng điều đó có vẻ dư thừa vì chúng tôi đã có sẵn từ điển (được băm trước).
Thay vào đó, tôi sẽ lặp lại các id trước; vì tra cứu từ điển (bằng phím) là O (1), điều này mang lại hiệu suất O (M) - tuy nhiên, điều này có nghĩa là bạn không sử dụng LINQ (vì TryGetValue
sẽ không yêu LINQ (và giới thiệu một tuple là quá nhiều như công việc khó khăn) ...
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids) {
var result = new Dictionary<string, string>();
string value;
foreach (string key in ids) {
if (salesPersons.TryGetValue(key, out value)) {
result.Add(key, value);
}
}
return result;
}
nó không quá quan tâm tôi rằng đây là dòng hơn so với phiên bản LINQ, nó loại bỏ một O (N) phức tạp ...
Chỉnh sửa, sau đây có thể công việc (tôi đã không thử nghiệm nó), nhưng tôi nghĩ rằng nó là một lạm dụng LINQ, và chắc chắn sẽ không quy mô để PLINQ vv ... sử dụng hết sức thận trọng !! Tôi cũng tin cách tiếp cận đơn giản foreach
có các chi phí ít hơn, như vậy sẽ nhanh hơn ... anyway:
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids)
{
string value = null;
return (from key in ids
where salesPersons.TryGetValue(key, out value) // HACK: v. dodgy
select new { key, value })
.ToDictionary(x=>x.key, x=>x.value);
}
Xem trả lời của tôi cho các ghi chú hiệu suất ... –
+1, Marc, mặc dù tôi nghĩ nếu bạn lo lắng về điều này, bạn đã có quá nhiều thứ trong bộ nhớ vì nó! :) –
@Matt ... tốt, có thể - nhưng có một điểm mà O (1)/O (N * log (N)) * không phải là * không hợp lý, nhưng O (N^2) * là * a vấn đề - cho dù đó là 1k, 10k hoặc 100k là tùy thuộc vào quy trình cụ thể, tất nhiên. –