【算法】第三章查找

##順序查找 - 無序鏈表
太簡單、直接上代碼了

public Node(Key key,Value val,Node Next) {
	this.key = key;
	this.val = val;
	this.next = next;
}

public Value get(Key key) {
	for(Node n = first;n!=null;n=n.next) {
		if(n.key==key) {
			return n.val;
		}
	}
	return null;
}
	
public void put(Key key,Value val) {
	for(Node n = first;n!=null;n=n.next) {
		if(n.key==key) {
			n.val=val;
			return;
		}
	}
	
	first = new Node(key,val,first);
}

未命中 查找 N次 插入 N次
向空表插入N個數據 (N^2)/2 次比較

##二分法查找 -數組列表
也不是很難 直接代碼

	//get
	public Value get(Key key) {
		int i = rank(key);
		if(i<N&&keys[i].compareTo(key)==0) {return vals[i];}
		else return null;
	}
	//put
	public void put(Key key,Value val) {
		if(val==null) {delete(key);return;}
		
		int i = rank(key);
		if(i<N&&keys[i].compareTo(key)==0) {vals[i]=val;return;}
		
		for(int j = N;j>=i;j--) {
			keys[j] = keys[j-1];
			vals[j] = vals[j-1];
			if(j==i) {
				keys[i]=key;
				vals[i]=val;
			}
		}
		N++;
	}
	//core code rank
	public int rank(Key key) {
		int lo = 0;
		int hi = N - 1;
		int mid = lo + (hi - lo)/2;
		while(lo<=hi) {
			int cmp = key.compareTo(keys[mid]);
			if(cmp<0) 			hi = mid - 1;
			else if(cmp>0) 		lo = mid + 1;
			else				return mid;
			mid = lo + (hi - lo)/2;
		}
		return lo;
	}

在有N個鍵的有序數組中,二分查找最多需要 lgN+1 次比較
向有N個鍵的有序數組中,插入一個新元素最多需要 2N次比較

##二叉查找樹
沒有重點,直接代碼

//二叉節點類 , 注意每次更新要更新 節點數量N
	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 Value get(Node x,Key key) {
		//if(key == root.key) return root.val;
		//else(key.compareTo(root.key))
		if(x == null) {return null;}
		int cmp = key.compareTo(x.key);
		//left right 常常寫反,最後以後寫得時候紙上比劃一下
		if(cmp<0){
			 return get(x.right,key);
		}else if(cmp>0){
			return get(x.left,key);
		}else {
			return x.val;
		}
	}
	
	public 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.right,key,val);
		else if(cmp>0) x.right = put(x.left,key,val);
		else x.val = val;
		x.N = size(x.left) + size(x.right) + 1;
		return x;
	}

和二分法相比 就是 插入和查找得效率差不多。
查找命中所需比較次數約爲2lnN(1.39lgN)

求證:
設 Cn 爲 n個元素得二叉查找樹平均比較次數
則 平均查找成本爲 (1 + Cn/n) //暫時不明白爲什麼 + 1

Cn = N - 1 + (C0 + Cn-1)/N + (C1 + Cn-2)/N + (C2 + Cn-3)/N + 。。。 + (Cn-1 + C0)/N
歸納得 Cn~ 2NlnN
//書上還有 最大 最小 向上取整 向下取整 太簡單了 直接掠過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章