diff --git a/DoublyLinkList.java b/DoublyLinkList.java new file mode 100644 index 0000000000000000000000000000000000000000..1e90d165ca257de127558eb317fd68c354ff8f59 --- /dev/null +++ b/DoublyLinkList.java @@ -0,0 +1,128 @@ +package datastruct.hashtable; + +public class DoublyLinkList { + private Node head; + + public boolean isExist(Object key) { + boolean flag = false; + Node head = this.head; + while (head != null){ + if (head.getKey().hashCode() == key.hashCode()) { + flag = true; + break; + } + head = head.getNext(); + } + return flag; + } + + public Object get(Object key) { + Node head = this.head; + while (head != null){ + if (head.getKey().hashCode() == key.hashCode()) { + return head.getValue(); + } + head = head.getNext(); + } + return null; + } + + public void insertPrev(Object key,Object value) { + if (this.head == null) { + this.head = new Node(key, value); + return; + } + Node node = new Node(key, value); + node.setNext(this.head); + this.head.setPrev(node); + this.head = node; + } + + public void insertNext(Object key,Object value) { + if (this.head == null) { + this.head = new Node(key, value); + return; + } + Node node = new Node(key, value); + Node head = this.head; + while (true){ + if (head.getNext()==null){ + node.setPrev(head); + head.setNext(node); + System.out.println("尾部添加:" + node.toString()); + return; + } + head = head.getNext(); + } + } + + public void toRear(Object key) { + Node head = this.head; + while (head != null) { + if (head.getKey().hashCode() == key.hashCode()) { + if (this.head.getNext() == null) { + return; + } + if (head.getPrev() != null) { + head.getPrev().setNext(head.getNext()); + } + if (head.getNext() != null) { + head.getNext().setPrev(head.getPrev()); + } + head.setPrev(null); + this.head.setPrev(head); + head.setNext(this.head); + this.head = head; + return; + } + else { + head = head.getNext(); + } + } + System.out.println("不存在指定元素"); + } + + public void deleteItem(Object key) { + deleteItem(key,this.head); + } + + public void print() { + print(this.head); + } + + private void deleteItem(Object key,Node node) { + if (node == null) { + return; + } + if (node.getKey().hashCode() == key.hashCode()) { + if (node.getPrev() == null&&node.getNext()==null) { + this.head = null; + return; + } + if (node.getPrev() == null) { + node.getNext().setPrev(null); + node = node.getNext(); + return; + } + if (node.getNext() == null) { + node.getPrev().setNext(null); + return; + } + node.getPrev().setNext(node.getNext()); + node.getNext().setPrev(node.getPrev()); + } + deleteItem(key,node.getNext()); + } + + private void print(Node node) { + if (node == null) { + System.out.println(""); + return; + } + System.out.print(node.getKey() + ":" + node.getValue() + " | "); + print(node.getNext()); + } + + public DoublyLinkList() { + } +} diff --git a/HashTable.java b/HashTable.java new file mode 100644 index 0000000000000000000000000000000000000000..9e4bf260d392f9d28694b2c95ccb5f4460aaa5a6 --- /dev/null +++ b/HashTable.java @@ -0,0 +1,53 @@ +package datastruct.hashtable; + +public class HashTable { + + private DoublyLinkList[] head; + + public void getItems() { + for (int i = this.head.length - 1;i >= 0;i--){ + if (this.head[i] != null) { + this.head[i].print(); + } + } + } + + public boolean contains(Object key) { + int hashKey = key.hashCode(); + int index = hashKey % this.head.length; + if (this.head[index] == null) { + return false; + }else { + return this.head[index].isExist(hashKey); + } + } + + public void insert(Object key,Object value) { + int hashKey = key.hashCode(); + int index = hashKey % this.head.length; + if (this.head[index] == null) { + this.head[index] = new DoublyLinkList(); + this.head[index].insertNext(hashKey,value); + return; + } + this.head[index].insertPrev(hashKey,value); + } + + public void deleteItem(Object key) { + int hashKey = key.hashCode(); + int index = hashKey % this.head.length; + if (this.head[index] == null) { + System.out.println("NO"); + return; + } + if (this.head[index].isExist(hashKey)) { + this.head[index].deleteItem(hashKey); + return; + } + System.out.println("NO"); + } + + public HashTable(int size) { + this.head = new DoublyLinkList[size]; + } +} diff --git a/LRU.java b/LRU.java new file mode 100644 index 0000000000000000000000000000000000000000..ca754c525e680ad231da116789022ced5f2043e8 --- /dev/null +++ b/LRU.java @@ -0,0 +1,23 @@ +package datastruct.hashtable; + +public class LRU extends HashTable { + + private DoublyLinkList[] head; + + public LRU(int size) { + super(size); + } + + public Object get(Object key) { + int hashKey = key.hashCode(); + int index = hashKey % this.head.length; + this.head[index].toRear(key); + return this.head[index].get(key); + } + + public void set(Object key,Object value) { + int hashKey = key.hashCode(); + int index = hashKey % this.head.length; + this.head[index].insertPrev(key, value); + } +} diff --git a/Node.java b/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..75fa3aa93ea1a7bae9e3fbeb473999f706f14078 --- /dev/null +++ b/Node.java @@ -0,0 +1,44 @@ +package datastruct.hashtable; + +public class Node { + private Node next,prev; + private Object key; + private Object value; + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + + public Node getPrev() { + return prev; + } + + public void setPrev(Node prev) { + this.prev = prev; + } + + public Object getKey() { + return key; + } + + public void setKey(Object key) { + this.key = key; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public Node(Object key, Object value) { + this.key = key; + this.value = value; + } +} diff --git a/README.md b/README.md deleted file mode 100644 index 9b9609634106c366a0c78ad7e34a9fd7f9987a45..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# 散列表实验 - -### 作业要求 - -1. 必做任务:基础部分 -2. 选做任务:进阶部分,做多少是多少 - -### 截止日期 - -下次实验课上课前(12.09) - -### 基础 - -1. 实现⼀个基于链表法解决冲突问题的散列表 - -### 进阶 - -1. 结合链表和散列表,实现⼀个 O(1)的 LRU 缓存淘汰算法 - -## 工作流程 - -1. Fork 本仓库 -2. Clone 代码到本地 -3. 切换到自己学号对应的分支 -4. 完成作业 -5. 提交代码 -6. 新建 Pull Request - -## Questions - -1. 如何提交?lec02-linkedlist 项目中的参考作业提交流程.pdf 文件 diff --git a/Test.java b/Test.java new file mode 100644 index 0000000000000000000000000000000000000000..80d4e8af5901859b0bdc94c85ad413046fe873ae --- /dev/null +++ b/Test.java @@ -0,0 +1,26 @@ +package datastruct.hashtable; + +public class Test { + public static void main(String[] args) { +// DoublyLinkList linkList = new DoublyLinkList(); +// linkList.insertNext(1,"abc"); +// linkList.insertNext(2,"ccc"); +// linkList.insertNext(3,"aaa"); +// linkList.print(); +// System.out.println("========================"); +// linkList.insertPrev(0,"object"); +// linkList.print(); +// System.out.println("========================"); +// linkList.deleteItem(1); +// linkList.print(); + HashTable hashTable = new HashTable(6); + hashTable.insert(1,"sss1111"); + hashTable.insert(2,"sss2222"); + hashTable.insert(3,"sss3333"); + hashTable.insert(4,"sss4444"); + hashTable.insert(5,"sss5555"); + hashTable.insert(11,"sss151515"); + hashTable.insert(6,"sss6666"); + hashTable.getItems(); + } +} diff --git "a/\350\257\276\344\273\266/lecture06-hashtable.pdf" "b/\350\257\276\344\273\266/lecture06-hashtable.pdf" deleted file mode 100644 index 514de25d9af834be1eeee73b6af4e1d10a13e851..0000000000000000000000000000000000000000 Binary files "a/\350\257\276\344\273\266/lecture06-hashtable.pdf" and /dev/null differ