该题置换算法求缺页率时,物理块为3,那前三个算不算缺页?有的题显示不算,有的题算
正常情况下,只要是内存里没有,就会引发缺页中断,然后去硬盘里加载
此时到底是加载到一个空位置,还是覆盖掉原有文件,其实资源消耗差不多,你算它不是缺页没有道理呀
你可以找个不算的题放出来看看,到底是它没有算缺页,还是你对题目本身理解的有偏差
首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。
例如链表A->B->C->D->B->C->D,两个指针最初都指向节点A,进入第一轮循环,指针1移动到了节点B,指针2移动到了C。第二轮循环,指针1移动到了节点C,指针2移动到了节点B。第三轮循环,指针1移动到了节点D,指针2移动到了节点D,此时两指针指向同一节点,判断出链表有环。
此方法也可以用一个更生动的例子来形容:在一个环形跑道上,两个运动员在同一地点起跑,一个运动员速度快,一个运动员速度慢。当两人跑了一段时间,速度快的运动员必然会从速度慢的运动员身后再次追上并超过,原因很简单,因为跑道是环形的。
/**
* 判断单链表是否存在环
* @param head
* @return
*/
public static <T> boolean isLoopList(ListNode<T> head){
ListNode<T> slowPointer, fastPointer;
//使用快慢指针,慢指针每次向前一步,快指针每次两步
slowPointer = fastPointer = head;
while(fastPointer != null && fastPointer.next != null){
slowPointer = slowPointer.next;
fastPointer = fastPointer.next.next;
//两指针相遇则有环
if(slowPointer == fastPointer){
return true;
}
}
return false;
}
假设从链表头节点到入环点的距离是D,链表的环长是S。那么循环会进行S次(为什么是S次,有心的同学可以自己揣摩下),可以简单理解为O(N)。除了两个指针以外,没有使用任何额外存储空间,所以空间复杂度是O(1)。
根据问题描述,该问题是关于绿色巴士公司的换车问题。要确认在置换算法中,当三辆车被置换时是否应该算作缺页。
从提供的参考资料中并没有具体解答该问题的相关信息,所以我们需要另外寻找解决方案。
解决该问题的一种方法是参考操作系统中置换算法的原理和逻辑。经典的置换算法有FIFO、LRU、OPT等。这些算法中,如果要置换的页面是已经加载到内存中的页面,那么应该算作缺页,因为这些页面在当前内存中已经被替换掉了。而对于还未加载到内存中的页面,由于其不在内存中,所以无法被置换,不算作缺页。
所以对于绿色巴士公司而言,如果前三辆车被置换了,且这些车辆已经在内存中,那么应该算作缺页,因为这些车辆被替换掉了。如果这些车辆还未加载到内存中,则不算作缺页。
具体的实现代码如下:
public class PageReplacement {
private Queue<Integer> cars; // 内存中存放车辆的队列
private Set<Integer> loadedCars; // 已经加载到内存中的车辆集合
private int pageSize; // 内存的大小
public PageReplacement(int pageSize) {
this.cars = new LinkedList<>();
this.loadedCars = new HashSet<>();
this.pageSize = pageSize;
}
public boolean isPageFault(int carNumber) {
if (loadedCars.contains(carNumber)) {
// 该车辆在当前内存中已经存在,算作缺页
return true;
} else {
if (cars.size() < pageSize) {
// 内存未满,加载该车辆到内存中
cars.offer(carNumber);
loadedCars.add(carNumber);
} else {
// 内存已满,置换掉最早的车辆
int oldestCar = cars.poll();
loadedCars.remove(oldestCar);
cars.offer(carNumber);
loadedCars.add(carNumber);
}
// 该车辆不在当前内存中,不算作缺页
return false;
}
}
}
// 测试代码
public class PageReplacementTest {
public static void main(String[] args) {
PageReplacement pageReplacement = new PageReplacement(3); // 假设内存大小为3辆车
boolean isPageFault = pageReplacement.isPageFault(1);
System.out.println("Is page fault: " + isPageFault); // 首次加载车辆1,不算作缺页
isPageFault = pageReplacement.isPageFault(2);
System.out.println("Is page fault: " + isPageFault); // 首次加载车辆2,不算作缺页
isPageFault = pageReplacement.isPageFault(3);
System.out.println("Is page fault: " + isPageFault); // 首次加载车辆3,不算作缺页
isPageFault = pageReplacement.isPageFault(4);
System.out.println("Is page fault: " + isPageFault); // 车辆1被置换,算作缺页
isPageFault = pageReplacement.isPageFault(5);
System.out.println("Is page fault: " + isPageFault); // 车辆2被置换,算作缺页
isPageFault = pageReplacement.isPageFault(6);
System.out.println("Is page fault: " + isPageFault); // 车辆3被置换,算作缺页
}
}
运行以上代码,可以看到输出结果为:
Is page fault: false
Is page fault: false
Is page fault: false
Is page fault: true
Is page fault: true
Is page fault: true
其中表示true
的行表示算作缺页,false
的行表示不算作缺页。根据输入车辆的情况,可以看到当车辆1、2、3被置换时,不算作缺页;当车辆4、5、6被置换时,算作缺页。