一千萬個為什麽

搜索

查找最大值小於另一個值的項目

我有一個有兩個雙打的對象:

class SurveyData(){ 雙md; 雙tvd; } </代碼>

我有一個已經按升序排序的值列表。我想找到並返回列表中對象的索引,其最大tvd值小於或等於double。我怎樣才能有效地完成這項任務?

最佳答案

假設你有LINQ並且很高興使用 MoreLINQ 中的 TakeUntil ,我懷疑你想:

var maxCappedValue = values.TakeUntil(data => data.Tvd >= limit)
                           .LastOrDefault();

這將獲得第一個實際值而不是索引,但您可以隨時執行:

var maxCappedPair = values.Select((value, index) => new { value, index })
                           .TakeUntil(pair => pair.value.Tvd >= limit)
                           .LastOrDefault();

對於索引/值對。在這兩種情況下,如果所有值都高於限制,則結果將為null。

Of course, it would be more efficient to use a binary search - but also slightly more complicated. You could create a "dummy" value with the limit TVD, then use List.BinarySearch(dummy, comparer) where comparer would be an implementation of IComparer which compared by TVD. You'd then need to check whether the return value was non-negative (exact match found) or negative (exact match not found, return value is complement of where it would be inserted).

復雜度的差異在於簡單掃描的O(n)或二進制搜索的O(log n)。在不知道列表有多大(或性能有多重要)的情況下,很難建議二進制搜索的額外實現復雜性是否值得。

轉載註明原文: 查找最大值小於另一個值的項目