在JAVA中计算FIFO队列中的PeekMedian()
我需要尽快的帮助。 我想实现一个peekMedian函数,它查看在所有对象中具有中值的对象,而不将其从队列中移除。 它应该返回值为(size/2+1)th最低的对象在JAVA中计算FIFO队列中的PeekMedian(),java,Java,我需要尽快的帮助。 我想实现一个peekMedian函数,它查看在所有对象中具有中值的对象,而不将其从队列中移除。 它应该返回值为(size/2+1)th最低的对象 import java.util.ArrayDeque; import java.util.Iterator; public class ArrayDequeDemo { public static void main(String[] args) {
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
例如,假设队列具有以下值。{ 2, 1, 2, 2, 6, 4, 2, 5}
然后该方法应该返回2,并且不删除该对象
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
我尝试过使用collection.sort(),但队列不应根据问题进行排序。我还尝试复制数组中的队列元素,找到第n个最小值并返回该值。但是问题是“返回对象”。。。
而且解决方案的复杂度应该更低。这看起来像是一个家庭作业,所以我将发布一个算法来解决这个问题:
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
注意:如果您的任务是在不删除队列中的任何对象的情况下执行此操作,那么这是不可能的,至少您可以将队列作为数组或链接列表进行威胁,并对其进行迭代
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
我将向您展示使用Java队列的代码实现
public <T> T peekMedian(Queue<T> queue) {
int medianIndex = queue.size() / 2 + 1; //based on your question.
Queue<T> auxQueue = new LinkedList<T>();
T result;
int count = 1;
while(queue.peek() != null) {
auxQueue.add(queue.pop());
if (count == medianIndex) {
result = auxQueue.peek();
}
count++;
}
while(auxQueue.peek() != null) {
queue.add(auxQueue.pop());
}
return result;
}
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
public T(队列){
int medianIndex=queue.size()/2+1;//根据您的问题。
Queue auxQueue=newlinkedlist();
T结果;
整数计数=1;
while(queue.peek()!=null){
添加(queue.pop());
如果(计数==medianIndex){
结果=auxQueue.peek();
}
计数++;
}
while(auxQueue.peek()!=null){
add(auxQueue.pop());
}
返回结果;
}
试试这个
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
import java.util.ArrayDeque;
导入java.util.Iterator;
公共类ArrayDequeDemo{
公共静态void main(字符串[]args){
ArrayDeque=新的ArrayDeque();
//在队列中添加元素
q.添加(2);
q.添加(1);
q.添加(2);
q.添加(2);
q.添加(6);
q.添加(4);
q.添加(2);
q.添加(5);
整数中值=中值(que);
系统输出打印LN(中值);
}
私有静态整数中值(ArrayQue){
整数ele=0;//所需数字
int size=que.size();
//查找ele的索引。
int-elementFromlastIndex=(size/2)+1;
迭代器descItr=que.degendingIterator();
int计数器=0;
//按相反顺序迭代,直到未达到ele的索引。当达到ele的索引时,循环将中断,从而找到所需的元素。
while(descItr.hasNext()&&counter!=elementFromlastIndex){
ele=(整数)descItr.next();
++计数器;
if(计数器==elementFromlastIndex)
打破
}//当
返回ele;
}
}
}//阶级
我想我知道怎么做,昨天我被要求实施
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
在O(1)时间内实现最大值或最小值很容易,不是吗?为什么不把队列分成两个队列,一个存储小于中间值的项目,一个存储大于中间值的项目,始终保持这种关系,当您插入项目时,依次插入到每个队列中,您就可以得到中间值
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
当保持这个关系时,可能会有一些操作,但我认为完全是O(1)时间,因为我们在O(1)中得到了最大值或最小值,并且插入值可以在O(1)中下降,所以它仍然是O(1),听起来不错
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class
我希望我是对的。如果有什么不对劲,请告诉我。那么,我想这是家庭作业吧?如果是,请相应地标记它。是否有任何范围限制附加到该数字?不,没有范围限制。我们只需要找到该对象并返回该特定对象,而无需将其从队列中删除。谢谢…但所需元素是(大小/2+1)第个最低编号,而不是(大小/2+1)第个no@samcoder所以我说“也许问题就是这样提出的:):)…那么根据提出的问题,你知道如何找到这个“中位数”吗“?是的,这就是算法实现的。你想雇我来实施它吗?记住,这件事。您的实际实现仅适用于同样实现了队列的ArrayQueue,但OP需要使用最后一个。
import java.util.ArrayDeque;
import java.util.Iterator;
public class ArrayDequeDemo {
public static void main(String[] args) {
ArrayDeque<Integer> que = new ArrayDeque<Integer>();
// add elements in queue
que.add(2);
que.add(1);
que.add(2);
que.add(2);
que.add(6);
que.add(4);
que.add(2);
que.add(5);
Integer median = peekMedian(que);
System.out.println(median);
}
private static Integer peekMedian(ArrayDeque<Integer> que){
Integer ele=0; //required number
int size=que.size();
//finding the index of ele.
int elementFromlastIndex= (size/2)+1;
Iterator descItr = que.descendingIterator();
int counter=0;
// iterate in reverse order till the index of ele is not reached.The loop will break when when index of ele is reached and thereby finding required element.
while(descItr.hasNext() && counter!=elementFromlastIndex) {
ele =( Integer)descItr.next();
++counter;
if(counter==elementFromlastIndex)
break;
}//while
return ele;
}
}
}//class