二维数组的自然连接

时间:2015-04-25 17:45:22

标签: java arrays natural-join

我试图在数据库中实现自然加入的相同想法,但是在二维数组上,所以我想要做的就是如果我有

A={[a,b],[a',b']} and B={[b,c], [b',c],[b,c']}

NaturalJoin(A,B)的结果应该是:

Result = {[a,b,c], [a,b,c'],[a',b',c]}

因此,在找到共享列B并在两个数组中进行比较后,如何组合这些行?你能不能给我一些关于如何创建joinTableau的提示,因为我不知道从连接开始的行数,我该如何动态创建它?

这是我的伪代码:

int[][] array1;
int[][] array2;
int shared = prtiallyEqualColumn(array1,array2);
           for(int i = 0; i <array1.length; i++)
                        {
                            for(int j = 0 ; j < array2.length; j++)
                            {
                                if(array1[i][shared] == array2[j][shared]) 
                                {
                                        for(int s = 0 ; s < shared; s++)
                                        {
                                            joinedTableau[joinedCountRow][s] = array1[i][s];
                                        }
                                        for(int y=shared+1; y<array2.length;y++)
                                        {
                                            joinedTableau[joinedCountRow][y] = array2[j][y];
                                        }
                                    }
                                }
                            }

2 个答案:

答案 0 :(得分:1)

我不知道你在代码中做了什么,因为你已经隐藏了问题中提供的代码中的几个实现。我给你的算法: -

  

必须将array1的每个列值与每个行值进行比较   array2生成一个自然连接,只有在它们相等的情况下,否则   不

a1 = array1.countRow();
a2 = array1.countColumn();
b1 = array2.countRow();
b2 = array2.countColumn();
i = j = 1;
while(i<=a1)
while(j<=b1)
if(array1[i][a2]==array2[j][1]) // I've made array-indices start from 1
// perform natural-join operation between array1[i]+array2[j]-common_element
// Similarly iterate the array for next passes.

如果您有任何错误或某些不明之处,请通知我。祝你的代码好运。

答案 1 :(得分:0)

这会产生正确的答案。 它是最有效的吗?我发布了我的计时结果。绝对是指数级增长

<头>
计数 平均时间
10 1.931190E-05
100 4.734993E-04
1000 2.540604E-02
10000 1.400114E+00
100000 9.096992E+01
#!python3
from time import time


def natural_join( S, T):
    theJoin = []
    for i in T:
        for j in S:
            if i[0] == j[1]:
                theJoin.append((i[1], j[0], j[1]))
                break
        
    return theJoin


for n in range(1, 6):
    A = []
    B = []
    for i in range(10 ** n):
        A.append(('x' + str(i), 'y' + str(i)))

    for i in range(10 ** n):
        B.append(('y' + str(i), 'z' + str(i)))

    start = time()
    joined = natural_join(A ,B)
    end = time()
    print('{:d}, {:E}'.format(10 ** n, (end-start)/n))