————2020.1.15————

# 学习记录 || Coding_Record #


# LRU

比较常见的页面置换算法。*leetcode 146

# 个人简易实现(Java)

 1 import java.util.HashMap;
 2
 3
 4 class LRUCache {
 5
 6     public static class Node{
 7         public Object val;
 8         public Object key;
 9         public Node next;
10         public Node last;
11
12         public Node(Object key,Object val) {
13             this.val = val;
14             this.key = key;
15         }
16     }
17
18     public static class DoubleList{
19         private Node head;
20         private Node tail;
21         public int size;
22
23         public DoubleList() {
24             this.size = 0;
25             this.head = new Node(0,0);
26             this.tail = new Node(0,0);
27             head.next = tail;
28             head.last = null;
29             tail.last = head;
30             tail.next = null;
31         }
32
33         public void addToHead(Node node) {
34             Node tmp = head.next;
35             head.next = node;
36             tmp.last = node;
37             node.last = head;
38             node.next = tmp;
39             size++;
40         }
41
42         public Node removeLast() {
43             Node tmp = tail.last;
44             tmp.last.next = tail;
45             tail.last = tmp.last;
46             size--;
47             return tmp;
48         }
49
50         public void moveToHead(Node node) {
51             node.last.next = node.next;
52             node.next.last = node.last;
53             size--;
54             addToHead(node);
55         }
56
57     }
58     private int capacity;
59
60     private DoubleList list = new DoubleList();
61
62     private HashMap<Object,Node> map = new HashMap<>();
63
64     public LRUCache(int capacity) {
65         this.capacity = capacity;
66     }
67
68     public void put(Object key,Object value) {
69         Node node = map.get(key);
70         if(node!=null) {
71             node.val = value;
72             list.moveToHead(node);
73         }
74         else {
75             Node newNode = new Node(key,value);
76             if(list.size==capacity) {
77                 Node delnode = list.removeLast();
78                 map.remove(delnode.key);
79             }
80             list.addToHead(newNode);
81             map.put(key,newNode);
82         }
83     }
84
85     public Object get(Object key) {
86         Node node = map.get(key);
87         if(node==null) return -1;
88         else {
89             list.moveToHead(node);
90             return node.val;
91         }
92     }
93 }

# SkipList

基于链表的随机化数据结构。 *leetcode 1206

# 参考题解的简易实现(Java)

  1 import java.util.ArrayList;
  2 import java.util.List;
  3
  4
  5 public class SkipList {
  6
  7     public class SkipListNode{
  8
  9         public Integer value;
 10         public SkipListNode right;
 11         public SkipListNode left;
 12         public SkipListNode down;
 13
 14         public SkipListNode(Integer value) {
 15             this.value = value;
 16             this.down = null;
 17             this.right = null;
 18             this.left = null;
 19         }
 20     }
 21
 22     private List<SkipListNode> heads ;
 23
 24     public SkipList() {
 25         SkipListNode head_of_0 = new SkipListNode( Integer.MIN_VALUE );
 26         heads = new ArrayList<>();
 27         heads.add(head_of_0);
 28     }
 29
 30     public boolean search(Integer target) {
 31         int level = heads.size()-1;
 32         SkipListNode curNode = heads.get(level);
 33         while(level != -1) {
 34             boolean jump = false;
 35             while(curNode.right != null) {
 36                 curNode = curNode.right;
 37                 if(curNode.value == target) {
 38                     return true;
 39                 }
 40                 else if(curNode.value > target) {
 41                     if(level == 0) return false;
 42                     else {
 43                         level--;
 44                         curNode = curNode.left;
 45                         jump = true;
 46                         break;
 47                     }
 48                 }
 49             }
 50             if(jump==true) continue;
 51             level--;
 52             curNode = curNode.down;
 53         }
 54         return false;
 55     }
 56
 57     private void del(SkipListNode node){
 58         node.left.right = node.right;
 59         if(node.right != null ) {
 60             node.right.left = node.left;
 61         }
 62     }
 63
 64     private boolean throwCoin(){
 65         return Math.random()<0.5f;
 66     }
 67
 68     public SkipListNode[] searchNodes(Integer target) {
 69         int level = heads.size()-1;
 70         SkipListNode[] jumps = new SkipListNode[heads.size()];
 71         SkipListNode curNode = heads.get(level);
 72         while(level!=-1){
 73             boolean jump = false;
 74             while(curNode.right!= null){
 75                 curNode = curNode.right;
 76                 if(curNode.value == target) {
 77                     while(level!=-1){
 78                         jumps[level] = curNode;
 79                         curNode = curNode.down;
 80                         level --;
 81                     }
 82                     return jumps;
 83                 }
 84                 else if(curNode.value>target){
 85                     jumps[level] = curNode.left;
 86                     level --;
 87                     curNode = curNode.left.down;
 88                     jump = true;
 89                     break;
 90                 }
 91             }
 92             if(jump)
 93                 continue;
 94             jumps[level] = curNode;
 95             level --;
 96             curNode = curNode.down;
 97         }
 98         return jumps;
 99     }
100
101     public void erase(Integer target) {
102         SkipListNode[] jmpt = searchNodes(target);
103         for (SkipListNode n:jmpt)
104             if(n.value == target){
105                 del(n);
106             }
107     }
108
109     public void add(Integer num) {
110         SkipListNode curNode = new SkipListNode(num);
111         SkipListNode[] curNodes = searchNodes(num);
112         SkipListNode leftNode = curNodes[0];
113         curNode.right = leftNode.right;
114         curNode.left = leftNode;
115         if(leftNode.right!=null)
116             leftNode.right.left=curNode;
117         leftNode.right = curNode;
118         //Add Index
119         int curIndex = 1;
120         while(throwCoin()){
121             SkipListNode tmp;
122             if(curNodes.length <= curIndex){
123                 tmp= new SkipListNode(curIndex-1);
124                 heads.add(tmp);
125                 tmp.down = heads.get(curIndex-1);
126             }
127             else
128                 tmp = curNodes[curIndex];
129             SkipListNode curtmp = new SkipListNode(num);
130             curtmp.down = curNode;
131             curtmp.right = tmp.right;
132             curtmp.left = tmp;
133             if(tmp.right!=null)
134                 tmp.right.left = curtmp;
135             tmp.right = curtmp;
136             curNode = curtmp;
137             curIndex++;
138         }
139     }
140     public static void main(String[] args) {
141         SkipList sl = new SkipList();
142         sl.add(1);
143         sl.add(2);
144         System.out.println(sl.search(3));
145     }
146 }


# Edit : 2020.1.15

原文地址:https://www.cnblogs.com/zzl1209/p/12198060.html

时间: 2024-10-30 01:15:31

————2020.1.15————的相关文章

每日思考(2020/01/15)

题目概览 DOM和BOM有什么区别? 让网页的字体变得清晰,变细用CSS怎么做? 写一个方法把0和1互转(0置1,1置0) 题目解答 DOM和BOM有什么区别? DOM 是 Document Object Model 的缩写.即文档对象模型,遵循 W3C 制定的标准.提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本.其本质就是 DOM 元素.最早使用的 document.getElement

2020/02/15 理解图论中的拉普拉斯算子与拉普拉斯矩阵

学习资料 知乎-[其实贼简单]拉普拉斯算子和拉普拉斯矩阵 CSDN-我见过最清晰的–理解梯度,散度,旋度 原文地址:https://www.cnblogs.com/Research-XiaoEMo/p/12311268.html

2020.02.15 线程死锁问题

package com.guoyun.ThreadTest; /** * ClassName:. * Function: ADD FUNCTION * Reason: ADD REASON * * @author * @Date * @since Ver 1.1 */public class DeadLockDemo { public static void main(String[] args) { new DeadLock("张三").start(); new DeadLock(&

多层感知机——2020.2.15

一.隐藏层 ????多层感知机在单层神经?络的基础上引?了?到多个隐藏层(hidden layer).隐藏层位于输?层和输出层之间.下图展示了?个多层感知机的神经?络图,它含有?个隐藏层,该层中有5个隐藏单元. ????上图所示的多层感知机中,输?和输出个数分别为4和3,中间的隐藏层中包含了5个隐藏单元(hidden unit).由于输?层不涉及计算,因此上图的多层感知机的层数为2.由上图可?,隐藏层中的神经元和输?层中各个输?完全连接,输出层中的神经元和隐藏层中的各个神经元也完全连接.因此,多

2020.2.15

一.大数据spark 补写实验报告 学习 python 二.<一线架构师实践指南>阅读 阅读了最后一章 原文地址:https://www.cnblogs.com/yeshenfeng/p/12315055.html

2020寒假15

信件数据成果 1. 2. 3. 4. 原文地址:https://www.cnblogs.com/leity/p/12315378.html

2020年AI、CV、NLP顶会最全时间表

2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40 2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地点.投稿截止日期.官方网址/社交媒体地址,还有H指数(谷歌学术的期刊会议评判标准,即过去5年内有至多h篇论文被引用了至少h次). 2月 AAAI 2020 会议名称: Association for the Advancement of Artificial Intelligence 会议地点: New

————2020.1.16————

# 算法 || 记一次递归到dp优化实例 # # *leetcode 115   1.暴力递归(Java) 1 public class Solutions { 2 public static int numDistinct(String s, String t) { 3 return dfs (s,t,0,""); 4 } 5 6 public static int dfs(String s, String t, int index, String cur) { 7 if (inde

2020年度春季学习总结--第四周

日期:2020.03.15 博客期:166 星期日 我说过要提升我的博客质量,所以最近应该写的数量比较少.当然啊,这也不单单是这一个原因造成的. 这一星期我感觉有什么变化呢?我感觉自己成熟了不少,就跟换了一个人似的,像是被中年老大爷附体了!有一个特点就是看老师直播很精神(特别精神),但一到老师的录播视频就感觉自己很不想看!具体表现嘛,像是:1.看到自己会的一些知识都忍不住想 跳过 或者是 开1.5倍速.2.看录播视频的时候心根本就没有放到学习上.3.遇到比较难的问题在课上就想着课下再看,到了课下