deque(简单介绍一下)

deque的基本情况:

简单的来说deque是一个双头队列。且两边的尺寸可以动态收缩或者扩张。

其底层实现相当复杂,而且效率并不高。大多数时候都不会使用。

deque诞生的原因是vector和list的优缺点不可分割。

正好复习一下vector和list的优缺点。

vector的优点:支持随机访问;尾插,尾删很方便;高速缓存命中率高。

vector的缺点:不支持头插或者中间插入;扩容具备一定的性能消耗,以及空间浪费。

list的优点:任意位置插入删除数据只需要O(1)复杂度;按需申请释放空间,没有损耗。

list的缺点:不支持随机访问,高速缓存命中率低。

对比两者的优缺点,发现他们的缺点正是为了他们的优点诞生的,两者不可分割。deque就是针对两者的缺点设计出来的,所以性能被牺牲了。

deque的底层大概是这样的结构:

如何满足随机访问?

要访问的下标,减去第一个数组具有的元素个数,然后/10,就能知道在第几个空间了。%10就能知道在第几个位置。

deque的优点:

1.头插和尾插效率不错

2.支持随机访问

3.高速缓存命中率高

4.扩容代价小

deque的缺点

1.中部插入删除效率不行,(要么需要挪动数据,要么支持每个开辟的空间大小不一定相同,这样的话,中控数组还要记录每个空间有多少个元素,因为要支持随机访问)

2.虽然支持随机访问,但效率相对于vector而言还有差距。频繁随机访问时要小心。

以排序为例(测试在release下):

用deque存数据,进行排序,和vector存数据(和deque中的内容一样),进行排序。10000以内没什么区别,之后的每个数量级,deque花费的时间都是vector的2倍左右。

如果将deque的数据拷贝进vector,进行排序,排序完再将数据拷贝给deque(用assign拷贝回deque),和直接对vector中的数据排序所花费的时间,进行比较,deque花费的时间大概是vector的1.4倍左右。

所以deque适合在大量头尾存储删除数据的时候使用,比如stack和queue,栈和队列使用deque比使用vector/list更合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LinkedList是一种数据结构,它由一系列节点组成,每个节点都包含一个数据元素和一个指向下一个节点的指针。LinkedList可以用于实现各种数据结构,包括栈、队列和哈希表。 LinkedList的优点是可以动态地添加或删除节点,而无需移动其他节点。这使得LinkedList适用于需要频繁添加或删除元素的场景。另外,LinkedList还可以在不同的节点之间共享数据,这可以节省内存。 LinkedList有两种常见的实现方式:单向链表和双向链表。在单向链表中,每个节点只有一个指向下一个节点的指针;而在双向链表中,每个节点除了一个指向下一个节点的指针外,还有一个指向前一个节点的指针。因此,双向链表可以更容易地实现从前往后和从后往前的遍历。 以下是一个简单的Java代码示例,演示如何创建一个单向链表并添加节点: ```java public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> list = new LinkedList<String>(); // 添加节点 list.add("apple"); list.add("banana"); list.add("orange"); // 遍历节点 for (String fruit : list) { System.out.println(fruit); } } } ``` 在这个例子中,我们首先创建了一个空的LinkedList,然后使用add()方法添加了三个节点。最后,我们使用for-each循环遍历了所有节点并打印出它们的值。 ### 回答2: LinkedList(链表)是一种常见的数据结构,用于存储一系列元素。它由一个个节点组成,每个节点包含一个值和一个指向下一个节点的指针。 和数组不同,链表中的元素在内存中不是连续存储的。每个节点都包含一个指针,该指针指向下一个节点的位置。这种指针的存在使得链表在插入和删除元素方面更加灵活,而且不需要像数组那样频繁地进行内存调整。然而,链表在查找特定元素时效率较低,因为需要从头节点开始一直遍历到目标节点。 链表有多种类型,其中最常见的是单向链表和双向链表。在单向链表中,每个节点只包含一个指向下一个节点的指针,而在双向链表中,每个节点还包含一个指向前一个节点的指针。 LinkedList类是Java中提供的链表实现。它提供了一系列方法,如添加元素、删除元素、获取元素等。LinkedList还实现了List和Deque接口,因此可以用作列表和队列的数据结构。 使用LinkedList时需要注意的是,由于链表中的元素不是连续存储的,因此无法像数组那样通过索引直接访问元素。要访问特定位置的元素,需要从头开始遍历链表直到目标位置。此外,由于每个节点都包含指针,因此在删除节点时需要更新对应节点的指针,否则可能会出现内存泄漏。 总结来说,LinkedList是一种常用的链表数据结构,具有插入和删除元素灵活的优点,但查找元素的效率相对较低。在Java中,可以使用LinkedList类来实现链表操作。 ### 回答3: LinkedList(链表)是一种常见的数据结构,它由一系列节点组成,每个节点都包含一个元素和一个指向下一个节点的引用。与数组不同,链表中的节点在内存中不是连续存储的。 LinkedList最常见的类型是单向链表,每个节点中只包含一个指向下一个节点的引用。还有双向链表,每个节点中同时包含一个指向下一个节点和上一个节点的引用。 LinkedList的优点是在插入和删除元素时具有高效的性能。插入新节点只需要调整相应节点的引用指针,不需要进行整个链表的移动和复制。删除节点也只需要改变相邻节点的引用指针即可,无需移动其他节点。 然而,LinkedList的缺点是访问特定位置的元素比较慢。由于节点没有在内存中连续存储,要访问某个位置的元素需要从头节点开始遍历直到找到目标节点。 LinkedList在实际应用中有着广泛的应用,尤其是在需要频繁地插入和删除元素的场景中。例如,在实现队列、堆栈和图等数据结构时,LinkedList常常是首选。 总的来说,LinkedList是一种常见的数据结构,它以节点的方式存储数据,可以高效地插入和删除元素。然而,由于节点不是连续存储的,访问特定位置的元素相对较慢。在实际应用中,LinkedList在需要频繁插入和删除元素的情况下具有广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值