Java 如何从两个不同的列表中不断找到两个最小的值?

Java 如何从两个不同的列表中不断找到两个最小的值?,java,list,min,huffman-code,Java,List,Min,Huffman Code,我有两个包含整数的不同列表,我需要不断地在这两个列表之间找到两个最小的值;我应该注意,我不想将这两个列表合并在一起,因为它们是不同的类型 我想知道我的方法是好是坏。如果不好,请让我知道如何提高效率 始终按降序对两个列表进行排序,因此分钟将位于底部 从列表1中找出两分钟,并将其与列表2中的两分钟进行比较,然后从这四个值中找出两分钟 从关联列表中删除这两分钟,将它们的值组合在一起(必需),并将其添加到列表2中 我基本上是在执行哈夫曼代码的一部分,在这里我想要一个按降序排列的字符频率列表。在列表中

我有两个包含整数的不同列表,我需要不断地在这两个列表之间找到两个最小的值;我应该注意,我不想将这两个列表合并在一起,因为它们是不同的类型

我想知道我的方法是好是坏。如果不好,请让我知道如何提高效率

  • 始终按降序对两个列表进行排序,因此分钟将位于底部

  • 从列表1中找出两分钟,并将其与列表2中的两分钟进行比较,然后从这四个值中找出两分钟

  • 从关联列表中删除这两分钟,将它们的值组合在一起(必需),并将其添加到列表2中


我基本上是在执行哈夫曼代码的一部分,在这里我想要一个按降序排列的字符频率列表。

列表中查找最小值可以在线性时间内完成,而无需任何排序。每次排序和查找最小值将是
O(m*nlgn)
m是迭代次数,n是列表的大小)

更好的方法是使用
PriorityQueue
(min heap),其中min始终位于堆的顶部,而不是在每次迭代时进行排序


使用
最小堆
通常用于实现
哈夫曼代码
和贪婪算法。

尽管这肯定会起作用,但始终保持列表排序的任务应该引起关注:

  • 如果您的列表允许随机访问(即
    ArrayList
    s),则从列表中删除的过程将花费O(n)
  • 如果您的列表允许删除O(1)(即
    LinkedList
    s),则查找插入点的过程为O(n)
这是在初始排序的基础上进行的,需要花费O(n*log2n)。换句话说,首先对列表进行排序并没有什么好处:维护它们会使您每次操作花费O(n),因此您最好进行线性搜索


换言之,该算法可行,但效率低下。与其维护排序列表,不如使用为您维护最小值或最大值的容器,并允许快速插入/删除(例如)。

为什么不将最小值保存在变量中,而不是保存排序列表

List<Integer> list1, list2;
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;

void setMin(int newValue) {
    if (newValue < min1) {
        min1 = newValue;
    } else if (newValue < min2) {
        min2 = newValue;
    }
}

void updateList1(int newValue) {
    setMin(newValue);
    list1.add(newValue);
}

void updateList2(int newValue) {
    setMin(newValue);
    list2.add(newValue);
}
列表列表1、列表2;
int min1=Integer.MAX\u值,min2=Integer.MAX\u值;
void setMin(int newValue){
如果(新值
你说的持续是什么意思?列表是否随着时间的推移而变化?为什么不在更新列表之前进行比较?方法似乎还可以。。。你试过了吗?您有没有遇到任何性能问题?我还没有完全实现这一点,在继续之前想问一下。我之所以想不断地对列表进行排序,是为了让我能够始终准确地知道两个列表的min的位置。min堆可能是您的列表的一个很好的选择。昨晚我也在想同样的事情,但我(不知道为什么)仍然很难确定是否实际使用优先级队列。就像PQ的想法一样:找到两分钟,用这两分钟的总和创建一个新值,将其添加到PQ中,然后删除旧的两分钟/值?@bobdylan确切地说,您可以从两个队列中进行轮询,获取两个元素的最小值并推送到两个队列的最小值again@bobdylan请小心调用PriorityQueue上的池以对元素进行排序不要依赖未排序的迭代器以及从列表中删除元素时会发生什么情况?@SleimanJneidi,OP没有提到这种可能性。但我想这会取消这个解决方案的资格。