我正在阅读RobertSedwick在C ++中的Algorithsm中的多列表数据结构。
如果多维矩阵是稀疏的,那么我们可能会使用多列表 而不是一个多维数组来表示它。我们可以使用一个 矩阵中每个值的节点和每个维度的一个链接, 链接指向该维度中的下一个项目。这个 安排减少了产品所需的存储空间 尺寸中的最大指数与数量成正比 非零条目但增加了许多算法所需的时间
请通过简单的示例请求您帮助理解上述陈述。
提前感谢您的时间和帮助。
答案 0 :(得分:3)
以下是一个示例实现:
class MultiList
{
public:
int value, x, y;
MultiList *next_x, *next_y;
void add( int xcor, int ycor, int val );
}
MultiList类具有指向同一行中下一个对象的指针,以及同一列中的下一个对象。对于二维MultiList,您需要以下虚拟节点:
root -> col0 -> col1
|
V
row0
|
V
row1
row0.next_x
指向null
,col0.next_y
指向null
等
要在(0, 1)
处插入值'3',请从root
开始,继续next_x
,直至到达1
列虚拟节点{{1} }}。然后从那个节点开始,继续看着它的孩子,直到
col1
或this->next_y == null
this->next_y.y > ycor
然后,将包含值的新节点插入该列表。您使用x中的相应行节点重复而不是y。
root -> col0 -> col1
| |
V V
row0 3
|
V
row1
分析:这个实现适用于真正稀疏的多维数组,考虑到你只需要为每个需要添加的节点分配内存,这意味着内存复杂度为O(n)。插入/删除是O(n),因为如果它们都在同一行或列中,您可能需要遍历每个现有节点。由于类似的原因,查找也是O(n)。