Java 从列表中获取最小值和最大值

Java 从列表中获取最小值和最大值,java,algorithm,sorting,data-structures,Java,Algorithm,Sorting,Data Structures,假设我们有一个包含整数的列表,我们需要找到最小值和最大值。最好的方法是什么?我可以想到以下几点: 如果读取的数量远远高于写入的数量;以有序的方式保存列表。无论何时添加一个数字;按顺序添加。 现在要得到最小值和最大值,我们只需要得到这个的第一个和最后一个元素 名单 如果写入次数大于读取次数;迭代列表并返回结果。但这是一个看起来很贵的 还有其他更好的方法吗?您可以使用Collection.max和Collection.min静态方法 使用SortedSet对集合进行自动排序。您可以使用collect

假设我们有一个包含整数的列表,我们需要找到最小值和最大值。最好的方法是什么?我可以想到以下几点:

如果读取的数量远远高于写入的数量;以有序的方式保存列表。无论何时添加一个数字;按顺序添加。 现在要得到最小值和最大值,我们只需要得到这个的第一个和最后一个元素 名单

如果写入次数大于读取次数;迭代列表并返回结果。但这是一个看起来很贵的


还有其他更好的方法吗?

您可以使用Collection.max和Collection.min静态方法


使用SortedSet对集合进行自动排序。

您可以使用collection.max和collection.min静态方法进行排序


使用SortedSet对集合进行自动排序。

假设可以观察到列表的任何变化,则可以存储缓存最小值和最大值,并可能在添加/删除数字时更新缓存值。此时,列表的顺序无关紧要。

假设您可以观察到列表的任何变化,您可以存储缓存最小值和最大值,并可能在添加/删除数字时更新缓存值。在这一点上,列表的顺序并不重要。

假设您支持从列表中删除整数,而不管读或写的是哪一个更高,排序列表会使事情变得更简单,并提供更好的性能。

假设您支持从列表中删除整数,而不管读或写的是哪一个更高,拥有一个排序的列表可以使事情变得更简单,并提供更好的性能。

您还可以使用一个类似于最小/最大堆的数据结构红黑树来保留整数。Get min/max将花费O1时间,插入新元素将花费Olog n时间

您还可以使用一个类似于最小/最大堆的数据结构红黑树来保存整数。Get min/max将花费O1时间,插入新元素将花费Olog n时间


您可以有一个维护最小值和最大值的自定义列表。这将为您提供O1插入、最小值和最大值的O1读数以及删除时的读数,但仅在您删除最小值或最大值的情况下

伪代码:

public MinMaxList
{
    property Min; 
    property Max;

    method Add (int newValue)
    {
        if (Min is null OR newValue < Min)
            Min = newValue;

        if (Max is null OR newValue > Max)
            Max = newValue;
    }

    method Delete (int value)
    {
        if (value = Min or value = Max)
            //Rescan list to determine new Min and Max values. This is O(N).
    }

}

您可以有一个维护最小值和最大值的自定义列表。这将为您提供O1插入、最小值和最大值的O1读数以及删除时的读数,但仅在您删除最小值或最大值的情况下

伪代码:

public MinMaxList
{
    property Min; 
    property Max;

    method Add (int newValue)
    {
        if (Min is null OR newValue < Min)
            Min = newValue;

        if (Max is null OR newValue > Max)
            Max = newValue;
    }

    method Delete (int value)
    {
        if (value = Min or value = Max)
            //Rescan list to determine new Min and Max values. This is O(N).
    }

}

我将提出一个有趣的想法:

假设您确实有频繁的删除,尽管读多于写,您可能持有一个items对象数组,该数组表示两个对已添加项的最小值和最大值的引用的整数,并缓存对上一个最小值和最大值的引用。与@Akaidoint解决方案的区别在于,这只是引用

堆栈中的每个值都指向上一个最大值和上一个最小值

添加项目也需要O1,找出最小值和最大值也需要O1

更新中描述了删除项:

缺点是内存消耗较多

如果这个解决方案是错误的,我会删除它,请评论,如果你发现任何问题,没有必要否决投票

更新

@阿卡迪奥在他的评论中提到了一个我错过的案例。如果有多个“最大值”或“最小值”,该怎么办

在这种情况下以及其他情况下,删除max value将需要更新指向它的所有对象,这将是max On,但我认为平均而言,它仍将保持为O1。
如果所有值都是不同的,那么这将始终是O1

我将提出一个有趣的想法:

假设您确实有频繁的删除,尽管读多于写,您可能持有一个items对象数组,该数组表示两个对已添加项的最小值和最大值的引用的整数,并缓存对上一个最小值和最大值的引用。与@Akaidoint解决方案的区别在于,这只是引用

堆栈中的每个值都指向上一个最大值和上一个最小值

添加项目也需要O1,找出最小值和最大值也需要O1

更新中描述了删除项:

缺点是内存消耗较多

如果这个解决方案是错误的,我会删除它,请评论,如果你发现任何问题,没有必要否决投票

更新

@阿卡迪奥在他的评论中提到了一个我错过的案例。如果有多个“最大值”或“最小值”,该怎么办

在这种情况下以及其他情况下,删除max value将需要更新指向它的所有对象,这将是max On,但我认为平均而言,它仍将保持为O1。
如果所有值都不同,则始终为O1

是否只添加数字?无法删除?是否只添加数字?无法删除?+1,如果删除最大值或最小值,则在常规wa中查找最小值、最大值
y可能很昂贵,这是正确的答案,适用于需要移除的情况rare@Michael是的,你说得对。幸运的是,OP的问题陈述甚至没有提到O:我给他写了一条评论,你收到了一张赞成票,因为他没有提到如果-+1,使用此解决方案且不删除,您甚至不需要保留列表。我为删除案例提出了有趣的解决方案,如果错误,请更正我+1,如果删除了最大值或最小值,以常规方式查找最小值、最大值可能会很贵,这是删除案例的正确答案rare@Michael是的,你说得对。幸运的是,OP的问题陈述甚至没有提到O:我给他写了一条评论,你收到了一张赞成票,因为他没有提到如果-+1、使用此解决方案且不删除,您甚至不需要保留列表。我已针对删除案例提出了有趣的解决方案,如果错误,请更正me@Michael是的,我现在明白了。我正在写我的答案,他把它贴了出来。@Michael是的,我现在可以看到了。我正在写我的答案,而他却把它贴了出来。这个主意很有趣。尚未对此进行测试,但如果存在多个当前最大值的存储实例,并且该实例已被删除,该操作将如何执行?指针不会被更新到一个不正确的新最大值吗?有趣的是,看起来好像有多个类似的值,删除最大值将要求更新指向它的所有对象,这将是最大值,但平均来说它仍将保持O1,我将更新我的回答有趣的想法。尚未对此进行测试,但如果存在多个当前最大值的存储实例,并且该实例已被删除,该操作将如何执行?指针不会被更新到错误的新最大值吗?有趣的是,看起来好像有多个类似的值,删除最大值将要求更新指向它的所有对象,这将是最大值,但平均而言,它仍将保持O1,我将更新我的答案