面向对象编程

1 篇文章 0 订阅
作者:disappearedgod
时间:2014-9-10

1. 请设计在线图书阅读系统的数据结构
2. 请描述该如何设计一个聊天服务器。要求给出各种后台组件、类和方法的细节,并说明其中最难解决的问题会是什么?
3.设计一种内存文件系统(in-memory file system)的数据结构和算法,并说明具体做法。如有可行,请用代码举例说明。
4.设计并实现一个散列表,使用链接(即链表)处理碰撞冲突。

1. 请设计在线图书阅读系统的数据结构
2. 请描述该如何设计一个聊天服务器。要求给出各种后台组件、类和方法的细节,并说明其中最难解决的问题会是什么?
3.设计一种内存文件系统(in-memory file system)的数据结构和算法,并说明具体做法。如有可行,请用代码举例说明。
一个最简单的文件系统:Files & Directory。
Directory has Files andDirectory.


4.设计并实现一个散列表,使用链接(即链表)处理碰撞冲突。
假设实现类似的Hash<K,V>的散列表(该散列表类型k的对象映射为类型V的对象)
首先,我们或许会想到数据结构应该大致如下:
public class Hash<K,v>{
	LinkedList<V>[] items;
	public void put(K key, V value){}
	public V get(K key){}
}

注意items是一个链表的Array,items[i]四个链表,包含所有Key映射成索引i的对象(在i出碰撞冲突的所有对象)。
这么做看似可行,不过要下定论,还要更深入一些考虑碰撞冲突的情况。
假设一个非常简单,使用字符串长度的HashCode Function:
public int hasCodeOfKey(K key){
	return key.toString().length() % items.length;
}

一个存值做法
public class Hash<K, V>{
	private final int MAX_SIZE = 10;
	LinkedList<Cell<K, V>>[] items;
	
	public Hash(){
		items = (LinkedList<Cell<K, V>>[]) new LinkedList[MAX_SIZE];
	}
	
	public int hasCodeOfKey(K key){
		return key.toString().length() % item.length;
	}
	
	public void put(K key, V value){
		int x = hasCodeOfKey(key);
		if(items[x] == null)
			items[x] = new LinkedList<Cell<K, V>>();
		LinkedList<Cell<K, V>> collided = items[x];
		
		for(Cell<K, V> c:collided){
			if(c.equivalent(key)){
				collided.remove(c);
				break;
			}
		}
		
		Cell<K,V> cell = new Cell<K, V>(key, value);
		collied.add(cell);
	}
	
	public V get(K key){
		int x = hashCodeOfKey(key);
		if(item[x] == null)
			return null;
		LinkedList<Cell<K, V>> collided = items[x];
		for(Cell<K, V> c:collided){
			if(c.equivalent(key)){
				return c.getValue();
			}
		}
	}
	return null;
}

Cell类存储有一对数据Key & Value。我们就可以搜索整个List(解决碰撞冲突,key不同在一个cell),找到对应的object
public class Cell<K, V>{
	private K key;
	private V value;
	public Vell(K k, V v){
		key = k;
		value = v;
	}
	
	public boolean equivalent(Cell<K, V> c){
		return equivalent(c.getKey());
	}
	
	public boolean equivalent(K k){
		return key.equals(k);
	}
	
	public K getKey() {return key;}
	public V getValue() { return value;}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值