哪种数据结构最适合存储应经常交换的元素?链接列表和数组都被命名为此类操作的最爱,但我对这个推理感到疑惑......
答案 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;
当然,从理论上讲,这可能比以前的方法要慢(如果这个'数据值'太大,以至于复制它比将指针复制三次需要更多的时间)。但在实践中,它指向存储在数组和链表中的大量数据。