合并两个排序列表
其实只要是合并两个集合,无论是数组还是列表,都应该与MergeSort的Merge阶段类似,即只看重第一个(或最后一个)元素,在比较大小后放入新排序的集合。
对于链表而言,无论何时,创建一个dummyNode一般都有用。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
head.next = l1;
l1 = l1.next;
} else {
head.next = l2;
l2 = l2.next;
}
head = head.next;
}
//对于链表而言只需要改变引用即可
if (l1 != null) {
head.next = l1;
}
if (l2 != null) {
head.next = l2;
}
return dummy.next;
}
}
页面置换算法
我是统计出身,并不是严格的计算机科班人员,之前曾经尽可能地补过一些基础,但是对于这样的计算机基础题目一直都很头疼,今天尝试回答一下这道题目。
在操作系统发现需要访问的页面不在内存中的时候,就需要将其加载到内存中。而当内存中不存在空闲页面空间的时候,就需要将其中一个移出内存。内存置换算法就是用来选择将哪一个页面移除内存的。
OPT(理想置换算法)
从内存中移出永远不再需要的页面,如果没有这样的页面存在,就移出最长时间不需要访问的页面。但是这样的算法其实是很难实现的,它不仅要考虑内存内页面的情况,还需要考虑之后任务的执行情况。
FIFO(先进先出置换算法)
这是一种最好实现的页面置换算法,只需要一个队列即可实现。其思想页非常简单,最先使用的页面最先被淘汰。
当然这里使用队列实现的只是一种模拟情况,真实情况下应该是最早进入内存的页面会直接被新的页面覆盖,而不是简单的入队出队。
LRU(最近最少使用算法)
这道题可以用LinkedHashMap很快地做出来哈哈哈哈。
LRU的核心思想就是将目前为止最不经常使用的页面移出,并移入新的页面。
LFU(最不经常使用算法)
像比如LRU,LFU显得有些绝对,它是直接将过去使用最少的页面移出内存,对应的,也就需要有额外的空间来存储器使用次数。
时钟(CLOCK)置换算法
这是一个我今天才知道的置换算法…不愧是我,菜的一如既往
将每一个页面看作一帧,在其被使用或加入内存的时候,帧的使用位被记为1,当某一页被替换的时候操作系统会循环扫描所有帧,并将路过的帧置为0;如果在这个过程中所有帧都是0,就将第一帧移出;如果全为1,就将所有帧都置为0并替换第一帧。