我有一個已排序字典,其中包含測量數據點作爲鍵/值對。要確定非測量數據點的值,我想使用相應值的線性插值來推斷兩個已知鍵之間的值。我知道如何計算非測量數據點,只要我有兩個鍵/值對之間。我不知道的是如何找出它介於哪個鍵之間。有沒有比「for」循環更優雅的方式(我在想功能/ LINQ查詢)來找出我的數據點之間的哪兩個鍵?如何在已排序字典中的兩個鍵之間找到點
回答
像這樣的工作:
dic.Keys.Zip(dic.Keys.Skip(1),
(a, b) => new { a, b })
.Where(x => x.a <= datapoint && x.b >= datapoint)
.FirstOrDefault();
這遍歷使用,它們是有序的事實,他們鍵和每個以下全部兩個鍵進行比較其他的順序 - 因爲一旦你找到第一場比賽,LINQ很懶,遍歷就會停止。
可能你問下:
myDictionary.Keys.Where(w => w > start && w < end)
不會是最如果它測試了所有的密鑰,可能的有效方法。 – 2011-03-14 16:11:00
定期迴路應確定在這裏:
IEnumerable<double> keys = ...; //ordered sequence of keys
double interpolatedKey = ...;
// I'm considering here that keys collection doesn't contain interpolatedKey
double? lowerFoundKey = null;
double? upperFoundKey = null;
foreach (double key in keys)
{
if (key > interpolatedKey)
{
upperFoundKey = key;
break;
}
else
lowerFoundKey = key;
}
你可以用更短但效果較差的代碼做它在C#中使用LINQ:
double lowerFoundKey = key.LastOrDefault(k => k < interpolatedKey);
double upperFoundKey = key.FirstOrDefault(k => k > interpolatedKey);
爲了它有效地使用LINQ它應該有與參數2一起被稱爲windowed in F#的方法。它將返回keys
集合中相鄰對的IEnumerable
。 LINQ常規foreach
循環應該沒問題。
'Seq.pairwise'對於F#解決方案就足夠了,'Seq.windowed'是那個更通用的版本(任何窗口大小)。 – BrokenGlass 2011-03-14 16:31:56
@BrokenGlass,謝謝,已經從其他答案中得到了答案。 – Snowbear 2011-03-14 16:33:51
我不認爲在SortedDictionary上有一個函數可以讓你找到你需要的元素比迭代元素更快。 (+1到BrokenGlass解決方案)
爲了能夠更快地找到項目,您需要切換到其他結構。即SortedList提供了類似的功能,但允許對其Key集合進行索引,因此您可以使用二進制搜索來查找範圍。
標準C#答案都是O(N)複雜度。 有時你只需要一個相當大的排序集合中的一個小子集。 (所以你沒有迭代所有的鍵) 標準的C#集合不會幫你在這裏。解決方案如下: http://www.itu.dk/research/c5/使用C5集合庫中的IntervalHeap。這個類支持一個GetRange()方法,並將查找O(log N)複雜度的startkey,並以O(N)複雜度迭代該範圍。如果性能非常關鍵,那麼這對於大數據集來說肯定會有用。例如遊戲中的空間分區
- 1. 找到兩個數字之間的點
- 2. 如何找到兩點之間的點
- 3. 如何在Swift中排序字典鍵?
- 4. 在字典中排序鍵
- 5. 如何找到兩個詞典列表之間的區別?
- 6. 如何找到兩個其他點之間的地理點
- 7. 排序字典鍵
- 8. 如何排序的字典鍵
- 9. 如何按值排序字典的鍵?
- 10. 在兩個已知點之間畫線
- 11. 似乎無法遍歷鍵是數字字符串的已排序字典。你如何排序字典迭代?
- 12. 如何在兩個子串之間找到一個字符串?
- 13. 如何在Matlab中找到兩個網格點之間的所有網格點
- 14. 如何在VBA中的兩個字符之間找到一個數字
- 15. 排序按字典的鍵
- 16. 如何找到兩個「/」字符之間的字符串 - php
- 17. 如何找到兩個特定字符串之間的數字?
- 18. 如何找到兩個字符串之間的子字符串?
- 19. 找到前兩排之間的區別
- 20. MATLAB:在兩個不匹配的時間序列之間找到中點
- 21. 如何找到兩個已知值之間的所有字符串?
- 22. Python:如何按鍵排序字典
- 23. Parse.Query排除鍵值在兩個數字之間的項目?
- 24. 如何找到兩個點之間的距離android
- 25. 如何使用BFS找到兩個節點之間的距離?
- 26. 如何找到兩個地點之間的距離?
- 27. Neo4j - 如何找到兩個節點之間的最短路徑
- 28. 如何在javascript中找到兩個lat長對之間的X個點數?
- 29. 如何找到不同的字典鍵?
- 30. PostgreSQL找到兩個時間戳之間的中點
如果您正在尋找類似linq的解決方案,請嘗試http://stackoverflow.com/questions/2768834/how-to-zip-one-ienumerable-with-itself – Douglas 2011-03-14 16:15:54