我有一个稀疏矩阵类,其非零和相应的列索引按行顺序存储在基本上类似于 STL 向量的容器中。它们可能具有未使用的容量,例如向量;要插入/删除元素,必须移动现有元素。
假设我有一个手术insert_erase_replace
,或ier
简称。ier
在给定位置p
、列索引j
和值的情况下,可以执行以下操作v
:
- 如果
v==0
,则ier
删除 at 的条目p
并左移所有后续条目。 - 如果
v!=0
并且j
已经存在于p
,ier
则将 处的单元格内容替换p
为v
。 - 如果
v!=0
并且j
不存在于 处p
,则在右移所有后续条目之后ier
插入条目v
和列索引。j
p
所以这一切都是微不足道的。
现在假设我有ier2
,它做同样的事情,除了它需要一个包含多个列索引j
和相应值的列表v
。它还有一个 size n
,它指示列表中存在多少索引/值对。但由于向量只存储非零,有时实际插入大小小于n
.
还是微不足道的。
但是现在假设我有ier3
,它不仅需要一个类似的列表ier2
,而且还需要多个列表。这表示编辑稀疏矩阵的一部分。
在某些时候,遍历向量、逐个复制它们并ier2
在到达每个插入点时插入/替换/擦除列表索引/值样式会变得更有效。如果总插入大小会导致我的向量无论如何都需要调整大小,那么我们就这样做。
鉴于我的向量比列表的总长度大得多,是否有一种算法可以有效地将列表合并到向量中?
到目前为止,这就是我所拥有的:
传递给的每个列表
ier3
代表条目的净删除(左移)、净替换(不移动,因此便宜)或条目的净插入(右移)。那里可能还会对元素进行一些重新排列,但代价高昂的部分是净删除和净插入。找出一种算法来有效地只进行净插入或净删除并不难。
当两者中的任何一个可能发生时,情况就会变得更加困难。
我唯一能想到的就是分两遍处理它:
- 擦除/替换
- 插入/替换
我们首先擦除,因为它更有可能任何插入都需要更少的副本。
这是正确的方法吗?有谁知道更好的吗?