计算稀疏矩阵的时间复杂度(2)

时间:2015-06-16 17:01:21

标签: r matlab matrix sparse-matrix

我有一个(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]

如果我遗失了某些内容或者我对某些事情的理解是错误的,请告诉我。

1 个答案:

答案 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)总计算。