Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在任意大小的窗口中跟踪最高值和最低值_Java_Sorting - Fatal编程技术网

Java 如何在任意大小的窗口中跟踪最高值和最低值

Java 如何在任意大小的窗口中跟踪最高值和最低值,java,sorting,Java,Sorting,我有一个音频输入流,它接收当前播放音乐的音量级别。 然后在最新卷的特定窗口大小(范围从5到40)上,我希望跟踪窗口内的最高值和最低值。因此,在每次迭代中,删除添加的最旧值,并添加最新的卷级别读数 假设我用5个窗口运行程序8次迭代,结果会是这样。 只有低值和高值才是重要的 加2 二, 加4 2 4 加3 2 3 4 加2 2 2 3 4 加7 2 2 3 4 7 -从列表中删除前2个添加9 23479 删除4个,添加5个 23579 删除3个,添加2个 2 2 5 7 9 等 最有效的方法是什么?

我有一个音频输入流,它接收当前播放音乐的音量级别。 然后在最新卷的特定窗口大小(范围从5到40)上,我希望跟踪窗口内的最高值和最低值。因此,在每次迭代中,删除添加的最旧值,并添加最新的卷级别读数

假设我用5个窗口运行程序8次迭代,结果会是这样。 只有低值和高值才是重要的

加2

二,

加4

2 4

加3

2 3 4

加2

2 2 3 4

加7

2 2 3 4 7

-从列表中删除前2个添加9

23479

删除4个,添加5个

23579

删除3个,添加2个

2 2 5 7 9

最有效的方法是什么?使用什么类型的集合

编辑注意,此循环在单独的线程上不断运行


值是浮动的

您可以使用链表,因为您希望在列表中存储重复的值。另外,由于您计划添加到最后一个元素,因此使用LinkedList API的addLast()方法。在您自己的add()方法中,检查大小。如果大小达到最大大小,则可以调用链接列表的removeFirst()方法,然后调用addLast()方法。这样,您的链接列表大小将保持不变为5

public class Tester {
private LinkedList<Integer> values = new LinkedList<Integer>();
private static final int MAX_VAL = 5;

public void addvalue(int val) {
    if (values.size() == this.MAX_VAL) {
        values.removeFirst();
    }
    values.addLast(val);
}

public int getMaxValue(){           
    return Collections.min(values);
}

public int getMinValue(){
    return Collections.max(values);
}
公共类测试器{
私有LinkedList值=新LinkedList();
专用静态最终整数最大值=5;
公共void addvalue(int val){
if(values.size()==this.MAX_VAL){
value.removeFirst();
}
值。addLast(val);
}
public int getMaxValue(){
返回集合.min(值);
}
public int getMinValue(){
返回集合.max(值);
}
}


在每次迭代中,添加和删除一个数字,然后添加最小值和最小值 马克斯发现,它们的数量是一样的

使用平衡二叉树,例如,在最坏的情况下,所有操作都将是O(logn)。我相信,如果这些操作连续发生,那么三个操作是O(1),一个操作是O(n)是没有意义的

顺便说一句,n=5太小了,我不明白你为什么要太担心效率低下

编辑: 要跟踪对象的顺序,可以使用简单队列作为二级结构。当您需要删除时,您将删除队列的头,并将其用作在树中删除的键。。。。添加和删除需要固定的时间

注意:可以到此为止,原始想法如下

一个更复杂的数据结构将得到调整,它在所有操作之间提供了一个很好的折衷:

  • 插入是
    O(日志n)
  • 删除是
    O(n)
  • 最小值和最大值都是
    O(l)

如果只删除最大/最小值,则删除将是对数的。调整是

因为值是5到40的整数,如果窗口很大,我们可以通过存储数组
count[]
来尝试获得良好的平均案例时间,该数组记录每个卷的窗口数。然后添加新元素并删除最后一个元素(保留一个链接列表,如
LinkedList
)是一个固定时间,除非
low
high
处的计数降至0。然后从最后一个最佳值开始逐个搜索值,这是
O(35)
,但实际上可能更便宜,尤其是在窗口较大的情况下

在某种程度上,这是一个恒定时间的解决方案,在实际输入中,添加的体积元素数。它的
O(nk)
听起来像
k
只有三十多卷。假设数据分布合理,我怀疑我们可以证明平均病例时间是
\Theta(nk/w)
,其中
w
是窗口大小


这听起来不像是一个高吞吐量的操作(用户多久可以更改一次音量,数百次???),但这就是我在这些条件下实现它的方式。

谢谢,如何有效地跟踪列表的最小值和最大值?因为您使用的是整数,所以可以直接调用集合。在链接列表上进行排序如果我先对其进行排序,然后删除它,它将删除最小值,而不是添加的最早值?我已经忘记了最大值和最小值的api方法。我已经编辑了我的代码。看一看,这是θ(元素总数*窗口大小)。为什么要保持一个单独的集合。为什么不从末尾(尾部)向后迭代,同时保持最小值和最大值?复杂性是一样的。这里有两对操作。最小值\最大值和添加\删除。哪一个更经常出现??在每次迭代中,一个数字被添加和删除,然后找到最小值和最大值,它们出现的次数相同。它适用于android应用程序,该应用程序计算每个实例的音量是否超过窗口内高值和低值之和的%。我对速度的了解非常有限,所以我只想让它尽可能快。我对删除有点困惑,你如何跟踪你的想法中添加值的顺序?是的,在你的问题中,你删除了最古老的。我忘了。editeddid你是说TreeSet而不是TreeMap,因为TreeMap是按键排序的?嗨,我觉得这里有些混乱,只有一个窗口,窗口中的值是最后(窗口大小)值的浮动。音量是根据播放音乐的音频输出流计算的,而不是用户音量,对不起,我没有说清楚。好吧,不管是什么,这是一种方法。这只取决于数据的属性(分布),以及是否有很小的机会成为O(n)“慢”是至关重要的