我有一个(nxd)数据集(D),其中n =行数,d =维数,我通过比较数据集的每一行(D)创建一个相似矩阵(S)(nxn)然后将其转换为稀疏矩阵(tx3),其中t是对称相似矩阵(S)的非零元素的数量
创建相似性矩阵的时间复杂度为o(n ^ 2d),其中d是一些常数运算。 转换稀疏矩阵的时间复杂度是theta(n ^ 2)
我的问题是: 如果我执行检查"如果相似度值为"零"然后继续(继续)将其放入稀疏矩阵"。假设我可以说从数据集(D)计算稀疏矩阵的成本是O(n ^ 2 d)。
例如:
创建相似度矩阵:
for i in range(0,n):
for j in range(0,n):
find similarity_value of D[i] and D[j]
insert into similarity_matrix: S[i,j]= similarity_value
The above runs in O(n^2 d)
n^2 for the loops
d for finding the similarity between D[i] and D[j]
稀疏矩阵创建形式Simiarity矩阵
for i in range(0,n):
for j in range(0,n):
if S[i,j]==0:
continue
else
insert into sparse_matrix [i, j, S[i,j]]
The above runs in O(n^2)
n^2 for the loops
如果一个接一个地进行操作,则需要O(n ^ 2 d)+ O(n ^ 2)。
由于我们只需要sparse_matrix,我们直接创建稀疏矩阵而不创建相似度矩阵。
直接创建稀疏矩阵而不创建相似度矩阵:
for i in range(0,n):
for j in range(0,n):
find similarity_val of D[i] and D[j]
if similarity_val==0:
continue
else
insert into sparse_matrix [i,j,similarity_val]
我的问题是:
Wouldn't the above run in only O(n^2 d), since I am directly inserting into sparse matrix
n^2 for the two loops
d for finding the similarity_val of D[i] and D[j]
如果我遗失了某些内容或者我对某些事情的理解是错误的,请告诉我。
答案 0 :(得分:1)
对于每个(i,j)对(总共有n ^ 2),您到达循环的内部部分,在那里找到相似性,然后有条件地将元素添加到稀疏矩阵。找到相似性需要“d”操作(因为你需要循环遍历每个维度)并有条件地添加一个元素需要一定数量的操作(在值为0的情况下进行1次比较操作,1次比较操作加1在值为非零的情况下的插入操作)。由于每次到达此双循环内部时都需要执行“d”加上一定数量的运算,因此总共执行O(n ^ 2 d)运算。
请注意,如果将内部循环限制为不小于i的j值(也就是用for j in range(0, n)
替换for j in range(i, n)
),则此渐近操作计数不会更改。这是因为你将到达循环内部n *(n + 1)/ 2次并执行“d”加上恒定数量的操作,这仍然是O(n ^ 2 d)总计算。