确定最高价值的有效方法(有或没有偏移)

时间:2012-10-31 18:49:10

标签: c# algorithm sorting data-structures sortedlist

我目前正在循环中使用SortedList来按降序排序某些值:

for(...)
{
    float rawValue;
    float offset;
    sortedList.Add(rawValue + offset, index);
}

如果我们根据原始值对条目进行排序而没有偏移量,我有兴趣了解sortedList[0](即具有最高rawValue +偏移量的条目)是否也是最高条目?

显而易见的解决方案是在同一个循环中填充另一个sortedRawValuesList,但我认为有更快,更有内存效率的方法来实现它?

谢谢!

3 个答案:

答案 0 :(得分:4)

您是否可以在迭代时简单地跟踪最高的rawValue?如果偏移量在每次迭代中发生变化,您可能也希望保存偏移量。

float highestRawVal = float.MinVal;
float offset_ForHighestRawVal = float.MinVal;
for(...)
{
    float rawValue;
    float offset;
    sortedList.Add(rawValue + offset, index);
    if(highestRawVal < rawVal)
    {
        highestRawVal = rawValue;
        offset_ForHighestRawVal = offset;
    }
}

if (highestRawVal + offset_ForHighestRawVal == sortedList[0])
    Console.WriteLine("They Match");

然后你可以随后检查它们是否匹配。

答案 1 :(得分:2)

SortedList添加一堆值只是为了对数据进行排序是相当低效的。你实际上正在做一个“插入排序”,即O(n ^ 2)。最广泛使用的排序算法是O(n * log(n))。

最重要的是,如果你只需要最大值,你只需循环数据一次,并在O(1)时间内计算最大值。

要查找Max值,只需使用LINQ的Max函数:

IEnumerable<X> data = ...;

float max = data.Max(item => doSomeComputation(item));

要获取生成最大值的项目,您可以使用MaxBy。 (不幸的是.NET不直接发货,你需要自己编写/添加它。)

X maxItem = data.MaxBy(item => doSomeComputation(item));

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source
    , Func<TSource, TKey> selector
    , IComparer<TKey> comparer = null)
{
    if (comparer == null)
    {
        comparer = Comparer<TKey>.Default;
    }
    using (IEnumerator<TSource> iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            throw new ArgumentException("Source was empty");
        }

        TSource maxItem = iterator.Current;
        TKey maxValue = selector(maxItem);

        while (iterator.MoveNext())
        {
            TKey nextValue = selector(iterator.Current);
            if (comparer.Compare(nextValue, maxValue) > 0)
            {
                maxValue = nextValue;
                maxItem = iterator.Current;
            }
        }
        return maxItem;
    }
}

答案 2 :(得分:1)

为什么不简单地利用LINQ为你做这个?

var sortedList = // Get List

var withOffsets = sortedList.Select(x => new { Original = x, Offset = x + offset }).OrderBy(x => x.Offset);

if(sortedList.First() == withOffsets.First())
   // True!