符号表

一、无序链表的顺序查找:

import java.util.ArrayList;
import java.util.Iterator;


public class SequentialSearchST<Key, Value>
{
	private Node first;
	private int N;
	private class Node
	{
		Key key;
		Value val;
		Node next;
		public Node(Key key, Value val, Node next)
		{
			this.key = key;
			this.val = val;
			this.next = next;
		}
		public int size()
		{
			return N;
		}
		public boolean isEmpty()
		{
			return N == 0;
		}
		public Iterable<Key> keys()
		{
			ArrayList<Key> a = new ArrayList<Key>();
			for (Node x = first; x != null; x = x.next)
				a.add(x.key);
			return a;
		}
		public Value get(Key key)
		{
			for (Node x = first; x != null; x = x.next)
				if (x.key.equals(key))
					return x.val;
			return null;
		}
		public void put(Key key, Value val)
		{
			for (Node x = first; x != null; x = x.next)
				if (key.equals(x.key))
					x.val = val;
			first = new Node(key, val, first);
			N++;
		}
		public void delete(Key key)
		{
			delete(first, key);
		}
		private Node delete (Node x, Key key)
		{
			if (x == null) return null;
			if (key.equals(x.key)) 
			{
				N --;
				return x.next;
			}
			x.next = delete(x.next, key);
			return x;
		}
	}
	
}

二、基于二分查找的有序符号表的实现:

public class BinarySearchST< Key extends Comparable<Key>, Value>
{
	private Key[] keys;
	private Value[] vals;
	private int N;
	public BinarySearchST(int capacity)
	{
		keys = (Key[])new Comparable[capacity];
		vals = (Value[])new Object[capacity];
	}
	public int size()
	{
		return N;
	}
	public boolean isEmpty()
	{
		return N == 0;
	}
	public Value get(Key key)
	{
		if (isEmpty()) return null;
		int i = rank(key);
		if (i < N && keys[i].compareTo(key) == 0)
			return vals[i];
		else return null;
	}
	public int rank(Key key)
	{
		int lo = 0; 
		int hi = N - 1;
		while (lo <= hi)
		{
			int mid = lo + (hi - lo) / 2;
			if (keys[mid].compareTo(key) < 0) lo = mid + 1;
			else if (keys[mid].compareTo(key) > 0) hi = mid - 1;
			else return mid;
		}
		return lo;
	}
	public void put(Key key, Value val)
	{
		int i = rank(key);
		if (i < N && key.compareTo(keys[i]) == 0)
		{
			vals[i] = val;
			return;
		}
		for (int j = N ; j > i; j--)
		{
			keys[j] = keys[j-1];
			vals[j] = vals[j-1];
			
		}
		keys[i] = key;
		vals[i] = val;
		N++;
		return;
	}
	public void delete(Key key)
	{
		if (isEmpty()) return;
		int i = rank(key);
		if (i >= N || keys[i].compareTo(key) != 0)
			return;
		for (int j = i; j < N; j++)
		{
			keys[j] = keys[j+1];
			vals[j] = vals[j+1];
		}
		N--;
		keys[N] = null;
		vals[N] = null;
	}
	 public Key min()
	 {
	        if (isEmpty()) return null;
	        return keys[0]; 
	 }
	 public Key max()
	 {
	        if (isEmpty()) return null;
	        return keys[N-1]; 
	 }
	 public Key ceiling(Key key) 
	 {
	        if (key == null) return null;
	        int i = rank(key);
	        if (i == N) return null; 
	        else return keys[i];
	}
	 public Key floor(Key key) 
	 {
	        if (key == null) return null;
	        int i = rank(key);
	        if (i < N && key.compareTo(keys[i]) == 0) return keys[i];
	        if (i == 0) return null;
	        else return keys[i-1];
	    }
	 public Iterable<Key> keys(Key lo, Key hi) 
	 {
	         Queue<Key> queue = new Queue<Key>(); 
	        if (lo.compareTo(hi) > 0) return queue;
	        for (int i = rank(lo); i < rank(hi); i++) 
	            queue.enqueue(keys[i]);
	        if (contains(hi)) queue.enqueue(keys[rank(hi)]);
	        return queue; 
	}
	 public Key select(int k) 
	 {
	        return keys[k];
	 }
	 public boolean contains(Key key) 
	 {
	        return get(key) != null;
	 }

	 
	 
}

三、二叉查找树的实现:

public class BST<Key extends Comparable<Key>, Value> 
{
	private Node root;
	private class Node
	{
		private Key key;
		private Value val;
		private Node left, right;
		private int N;
		public Node(Key key, Value val, int N)
		{
			this.key = key;
			this.val = val;
			this.N = N;
		}
	}
	public int size()
	{
		return size(root);
	}
	private int size(Node x)
	{
		if (x == null) return 0;
		return x.N;
	}
	public Value get(Key key)
	{
		return get(root, key);
	}
	private Value get(Node x, Key key)
	{
		if (x == null) return null;
		int cmp = key.compareTo(x.key);
		if (cmp < 0) return get(x.left, key);
		else if (cmp > 0) return get(x.right, key);
		else 
			return x.val;
	}
	public void put(Key key, Value val)
	{
		root = put(root, key, val);
	}
	private Node put(Node x, Key key, Value val)
	{
		if (x == null) return new Node(key, val, 1);
		int cmp = key.compareTo(x.key);
		if (cmp < 0) x.left = put(x.left, key, val);
		else if (cmp > 0) x.right = put(x.right, key, val);
		else x.val = val;
		x.N = size(x.left) + size(x.right) + 1;
		return x;
	}
	public Key min()
	{
		return min(root).key;
	}
	private Node min(Node x)
	{
		if (x.left == null) return x;
		else
			return min(x.left);
	}
	public Key max()
	{
		return max(root).key;
	}
	private Node max(Node x)
	{
		if (x.right == null) return x;
		else
			return max(x.right);
	}
	public Key floor(Key key)
	{
		Node x = floor(root, key);
		if (x == null) return null;
		else return x.key;
	}
	private Node floor(Node x, Key key)
	{
		if (x == null) return null;
		int cmp = key.compareTo(x.key);
		if (cmp == 0) return x;
		if (cmp < 0) return floor(x.left, key);
		Node t = floor(x.right, key);
		if (t != null) return t;
		else return x;
	}
	public Key select(int k)
	{
		return select(root, k).key;
	}
	private Node select(Node x, int k)
	{
		if (x == null) return null;
		int t = size(x.left);
		if (k < t) return select(x.left, k);
		else if (k > t) return select(x.right, k-1-t);
		else return x;
	}
	public int rank(Key key)
	{
		return rank(key, root);
	}
	private int rank(Key key, Node x)
	{
		if (x == null) return 0;
		int cmp = key.compareTo(x.key);
		if (cmp < 0) return rank(key, x.left);
		else if (cmp > 0) return rank(key, x.right) + size(x.left) + 1;
		else return size(x.left);
	}
	public void deleteMin()
	{
		root = deleteMin(root);
	}
	private Node deleteMin(Node x)
	{
		if (x.left == null) return x.right;
	    x.left = deleteMin(x.left);
		x.N = size(x.left) + size(x.right) + 1;
		return x;
	}
	public void delete(Key key)
	{
		root = delete(root, key);
	}
	private Node delete(Node x, Key key)
	{
		if (x == null) return null;
		int cmp = key.compareTo(x.key);
		if (cmp < 0) x.left = delete(x.left, key);
		else if (cmp > 0) x.right = delete(x.right, key);
		else
		{
			if (x.left == null) return x.right;
			if (x.right == null) return x.left;
			Node t = x;
			x = min(t.right);
			x.right = deleteMin(t.right);
			x.left = t.left;
		}
		x.N = size(x.left) + size(x.right) + 1;
		return x;
		
	}
	public Iterable<Key> keys()
	{
		return keys(min(), max());
	}
	private Iterable<Key> keys(Key lo, Key hi)
	{
		Queue<Key> queue = new Queue<Key>();
		keys(root, queue, lo, hi);
		return queue;
	}
	private void keys(Node x, Queue<Key> queue, Key lo, Key hi)
	{
		if (x == null) return;
		int cmplo = lo.compareTo(x.key);
		int cmphi = hi.compareTo(x.key);
		if (cmplo < 0) keys(x.left, queue, lo, hi);
		if (cmplo <= 0 && cmphi >= 0) queue.enqueue(x.key);
		if (cmphi > 0) keys(x.right, queue, lo, hi);
	}
}

四、红黑树(2-3树)实现:

import BST.Node;


public class RedBlackBST<Key extends Comparable<Key>, Value> 
{
	private Node root;
	private static final boolean RED = true;
	private static final boolean BLACK = false;
	private class Node
	{
		Key key;
		Value val;
		Node left, right;
		int N;
		boolean color;
		Node(Key key, Value val, int N, boolean color)
		{
			this.key = key;
			this.val = val;
			this.N = N;
			this.color = color;
		}
	}
	private boolean isRed(Node x)
	{
		if (x == null) return false;
		else return x.color == RED;
	}
	Node rotateLeft(Node h)
	{
		Node x = h.right;
		h.right = x.left;
		x.left = h;
		x.color = h.color;
		h.color = RED;
		x.N = h.N;
		h.N = 1 + size(h.left) + size(h.right);
		return x;
	}
	Node rotateRight(Node h)
	{
		Node x = h.left;
		h.left = x.right;
		x.right = h;
		x.color = h.color;
		h.color = RED;
		x.N = h.N;
		h.N = 1 + size(h.left) + size(h.right);
		return x;
	}
	void flipcolors(Node h)
	{
		h.color = RED;
		h.left.color = BLACK;
		h.right.color = BLACK;
	}
	public int size()
	{
		return size(root);
	}
	private int size(Node x)
	{
		if (x == null) return 0;
		return x.N;
	}
	public void put(Key key, Value val)
	{
		root = put(root, key, val);
		root.color = BLACK;
	}
	private Node put(Node h, Key key, Value val)
	{
		if (h == null)
			return new Node(key, val, 1, RED);
		int cmp = key.compareTo(h.key);
		if(cmp < 0) h.left = put(h.left, key, val);
		else if(cmp > 0) h.right = put(h.right, key, val);
		else h.val = val;
		
		if (isRed(h.right)&&!isRed(h.left)) h = rotateLeft(h);
		if (isRed(h.left)&&isRed(h.left.left)) h = rotateRight(h);
		if (isRed(h.left)&&isRed(h.right)) flipcolors(h);
		h.N = size(h.left) + size(h.right) + 1;
		return h;
	}
}

五、基于拉链法的散列表实现:

public class SeparateChainingHashST<Key, Value> 
{
	private int N;
	private int M;
	private SequentialSearchST<Key, Value>[] st;
	public SeparateChainingHashST()
	{
		this(997);
	}
	private SeparateChainingHashST(int M)
	{
		this.M = M;
		st = (SequentialSearchST<Key, Value>[])new SequentialSearchST[M];
		for(int i = 0; i < M; i++)
			st[i] = new SequentialSearchST();
	}
	private int hash(Key key)
	{
		return(key.hashCode() & 0x7fffffff) % M;
	}
	public Value get(Key key)
	{
		return (Value)st[hash(key)].get(key);
	}
	public void put(Key key, Value val)
	{
		st[hash(key)].put(key,val);
	}
}

六、基于线性探测法的散列表:

public class LinearProbingHashST<Key, Value> 
{
	private int N;
	private int M = 16;
	private Key[] keys;
	private Value[] vals;
	private LinearProbingHashST(int M)
	{
		this.M = M;
		keys = (Key[])new Object[M];
		vals = (Value[])new Object[M];
	}
	private int hash(Key key)
	{
		return (key.hashCode() & 0x7fffffff) % M;
	}
	public void resize(int cap)
	{
		LinearProbingHashST<Key, Value> t;
		t = new LinearProbingHashST<Key, Value>(cap);
		for (int i = 0; i < M; i++)
			if (keys[i] != null)
				t.put(keys[i], vals[i]);
		keys = t.keys;
		vals = t.vals;
		M = t.M;
	}
	public void put(Key key, Value val)
	{
		if (N >= M / 2) resize(2 * M);
		int i;
		for (i = hash(key); keys[i] != null; i = (i + 1) % M )
			if (keys[i].equals(key))
			{
				vals[i] = val;
				return;
			}
		keys[i] = key;
		vals[i] = val;
		N++;
		
		
	}
	public Value get(Key key)
	{
		int i;
		for (i = hash(key); keys[i] != null; i = (i + 1) % M )
			if (keys[i].equals(key))
				return vals[i];
		return null;
			
	}
	private boolean contains(Key key)
	{
		return get(key) != null;
	}
	public void delete(Key key)
	{
		if (!contains(key)) return;
		int i = hash(key);
		while (!key.equals(keys[i]))
			i = (i + 1) % M;
		keys[i] = null;
		vals[i] = null;
		i = (i + 1) % M;
		while (keys[i] != null)
		{
			Key keyRedo = keys[i];
			Value valRedo = vals[i];
			keys[i] = null;
			vals[i] = null;
			N--;
			put(keyRedo, valRedo);
			i = (i + 1) % M;
		}
		N--;
		if (N > 0 && N == M / 8) resize(M / 2);
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值