19,468
社区成员
发帖
与我相关
我的任务
分享
var s = [4B][1H],i = 0,t = 1,x = 0,c = 1H,r = 4B,j = [c],k = [c];
function g(d) {
for(i = 0; i < c; i++) {
j[i] = t / d;
}
i = 0;
}
function f() {
for(x = 0; x < c; x++) {
for(i = 0 i < r; i++) {
k[x] += j[x] * s[r][x];
}
}
x = 0;
return k;
}
g(1K);f();
K = 65536;//可以酌情增减
//这里用for示意一下,其实可能需要磁盘吞吐,因为内存装不下。
for (uinsigned long long i = 0; i < 400000000;++i)
for (unsigned int j = 0; j<100;++j)
N[i][j] = int (x[i][j] / K);
这样的效果,使得坐标成为了以K一个格子的离散坐标。
-192373.384, 2827, 0.28374, 7932736.28374... 383742
->
-3 0 0 121,....,5
2、建立维度索引
维度索引共100组,每个维度1组。每组4亿行,按照本组的坐标值、实际数据行号存储。
比如,第58维度索引如下:
……
val, rowidx
-2, 38374
-1, 292739047
-1 ,2837439
0, 943847274
1, 283
……
也可以用树形结构存储,或者直接进入数据库。
计算:
计算离散坐标的欧式距离,转化为整形坐标的差异。前提是K取得足够大,使得无论定义域内给定一个值,在以2K+1为边长的超立方体内,都有超过1个的向量存在。
假设数据为
38419,-28384,...2834999
1、从第一组索引表中,select 出所有与本维度整数坐标距离小于2的行号
select rowidx from tb_idx1 where val >= 38418 and val <=38420;
2、从第二组索引表中,select 出所有与本维度整数坐标距离小于2的行号
select rowidx from tb_idx2 where val >= -28385 and val <=-28383 and
rowidx in (填写1的结果)
;
3、以此类推,直到100维度为止。
这时,剩下的行号应该不多了,再去直接用浮点计算。