【算法】第三章查找

##顺序查找 - 无序链表
太简单、直接上代码了

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
//书上还有 最大 最小 向上取整 向下取整 太简单了 直接掠过。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值