多列表数据结构在C ++中的应用

时间:2012-08-03 12:54:35

标签: c++ data-structures

我正在阅读RobertSedwick在C ++中的Algorithsm中的多列表数据结构。

  

如果多维矩阵是稀疏的,那么我们可能会使用多列表   而不是一个多维数组来表示它。我们可以使用一个   矩阵中每个值的节点和每个维度的一个链接,   链接指向该维度中的下一个项目。这个   安排减少了产品所需的存储空间   尺寸中的最大指数与数量成正比   非零条目但增加了许多算法所需的时间

请通过简单的示例请求您帮助理解上述陈述。

提前感谢您的时间和帮助。

1 个答案:

答案 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指向nullcol0.next_y指向null

要在(0, 1)处插入值'3',请从root开始,继续next_x,直至到达1列虚拟节点{{1} }}。然后从那个节点开始,继续看着它的孩子,直到

col1this->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)。