我正在閱讀RobertSedwick在C++算法中的多列表數據結構。多列表數據結構在C++中的應用
如果一個多維矩陣是稀疏的,那麼我們可能會使用多重表 而不是一個多維數組來代表它。我們可以爲矩陣中的每個值使用一個 節點,每個維度使用一個鏈接 ,鏈接指向該維度中的下一項。這 安排減少從dimenstions的 最大指數的乘積成比例的 非零條目數所需的存儲空間,但增加所需的很多算法
懇請您的幫助,上面的語句理解的時間以簡單的例子。
在此先感謝您的時間和幫助。
我正在閱讀RobertSedwick在C++算法中的多列表數據結構。多列表數據結構在C++中的應用
如果一個多維矩陣是稀疏的,那麼我們可能會使用多重表 而不是一個多維數組來代表它。我們可以爲矩陣中的每個值使用一個 節點,每個維度使用一個鏈接 ,鏈接指向該維度中的下一項。這 安排減少從dimenstions的 最大指數的乘積成比例的 非零條目數所需的存儲空間,但增加所需的很多算法
懇請您的幫助,上面的語句理解的時間以簡單的例子。
在此先感謝您的時間和幫助。
下面是一個示例實現:
class MultiList
{
public:
int value, x, y;
MultiList *next_x, *next_y;
void add(int xcor, int ycor, int val);
}
的多重表類有指向同一行中的下一個對象,並且在同一列中的下一個對象。對於2維多重表,你會需要以下虛擬節點:
root -> col0 -> col1
|
V
row0
|
V
row1
隨着row0.next_x
指向null
,col0.next_y
指着null
等
要插入值「3」在(0, 1)
,你開始在root
,並繼續前進next_x
,直到您到達1
列虛擬節點col1
。然後,開始在這個節點上,守望着它的孩子,直到
this->next_y == null
或this->next_y.y > ycor
root -> col0 -> col1
| |
V V
row0 3
|
V
row1
然後插入你的價值觀的新節點進入該名單。用x代替y來重複相應的行節點。
root -> col0 -> col1
| |
V V
row0 -> 3
|
V
row1
分析:此實現有利於真正稀疏多維數組,考慮到你只分配每個你需要添加,這意味着存儲複雜節點內存爲O(n)。插入/刪除是O(n),因爲如果它們都在同一行或列中,您可能必須遍歷每個現有節點。由於類似的原因,查找也是O(n)。
不會訪問'O(n^2)',因爲你可能會遍歷'n'虛擬節點,然後'n'真正的節點到達'(n,n)'? – 2013-03-23 01:36:18
我認爲它只是說你可以實現它作爲一個「鋸齒狀數組」,其中你有一個列表包含矩陣的每一行,每一行都是一個列表。這樣做的缺點是,您必須通過遍歷相關列表來尋找(x,y),而不是立即訪問。 – 2012-08-03 13:05:12