散列连接算法

时间:2014-04-23 13:48:15

标签: c# algorithm

我有两个表,每个表存储在一个List中。 该表有两列(因此列表中的数组大小为2)

List<int[]> tablea;
List<int[]> tableb;

tablea的内容

 a b 
{1,2}
{3,4}
{5,6}

tableb的内容

 b c
{2,3}
{2,4}
{6,7}

现在我希望按字段b连接两个表,结果是

 a b c
{1,2,3}
{1,2,4}
{5,6,7}

我知道我可以这样做是排序合并连接算法,算法非常直观。 但我听说混合hashjoin(这里提到http://en.wikipedia.org/wiki/Hash_join#_note-1)更快。

我是否知道如何使用混合hashjoin算法在C#(最好)或java中连接tablea和tableb? (我在这里关心的是速度而不是空间)

1 个答案:

答案 0 :(得分:0)

可以处理非唯一键值的颂歌如下:

Dictionary<int, List<int[]>> hashA = new Dictionary<int, List<int[]>>();
    foreach (int[] a in tablea) {
       List<int> list;
       if (!hashA.TryGetValue(a[1], out list) {
          list = new List<int>();
          hashA.Add(a[1], list);
       }
       list.Add(a);
    }
    List<int[]> result = new List<int[]>();
    foreach (int[] b in tableb) {
       List<int[]> a;
       if (hashA.TryGetValue(b[0], out a) {
          foreach (int[] line in a) {
             result.Add(new int[] { line[0], line[1], b[1] });
          }
       }
    }