0

我正在尝试在数据库中实现与自然连接相同的想法,但在二维数组上,所以我想要做的是如果我有

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 并在两个数组中进行比较后,如何合并行?您能否给我一些有关如何创建joinedTableau 的提示,因为我不知道从联接开始的行数,如何动态创建它?

这是我的伪代码:

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];
                                        }
                                    }
                                }
                            }
4

2 回答 2

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.

如果有什么错误或不清楚的地方,请通知我。祝你的代码好运。

于 2015-04-25T18:22:30.897 回答
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))
于 2021-02-20T18:42:11.077 回答