双向链表有哪些比较实用的应用场景?

2018-03-20 07:33:01 +08:00
 miniyao
平时用到双向链表的机会少,有哪些场景下使用双向链表是比较好的选择?
9539 次点击
所在节点    Python
67 条回复
KIDJourney
2018-03-20 20:40:38 +08:00
@BlockBlockBlock
不是很懂,不管你链表装什么,随机读取都不是 O(1)的。
Wicked
2018-03-20 21:08:36 +08:00
常数时间删除元素,保序遍历,需要这些特性的场合都可以用
bobuick
2018-03-20 21:58:57 +08:00
一大堆用处。
如果只写 web, 只写 CRUD 基本用不到
akira
2018-03-20 22:52:46 +08:00
链表的最大作用。。
是为了让人可以继续学习后续的树形结构。。
hszzz
2018-03-20 23:15:40 +08:00
@BlockBlockBlock STL 里的 vector,有一个 capacity 和 size 的。capacity 总是大于等于 size 的,用完了就会自动重新申请,一般是 size 的两倍。
hszzz
2018-03-20 23:16:54 +08:00
@BlockBlockBlock 防止频繁地申请和释放内存。
lzjamao
2018-03-21 00:19:44 +08:00
换个思维。
双向链表有什么优势和劣势。
技术符合需求,不是需求符合技术
bravecarrot
2018-03-21 01:51:23 +08:00
@BlockBlockBlock 随机存取的时候 岂不是太慢了..
BlockBlockBlock
2018-03-21 08:23:10 +08:00
@bravecarrot
@hszzz
@KIDJourney
@bumz
@snail1988
@jmc891205
@glasslion
@jmc891205

翻倍翻倍翻倍……你们既然都知道翻倍了,两个问题先自己去想清楚了再过了。我发现我们很难交流……

1. 既然空间翻倍了,那翻倍的空间从哪里来? a) 把内存条从数组的尾端掰断然后再加一段吗?这怕不是要实现边长数组,这是要实现变长内存条,还是能从中间拉长的那种。b) 开一片新内存然后把旧的全部复制过去?嗯,小数组还好,大数组真是酸爽……

2.既然你们都知道翻倍了,那翻倍隐含的 log2(N) 被怪物吃了吗?想想这个 log2(N) 去哪里了……

只会喊些什么,翻倍,O(1)。翻倍怎么翻? O(1) 怎么来的?想过吗?
NUT
2018-03-21 08:49:35 +08:00
JAVA 相关的
Queue
Stack
LinkedList
LinkedHashMap
HashMap
Guava 的 FutureTask (单向列表)
RocketMQ 的 index (单向列表)
neoblackcap
2018-03-21 09:30:43 +08:00
@BlockBlockBlock 复制就是这样,当然可以使用 move,而且你的翻倍隐含的 O(logN)时间复杂度跟随机读取的 O(1)根本不冲突
BlockBlockBlock
2018-03-21 09:34:22 +08:00
@neoblackcap

看不懂就算了……不多做解释了
neoblackcap
2018-03-21 10:25:19 +08:00
@BlockBlockBlock allocator 对于可变长数组不是必要,内存分配是 allocator 的事情。我是没看到 CPython 里面的 List 是有 LinkedList 的实现,C++的 vector 也不是。你说有请拿事实说话。
KIDJourney
2018-03-21 10:47:44 +08:00
@hitmanx 我看了下实现,这样搞就不是双向队列了啊。
jmc891205
2018-03-21 10:51:50 +08:00
@BlockBlockBlock
翻倍的复制操作不影响变长数组插入操作的平均时间复杂度是 O(1)。这叫 amortized analysis。大多数教科书对此问题都有讨论。你可以自行查找。
jmc891205
2018-03-21 10:57:44 +08:00
@BlockBlockBlock 如果你手边没有任何算法与数据结构的教科书 你可以参考 Wikipedia 上的 Dynamic array 词条: https://en.wikipedia.org/wiki/Dynamic_array
lauix
2018-03-21 11:01:00 +08:00
java 里的 list map 有个神马对象 就是
jmc891205
2018-03-21 11:02:47 +08:00
我在#55 楼里说的“插入操作”不严谨 我指的是 push_back 操作 即在数组末尾插入元素
hitmanx
2018-03-21 11:50:00 +08:00
@jmc891205 对的,是 amortized O(1)
hszzz
2018-03-21 12:44:12 +08:00
@BlockBlockBlock 好的,谢谢你,有时间我去了解一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/439569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX