using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cnic.Lib
{
    public class TreeNode<N>
    {
        public TreeNode<N> this[int index]
        {
            get
            {
                if (this.Next == null || this.Next.Length <= index)
                {
                    return null;
                }
                return this.Next[index];
            }
            set
            {
                if (this.Next == null)
                {
                    this.Next = new TreeNode<N>[index + 1];
                }
                else if (this.Next.Length <= index)
                {
                    TreeNode<N>[] arr = new TreeNode<N>[index + 1];
                    this.Next.CopyTo(arr, 0);
                    this.Next = arr;
                }
                this.Next[index] = value;
            }
        }
        TreeNode<N>[] Next { get; set; }
        public N Value { get; set; }
    }
    public class IndexTreeBase<K,T>
    {
        TreeNode<T> root = new TreeNode<T>();
        public void Insert(K key, T value)
        {
            byte[] keys = ConvertToKeys(key);
            TreeNode<T> temp = root;
            for (int i = 0; i < keys.Length; i++)
            {
                if (temp[keys[i] & 15] == null)
                {
                    temp[keys[i] & 15] = new TreeNode<T>();
                }
                temp = temp[keys[i] & 15];
                if (temp[keys[i] >> 4] == null)
                {
                    temp[keys[i] >> 4] = new TreeNode<T>();
                }
                temp = temp[keys[i] >> 4];
            }
            temp.Value = value;
        }
        public TreeNode<T> GetNode(K key)
        {
            byte[] keys = ConvertToKeys(key);
            TreeNode<T> temp = root;
            for (int i = 0; i < keys.Length; i++)
            {
                temp = temp[keys[i] & 15];
                if (temp == null)
                {
                    return null;
                }
                temp = temp[keys[i] >> 4];
                if (temp == null)
                {
                    return null;
                }
            }
            return temp;
        }
        protected virtual byte[] ConvertToKeys(K key) { throw new NotImplementedException(); }
    }
    public class StringKeyTree<T> : IndexTreeBase<string,T>
    {
        protected override byte[] ConvertToKeys(string key)
        {
            return Encoding.UTF8.GetBytes(key);
        }
    }
    public class IntKeyTree<T> : IndexTreeBase<int, T>
    {
        protected override byte[] ConvertToKeys(int key)
        {
            byte[] rtun = new byte[4];
            rtun[0] = (byte)key;
            rtun[1] = (byte)(key >> 8);
            rtun[2] = (byte)(key >> 16);
            rtun[3] = (byte)(key >> 24);
            return rtun;
        }
    }
}
            DateTime s = DateTime.Now;
            //Cnic.Lib.StringKeyTree stringTree = new Lib.StringKeyTree();
            Cnic.Lib.StringKeyTree<int> tree = new Lib.StringKeyTree<int>();
            for (int i = 0; i < 1000000; i++)
            {
                tree.Insert("http://www.cnblogs.com/CodeBase/" + i, i);
            }
            MessageBox.Show((DateTime.Now-s).TotalMilliseconds.ToString());
            s = DateTime.Now;
            int count = 0;
            for (int i = 0; i < 10000000; i++)
            {
                Cnic.Lib.TreeNode<int> node = tree.GetNode("http://www.cnblogs.com/CodeBase/" + i);
                if (node != null && node.Value > 0) { count += 1; }
            }
            string t = (DateTime.Now - s).TotalMilliseconds.ToString();
            MessageBox.Show(t);

 

posted on 2013-12-25 21:07  CodeBase  阅读(183)  评论(0)    收藏  举报