作者: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;}
}