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);
浙公网安备 33010602011771号