我试图在数据库中实现自然加入的相同想法,但是在二维数组上,所以我想要做的就是如果我有
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];
}
}
}
}
答案 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))