对于数组实现的(伪)循环队列的理解
方法一
for(int i = 0; i < size; i ++ )
移动基础时 front + i
方法二
front(int i = front; i != tail i = (i+1) % L )
移动基础是 i
对于上述两种方法应用时的一些注意点
*当浪费一个空间时(有size)
判断为空 front = = tail
判断为满 if((tail + 1) % data.length = = front)
判断是否为最后一个元素
循环条件 for (int i = front ; i != tail ; i = (i + 1) % data.length)
判断最后一个元素的条件if (i + 1) % data.length != tail
*当浪费一个空间时(无size) //完全不使用size,只使用front和tail来完成LoopQueue的所有逻辑
判断为空 front = = tail
判断为满 if((tail + 1) % data.length == front)
判断是否为最后一个元素
循环条件 for (int i = front ; i != tail ; i = (i + 1) % data.length)
判断最后一个元素的条件if (i + 1) % data.length != tail
计算size个数 tail >= front ? tail - front : data.length - (front - tail);
*当不浪费一个空间时(有size)
判断为空 size = = 0
判断为满 size = = getCapacity()
判断是否为最后一个元素
循环条件 for (int i = 0; i < size; i ++)
判断最后一个元素的条件if ((i + front + 1) % data.length != tail)
总结:对于toString中
for(循环) { 无论用(i~0,i<size;i++) 还是 (i~front,i !~ tail;(i+1)%L,目的都是把循环数组从头到尾循环一遍
判断是否不是最后一个元素,然后加 , 逗号
最后一个元素 加 ]
}
判断是否是最后一个元素:tail总是指向最后一个元素的下一个索引位置,当这个元素索引+1不等tail,就可以证明它不是最后一个元素,与浪费不浪费space无关。从front开始循环,然后到tail,最后一个元素的索引其实在tail前面啊,与浪费space无关,这是个与tail本身含义相关的判断要素
数组队列和循环队列的时间复杂度比较(ArrayQueue VS LoopQueue)
使用System.nanoTime 记录时间,然后实际运行enqueue和dequeue
对比ArrayQueue和LoopQueue的运行时间
他们enqueue都是O(1),但Arraydequeue是O(n),Loopdequeue是O(1),所以有时间差距
public class Main {
//比较ArrayQueue和LoopQueue性能
//参数使用Queue接口,是为了既可以传入ArrayQueue,又可以传入LoopQueue,以实现多态
//测试使用q运行opCount个enqueueu和dequeue操作所需要的时间,单位:秒
private static double TestQueue(Queue<Integer> q, int operationCount) {
long startTime = System.nanoTime();
Random random = new Random();
for (int i = 0; i < operationCount; i ++) {
q.enQueue(random.nextInt(Integer.MAX_VALUE));
}
for (int i = 0; i < operationCount; i ++) {
q.deQueue();
}
long endTime = System.nanoTime();
return (endTime - startTime) / 1000000000.0; //注意这里, .0
}
public static void main(String[] args) {
int operationCount = 100000;
//ArrayQueue : enqueue(E) 均摊O(1)
//ArrayQueue : dequeue() O(n)
ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();
double arrayTime = TestQueue(arrayQueue,operationCount);
System.out.println("ArrayQueue : " + arrayTime);
//LoopQueue : enqueue(E) 均摊O(1)
//LoopQueue : dequeue() 均摊O(1)
LoopQueue<Integer> loopQueue = new LoopQueue<>();
double loopTime = TestQueue(loopQueue,operationCount);
System.out.println("LoopTime : " + loopTime);
}
}
java中/与%的区别
/ 结果等于得到的整数(商的整数)
% 结果等于余数(剩余多少)