public SymbolGraph(T[,] inputs) { indexes = new LinearProbingHashSymbolTable <T, int>(); // 构建顶点到索引的映射 for (int i = 0; i < inputs.GetLength(0); i++) { for (int j = 0; j < inputs.GetLength(1); j++) { if (!indexes.Contains(inputs[i, j])) { indexes.Put(inputs[i, j], indexes.Size); } } } // 构建索引到顶点的映射 keys = new T[indexes.Size]; foreach (var item in indexes) { keys[indexes.Get(item.Key)] = item.Key; } // 构建图 graph = new UndirectedGraph(indexes.Size); for (int i = 0; i < inputs.GetLength(0); i++) { int v = indexes.Get(inputs[i, 0]); for (int j = 1; j < inputs.GetLength(1); j++) { graph.AddEdge(v, Index(inputs[i, j])); } } }
public void LinearProbingHashSymbolTableTest() { int[] xs = { 3, 4, 5, 2, 6 }; var st = new LinearProbingHashSymbolTable <int, int>(xs.Length * 2); for (int i = 1; i <= xs.Length; i++) { // can not use index 0! default(int) == 0 st.Put(i, xs[i - 1]); } int v; for (int i = 1; i <= xs.Length; i++) { if (st.TryGet(i, out v)) { Assert.Equal(xs[i - 1], v); } else { Assert.False(true); } } }