(二叉樹的實現方案將在下一篇文章介紹)html
public class BinarySearchST { int [] keys; // 存儲key int [] vals; // 存儲value int N = 0; // 計算字典長度 public BinarySearchST (int n) { // 根據輸入的數組長度初始化keys和vals keys = new int[n]; vals = new int[n]; } public int rank (int key) { // 查找Key的位置並返回 // 核心方法 } public void put (int key, int val) { // 經過一些方式調用rank } public int get (int key) { // 經過一些方式調用rank } public int delete (int key) { // 經過一些方式調用rank } }
public int rank (int key) { int mid; int low= 0,high = N-1; while (low<=high) { mid = (low + high)/2; if(key<keys[mid]) { high = mid - 1; } else if(key>keys[mid]) { low = mid + 1; } else { return mid; // 查找成功,返回Key的位置 } } return low; // 返回小於給定Key的元素數量 }
public void put (int key, int val) { int i = rank(key); if(i<N&&key == keys[i]) { // 查找到Key, 替換vals[i]爲val vals[i] = val; return ; // 返回 } for (int j=N;j>i;j-- ) { // 未查找到Key keys[j] = keys[j-1]; // 將keys數組中小於key的值所有右移一位 vals[j] = vals[j-1]; // 將vals數組中小於val的值所有右移一位 } keys[i] = key; // 插入給定的key vals[i] = val; // 插入給定的val N++; }
for (int j=N;j>i;j-- ) { }
for (int j=i + 1;j<=N;j++ ) { }
public boolean isEmpty () { return N == 0; } // 判斷字典是否爲空(不是數組!) public int get (int key) { if(isEmpty()) return -1; // 當字典爲空時,不須要進行查找,提示操做失敗 int i = rank(key); if(i<N&&keys[i] == key) { return vals[i]; // 當查找成功時候, 返回和key對應的value值 } return -1; // 沒有查找到給定的key,提示操做失敗 }
public int delete (int key) { if(isEmpty()) return -1; // 字典爲空, 無需刪除 int i = rank(key); if(i<N&&keys[i] == key) { // 當給定key存在時候,刪除該key-value對 for(int j=i;j<=N-1;j++) { keys[j] = keys[j+1]; // 刪除key vals[j] = keys[j+1]; // 刪除value } N--; // 字典長度減1 return key; // 刪除成功,返回被刪除的key } return -1; // 未查找到給定key,刪除失敗 }
for (int j=N;j>i;j-- ) { }
for(int j=i;j<=N-1;j++) { }
public int floor (int key) { int k = get(key); // 查找key, 返回其value int rank = rank(key); // 返回給定key的位置 if(k!=-1) return key; // 查找成功,返回值爲key else if(k==-1&&rank>0) return keys[rank-1]; // 未查找到key,同時給定key並無排在字典最左端,則返回小於key的前一個值 else return -1; // 未查找到key,給定Key排在字典最左端,沒有floor值 }
代碼java
public int ceiling (int key) { int k = rank(key); if(k==N) return -1; return keys[k]; }
public int size () { return N; }
public int max () { return keys[N-1]; } // 返回最大的key public int min () { return keys[0]; } // 返回最小的key public int select (int k) { // 根據下標返回key if(k<0||k>N) return -1; return keys[k]; }
keys = tempKeys;
vals = tempVals;
private void resize (int max) { // 調整數組大小 int [] tempKeys = new int[max]; int [] tempVals = new int[max]; for(int i=0;i<N;i++) { tempKeys[i] = keys[i]; tempVals[i] = vals[i]; } keys = tempKeys; vals = tempVals; }
// 字典長度遇上了數組長度,將數組長度擴大爲原來的2倍 if(N == keys.length) { resize(2*keys.length) }
/** * @Author: HuWan Peng * @Date Created in 11:54 2017/12/10 */ public class BinarySearchST { int [] keys; int [] vals; int N = 0; public BinarySearchST (int n) { keys = new int[n]; vals = new int[n]; } public int size () { return N; } public int max () { return keys[N-1]; } // 返回最大的key public int min () { return keys[0]; } // 返回最小的key public int select (int k) { // 根據下標返回key if(k<0||k>N) return -1; return keys[k]; } public int rank (int key) { int mid; int low= 0,high = N-1; while (low<=high) { mid = (low + high)/2; if(key<keys[mid]) { high = mid - 1; } else if(key>keys[mid]) { low = mid + 1; } else { return mid; } } return low; } public void put (int key, int val) { int i = rank(key); if(i<N&&key == keys[i]) { // 查找到Key, 替換vals[i]爲val vals[i] = val; return ; // 返回 } for (int j=N;j>i;j-- ) { // 未查找到Key keys[j] = keys[j-1]; // 將keys數組中小於key的值所有右移一位 vals[j] = vals[j-1]; // 將vals數組中小於val的值所有右移一位 } keys[i] = key; // 插入給定的key vals[i] = val; // 插入給定的val N++; } public boolean isEmpty () { return N == 0; } // 判斷字典是否爲空(不是數組!) public int get (int key) { if(isEmpty()) return -1; // 當字典爲空時,不須要進行查找,提示操做失敗 int i = rank(key); if(i<N&&keys[i] == key) { return vals[i]; // 當查找成功時候, 返回和key對應的value值 } return -1; // 沒有查找到給定的key,提示操做失敗 } public int delete (int key) { if(isEmpty()) return -1; // 字典爲空, 無需刪除 int i = rank(key); if(i<N&&keys[i] == key) { // 當給定key存在時候,刪除該key-value對 for(int j=i;j<=N-1;j++) { keys[j] = keys[j+1]; // 刪除key vals[j] = keys[j+1]; // 刪除value } N--; // 字典長度減1 return key; // 刪除成功,返回被刪除的key } return -1; // 未查找到給定key,刪除失敗 } public int ceiling (int key) { int k = rank(key); if(k==N) return -1; return keys[k]; } public int floor (int key) { int k = get(key); // 查找key, 返回其value int rank = rank(key); // 返回給定key的位置 if(k!=-1) return key; // 查找成功,返回值爲key else if(k==-1&&rank>0) return keys[rank-1]; // 未查找到key,同時給定key並無排在字典最左端,則返回小於key的前一個值 else return -1; // 未查找到key,給定Key排在字典最左端,沒有floor值 } }
public class SequentialSearchST { Node first; // 頭節點 int N = 0; // 鏈表長度 private class Node { // 內部Node類 int key; int value; Node next; // 指向下一個節點 public Node (int key,int value,Node next) { this.key = key; this.value = value; this.next = next; } } public void put (int key, int value) { } public int get (int key) { } public void delete (int key) { } }
public void put (int key, int value) { for(Node n=first;n!=null;n=n.next) { // 遍歷鏈表節點 if(n.key == key) { // 查找到給定的key,則更新相應的value n.value = value; return; } } // 遍歷完全部的節點都沒有查找到給定key // 1. 建立新節點,並和原first節點創建「next」的聯繫,從而加入鏈表 // 2. 將first變量修改成新加入的節點 first = new Node(key,value,first); N++; // 增長字典(鏈表)的長度 }
first = new Node(key,value,first);
Node newNode = new Node(key,value,first); // 1. 建立新節點,並和原first節點創建「next」的聯繫 first = newNode // 2. 將first變量修改成新加入的節點
public int get (int key) { for(Node n=first;n!=null;n=n.next) { if(n.key==key) return n.value; } return -1; }
public void delete (int key) { for(Node n =first;n!=null;n=n.next) { if(n.next.key==key) { n.next = n.next.next; N--; return ; } } }
if(n.next.key==key) { n.next = n.next.next; }
/** * @Author: HuWan Peng * @Date Created in 17:26 2017/12/10 */ public class SequentialSearchST { Node first; // 頭節點 int N = 0; // 鏈表長度 private class Node { int key; int value; Node next; // 指向下一個節點 public Node (int key,int value,Node next) { this.key = key; this.value = value; this.next = next; } } public int size () { return N; } public void put (int key, int value) { for(Node n=first;n!=null;n=n.next) { // 遍歷鏈表節點 if(n.key == key) { // 查找到給定的key,則更新相應的value n.value = value; return; } } // 遍歷完全部的節點都沒有查找到給定key // 1. 建立新節點,並和原first節點創建「next」的聯繫,從而加入鏈表 // 2. 將first變量修改成新加入的節點 first = new Node(key,value,first); N++; // 增長字典(鏈表)的長度 } public int get (int key) { for(Node n=first;n!=null;n=n.next) { if(n.key==key) return n.value; } return -1; } public void delete (int key) { for(Node n =first;n!=null;n=n.next) { if(n.next.key==key) { n.next = n.next.next; N--; return ; } } } }