哪种数据结构最适合交换操作?

时间:2012-09-19 13:10:42

标签: arrays data-structures

哪种数据结构最适合存储应经常交换的元素?链接列表和数组都被命名为此类操作的最爱,但我对这个推理感到疑惑......

1 个答案:

答案 0 :(得分:2)

我认为正确的答案是'好吧,这取决于,但通常是阵列(Vector)是要走的路;如果我们谈论链接列表,它至少应该是一个双重链表。

我们假设我们有一些Singly Linked List

...->$el1->$el2->$el3->$el4->$el5...

...我们引用了$ el2和$ el4元素(应该交换)。从技术上讲,我们需要做的是......

1) assign the address of `$el4` (or `$el3->next`) to the `$el1->next` pointer
2) assign the address of `$el2` (or cached `$el1->next`) to the `$el3->next` pointer
3) assign the value of `$el4->next` to the `$el2->next` pointer
4) assign the value of `$el2->next` to the (previously cached) `$el4->next` pointer

......就是这样,基本上是0(1)效率。简单,嗯?

这里的问题是,没有简单的方法(= 0(1))来获取'之前'元素($el1$el3)。 $el4$el2仅存储nexts(分别为$el5$el3)的地址。

当然,您可以使用Doubly Linked List代替:

...$el1<->$el2<->$el3<->$el4<->$el5...

在这里引用prev元素就像next元素一样简单,所以我们需要......

1-2) swap values of `$el2->prev->next` and `$el4->prev->next`,
3-4) swap values of `$el4->next`       and `$el2->next`

但等等,还有更多!我们现在还必须更新prev指针:

5-6) swap values of `$el4->prev`       and `$el2->prev`

正如您可能已经看到的那样,这里有3个'价值互换'操作。

使用向量,它是单个交换:

[$el1][$el2][$el3][$el4][$el5]

1) assign data-value of $el2 to some temp variable;
2) assign data-value of $el4 to $el2;
3) assign data-value of this temp variable to $el4;

当然,从理论上讲,这可能比以前的方法要慢(如果这个'数据值'太大,以至于复制它比将指针复制三次需要更多的时间)。但在实践中,它指向存储在数组和链表中的大量数据。