changeset 1:15920e9b562d

added MulticastQueue.java the BlockingMulticastQueue
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Tue, 09 Aug 2011 11:13:36 +0900
parents a9cb12a7f995
children 36f2373f867b
files src/queue/MulticastQueue.java src/search/LinearSearch.java src/test/MapBenchmark.java src/tree/AVLTreeMap.java src/tree/BTreeMap.java
diffstat 5 files changed, 266 insertions(+), 251 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/queue/MulticastQueue.java	Tue Aug 09 11:13:36 2011 +0900
@@ -0,0 +1,129 @@
+package queue;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.concurrent.CountDownLatch;
+
+public class MulticastQueue<T>
+{
+	public static void main(String args[]) throws IOException
+	{
+		int threads = 5;
+		final MulticastQueue<String> queue = new MulticastQueue<String>();
+		
+		Runnable type2 = new Runnable(){
+
+			@Override
+			public void run()
+			{
+				Client<String> client = queue.newClient();
+				
+				for(;;){
+					String str = client.poll();
+					try {
+						Thread.sleep(10000);
+					} catch (InterruptedException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+					System.out.println(Thread.currentThread().getName()+":"+str);
+				}
+			}
+		};
+		
+		Runnable thread = new Runnable(){
+
+			@Override
+			public void run()
+			{
+				Client<String> client = queue.newClient();
+				
+				for(;;){
+					String str = client.poll();
+					System.out.println(Thread.currentThread().getName()+":"+str);
+				}
+			}
+		};
+		
+		for(int i = 0;i < threads;i ++){
+			new Thread(thread).start();
+		}
+		new Thread(type2).start();
+		
+		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+		for(;;){
+			String str = br.readLine();
+			queue.put(str);
+		}
+	}
+	
+	
+	Node<T> tail;
+	
+	public MulticastQueue()
+	{
+		tail = new Node<T>(null);
+	}
+	
+	public synchronized void put(T item)
+	{
+		Node<T> next = new Node<T>(item);
+		tail.set(next);
+		tail = next;
+	}
+	
+	public Client<T> newClient()
+	{
+		return new Client<T>(tail);
+	}
+	
+	static class Client<T>
+	{
+		Node<T> node;
+		
+		Client(Node<T> tail)
+		{
+			node = tail;
+		}
+		
+		public T poll()
+		{
+			Node<T> next = null;
+			
+			try {
+				next = node.next();
+			}catch(InterruptedException _e){
+				_e.printStackTrace();
+			}
+			node = next;
+			return next.item;
+		}
+	}
+	
+	private static class Node<T>
+	{
+		private T item;
+		private Node<T> next;
+		private CountDownLatch latch;
+		
+		public Node(T item)
+		{
+			this.item = item;
+			this.next = null;
+			latch = new CountDownLatch(1);
+		}
+		
+		public void set(Node<T> next)
+		{
+			this.next = next;
+			latch.countDown();
+		}
+		
+		public Node<T> next() throws InterruptedException
+		{
+			latch.await();
+			return next;
+		}
+	}
+}
--- a/src/search/LinearSearch.java	Wed Jul 06 15:19:52 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-package search;
-
-public class LinearSearch
-{
-	public static void main(String args[])
-	{
-		LinearSearch table = new LinearSearch();
-		
-		table.add(1,"one");
-		table.add(10,"ten");
-		table.add(2,"two");
-		
-		String x = (String)table.search(10);
-		if(x != null){
-			System.out.println("value = "+x);
-		}else{
-			System.out.println("Not found");
-		}
-	}
-	
-	class Entry
-	{
-		int key;
-		Object data;
-		
-		public Entry(int key,Object data)
-		{
-			this.key = key;
-			this.data = data;
-		}
-	}
-		
-	final static int MAX = 100;
-	final Entry[] table = new Entry[MAX];
-	int n = 0;
-	
-	public void add(int key,Object data)
-	{
-		if(n >= MAX){
-			System.err.println("データの個数が多すぎます。");
-			return;
-		}
-		
-		table[n++] = new Entry(key,data);
-	}
-	
-	public Object search(int key)
-	{
-		int i;
-		
-		i = 0;
-		while(i < n){
-			if(table[i].key == key){
-				return (table[i].data);
-			}
-			i++;
-		}
-		
-		return null;
-	}
-}
--- a/src/test/MapBenchmark.java	Wed Jul 06 15:19:52 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package test;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import tree.*;
-
-public class MapBenchmark
-{
-	public static void main(String args[]) throws InterruptedException
-	{
-		int num = 20000;
-		int threads = 5;
-		ExecutorService service = Executors.newFixedThreadPool(threads);
-		
-		Map<Integer,Integer> map = new SynchronizedMap<Integer,Integer>(new AVLTreeMap<Integer,Integer>());
-		//Map<Integer,Integer> map = Collections.synchronizedMap(new TreeMap<Integer,Integer>());
-		
-		
-		LinkedList<Integer> keys[] = new LinkedList[threads];
-		for(int i = 0;i < keys.length;i ++){
-			Random rnd = new Random();
-			keys[i] = new LinkedList<Integer>();
-			for(int j = 0;j < num;j ++){
-				keys[i].add(rnd.nextInt());
-			}
-		}
-		
-		Task<Integer> tasks[] = new Task[threads];
-		for(int i = 0;i < tasks.length;i ++){
-			tasks[i] = new Task<Integer>(keys[i],map);
-		}
-		
-		for(int i = 0;i < tasks.length;i ++){
-			service.execute(tasks[i]);
-		}
-		
-		service.shutdown();
-		service.awaitTermination(Long.MAX_VALUE,TimeUnit.DAYS);
-		
-		System.out.println("");
-	}
-	
-	public static class Task<K> implements Runnable
-	{
-		private Map<K,K> map;
-		private List<K> keys;
-		public Task(List<K> keys,Map<K,K> map)
-		{
-			this.keys = keys;
-			this.map = map;
-		}
-		
-		@Override
-		public void run()
-		{
-			long start = System.currentTimeMillis();
-			for(K key : keys){
-				map.put(key,key);
-			}
-			System.out.println(System.currentTimeMillis() - start);
-		}
-	}
-}
--- a/src/tree/AVLTreeMap.java	Wed Jul 06 15:19:52 2011 +0900
+++ b/src/tree/AVLTreeMap.java	Tue Aug 09 11:13:36 2011 +0900
@@ -1,8 +1,5 @@
 package tree;
 
-import java.util.LinkedList;
-import java.util.Random;
-
 public class AVLTreeMap<K extends Comparable<K>,V> implements Map<K,V>
 {
 	private Node<K,V> root;
@@ -12,22 +9,11 @@
 	{
 		AVLTreeMap<Integer,String> map = new AVLTreeMap<Integer,String>();
 		
-		Random r = new Random();
-		LinkedList<Integer> keys = new LinkedList<Integer>();
-		for(int i = 0;i < 30000;i ++){
-			int num = r.nextInt();
-			keys.add(num);
-			map.put(num,Integer.toString(num));
-		}
-		
-		for(Integer key : keys){
-			String value = map.get(key);
-			if(!key.toString().equals(value)){
-				System.out.println("gehoge");
-			}
-		}
-		
-		System.out.println("hoge");
+		map.put(10,"10");
+		map.put(20,"20");
+		map.put(30,"20");
+		map.put(5,"5");
+		map.put(7,"7");
 	}
 	
 	public AVLTreeMap()
@@ -59,7 +45,7 @@
 			}
 			
 			cur.right = _put(cur.right,key,value);
-			cur.rdepth = Math.max(cur.right.rdepth,cur.right.ldepth);
+			cur.rdepth = Math.max(cur.right.ldepth,cur.right.rdepth) + 1;
 			int diff = cur.rdepth - cur.ldepth;
 			
 			if(diff > 1){
@@ -72,7 +58,6 @@
 					return doubleRotate(cur,OP_RIGHTLEFT);
 				}
 			}
-			
 		}else if(result > 0){
 			//left
 			if(cur.left == NULL_NODE){
@@ -103,6 +88,130 @@
 		return cur;
 	}
 	
+	public V remove(K key)
+	{
+		RemoveResult<K,V> r = findRemoveTarget(root,key);
+		root = r.cur;
+		return r.target.value;
+	}
+	
+	private RemoveResult<K,V> findRemoveTarget(Node<K,V> cur,K key)
+	{
+		int result = cur.key.compareTo(key);
+		if(result < 0){
+			//right
+			if(cur == NULL_NODE){
+				return new RemoveResult<K,V>(cur,NULL_NODE);
+			}
+			
+			RemoveResult<K,V> r = findRemoveTarget(cur.right,key);
+			cur.right = r.cur;
+			cur.rdepth = Math.max(cur.right.rdepth,cur.right.ldepth) + 1;
+			
+			int diff = cur.rdepth - cur.ldepth;
+			if(diff > 1){
+				int rottype = result * cur.right.key.compareTo(key);
+				if(rottype > 0){
+					r.cur = singleRotate(cur,OP_RIGHT);
+					return r;
+				}else{
+					r.cur = doubleRotate(cur,OP_RIGHTLEFT);
+					return r;
+				}
+			}
+			
+			r.cur = cur;
+			return r;
+		}else if(result > 0 ){
+			//left
+			if(cur == NULL_NODE){
+				return new RemoveResult<K,V>(cur,NULL_NODE);
+			}
+			
+			RemoveResult<K,V> r = findRemoveTarget(cur.left,key);
+			cur.left = r.cur;
+			cur.ldepth = Math.max(cur.left.rdepth,cur.left.ldepth) + 1;
+			
+			int diff = cur.rdepth - cur.ldepth;
+			if(diff > 1){
+				int rottype = result * cur.left.key.compareTo(key);
+				if(rottype > 0){
+					r.cur = singleRotate(cur,OP_LEFT);
+					return r;
+				}else{
+					r.cur = doubleRotate(cur,OP_LEFTRIGHT);
+					return r;
+				}
+			}
+			
+			r.cur = cur;
+			return r;
+		}else{
+			//find
+			if(cur.left == NULL_NODE && cur.right == NULL_NODE){
+				//delete
+				return new RemoveResult<K,V>(NULL_NODE,cur);
+			}
+			
+			if(cur.left != NULL_NODE && cur.right == NULL_NODE){
+				//replace left
+				return new RemoveResult<K,V>(cur.left,cur);
+			}
+			
+			if(cur.left == NULL_NODE && cur.right != NULL_NODE){
+				//replace right
+				return new RemoveResult<K,V>(cur.right,cur);
+			}
+			
+			//both nodes are not null
+			RemoveResult<K,V> r = findSubstituteNode(cur.left);
+			cur.key = r.target.key;
+			cur.value = r.target.value;
+			cur.right = r.cur;
+			cur.rdepth = Math.max(cur.ldepth,cur.rdepth) + 1;
+			
+			int diff = cur.rdepth - cur.ldepth;
+			if(diff > 1){
+				r.cur = doubleRotate(cur,OP_LEFTRIGHT);
+			}
+			
+			return r;
+		}
+	}
+	
+	private RemoveResult<K,V> findSubstituteNode(Node<K,V> cur)
+	{
+		if(cur.right != NULL_NODE){
+			RemoveResult<K,V> result = findSubstituteNode(cur.right);
+			cur.right = result.cur;
+			cur.rdepth = Math.max(cur.right.rdepth,cur.right.ldepth) + 1;
+			
+			int diff = cur.ldepth - cur.rdepth;
+			if(diff > 1){
+				result.cur = singleRotate(cur.left,OP_LEFT);
+				return result;
+			}
+			
+			result.cur = cur;
+			return result;
+		}
+		
+		RemoveResult<K,V> result = new RemoveResult<K,V>(cur.left,cur);
+		return result;
+	}
+	
+	private static class RemoveResult<K,V>
+	{
+		Node<K,V> cur;
+		Node<K,V> target;
+		
+		public RemoveResult(Node<K,V> cur,Node<K,V> target)
+		{
+			this.cur = cur;
+			this.target = target;
+		}
+	}
+	
 	private static final int OP_LEFT = 1;
 	private static final int OP_RIGHT = 2;
 	
@@ -167,36 +276,25 @@
 		return cur.value;
 	}
 	
-	@Override
-	public V remove(K key)
-	{
-		
-	}
-	
-	private Node<K,V> _remove(K key)
-	{
-		
-	}
-	
 	private static class Node<K,V>
 	{
 		K key;
 		V value;
 		
+		int rdepth;
+		int ldepth;
+		
 		Node<K,V> left;
 		Node<K,V> right;
 		
-		int ldepth;
-		int rdepth;
-		
 		public Node(K key,V value,int rdepth,int ldepth,Node<K,V> left,Node<K,V> right)
 		{
+			this.right = right;
+			this.left = left;
+			this.ldepth = ldepth;
+			this.rdepth = rdepth;
 			this.key = key;
 			this.value = value;
-			this.ldepth = ldepth;
-			this.rdepth = rdepth;
-			this.left = left;
-			this.right = right;
 		}
 		
 		@Override
--- a/src/tree/BTreeMap.java	Wed Jul 06 15:19:52 2011 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-package tree;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-public class BTreeMap<K extends Comparable<K>,V> implements Map<K,V> 
-{
-	private final int order;
-	
-	public BTreeMap(int order)
-	{
-		this.order = order;
-	}
-	
-	@Override
-	public void put(K _key, V _value)
-	{
-	}
-	
-	@Override
-	public V get(K _key)
-	{
-		return null;
-	}
-	
-	public V remove(K _key)
-	{
-		return null;
-	}
-	
-	private static abstract class Node<K extends Comparable<K>,V>
-	{
-		@Override
-		public abstract String toString();
-	}
-	
-	private class Link<K extends Comparable<K>,V>
-	{
-		public K key;
-		public Node<K,V> node;
-		
-		public Link(K key,Node<K,V> node)
-		{
-			this.key = key;
-			this.node = node;
-		}
-	}
-	
-	private class Bucket<K extends Comparable<K>,V> extends Node<K,V>
-	{
-		private final int order;
-		private ArrayList<Link<K,V>> children;
-		
-		public Bucket(int order)
-		{
-			this.order = order;
-			children = new ArrayList<Link<K,V>>(this.order+2);
-		}
-		
-		@Override
-		public String toString()
-		{
-			return "bucket";
-		}
-	}
-	
-	private class Leaf<K extends Comparable<K>,V> extends Node<K,V>
-	{
-		public K key;
-		public V value;
-		
-		public Leaf(K key,V value)
-		{
-			this.key = key;
-			this.value = value;
-		}
-		
-		@Override
-		public String toString()
-		{
-			return String.format("key = %s , value = %s",key,value);
-		}
-	}
-}