Tag: 链接列表

什么是一个有效的algorithm来找出一个单链表是否是循环的/循环的?

我怎样才能find一个单链表是循环/循环的? 我试图search,但找不到一个令人满意的解决scheme。 如果可能的话,你能提供一个伪代码还是Java实现? 例如: 1 → 3 → 5 → 71 → 45 → 7 → 5 ,其中第二个5实际上是列表的第三个元素。

为什么caching区域对于arrays性能很重要?

在下面的博客中,有一个关于数组优于链表的说法: 数组有更好的caching局部性,可以使性能有很大的差异。 那是什么意思? 我不明白caching区域如何提供巨大的性能优势。

Haskell(GHC)是如何实现的?

我只是好奇Haskell中的一些确切的实现细节(GHC特定的答案是好的) – 他们是天真的链表,还是他们有任何特殊的优化? 进一步来说: 做length和(!!) (例如)必须遍历列表? 如果是这样,他们的值是以任何方式caching(即,如果我叫两次,它将不得不迭代两次)? 访问列表后面是否涉及遍历整个列表? 是无限的列表和列表理解memoized? (即,对于fib = 1:1:zipWith (+) fib (tail fib) ,每个值是recursion计算还是依赖于以前的计算值?) 任何其他有趣的实现细节将不胜感激。 提前致谢!

什么是链接列表的一个实际的,真实世界的例子?

我理解链接列表的定义,但是它又如何expression和与一个共同的概念或项目相关? 例如,OOP中的组合(EDIT:原来说的“inheritance”)可能与汽车有关。 现实生活中的所有(大多数)汽车都是基本相同的东西; 一辆汽车有一台发动机,你可以开始()它,你可以让汽车去(),停止()等等。 汽车通常具有最大的乘客容量,但在汽车和公共汽车之间会有所不同。 是否有一些现实生活,直觉的例子,就像我们inheritance的一样? 典型的教科书“链接列表”示例显示了一个带有整数和指向下一个的指针的节点,它看起来不是很有用。 您的意见是赞赏。

C ++中有效的链表

这个文件说std::list是低效率的: std :: list是一个非常低效的类,很less有用。 它为插入到其中的每个元素执行堆分配,因此具有非常高的常数因子,特别是对于小数据types。 评论:这是令我惊讶的。 std::list是一个双向链表,所以尽pipe在元素构造方面效率低下,它支持O(1)时间复杂度的插入/删除,但是在这个引用的段落中完全忽略了这个特性。 我的问题:假设我需要一个用于小尺寸齐次元素的顺序容器,并且这个容器应该支持O(1)复杂的元素插入/删除,并且不需要随机访问(虽然支持随机访问是好事,但这不是必须的这里)。 至less在元素个数很less的时候,我也不希望堆分配给每个元素的构造带来高的恒定因子。 最后,只有当相应的元素被删除时, 迭代器才会失效。 显然,我需要一个自定义容器类,它可能(或可能不)是双向链表的变体。 我应该如何devise这个容器? 如果上述规范不能实现,那么也许我应该有一个自定义的内存分配器,比如说,指针分配器? 我知道std::list将分配器作为其第二个模板参数。 编辑:我知道我不应该太关心这个问题,从工程的angular度来看 – 足够快就足够了。 这只是一个假设的问题,所以我没有更详细的用例。 随意放松一些要求! Edit2:我知道O (1)复杂性的两种algorithm由于其常数因素的不同而可能具有完全不同的性能。

为什么在链表中find循环的时候为什么不用3,4,5?

我已经看了一个关于在链表中find循环的algorithm的问题 。 我已经阅读了弗洛伊德的循环发现algorithm解决scheme,在很多地方提到我们必须采取两个指针。 一个指针(慢/龟)增加一个,其他指针(更快/更多)增加2.当它们相等时,我们find循环,如果更快的指针变为空,则链表中没有循环。 现在我的问题是为什么我们增加了更快的指针2.为什么不是别的? 增加2是必要的,或者我们可以通过增加X来得到结果。 如果我们用2递增更快的指针,或者可能出现需要增加3或5或x的情况,是否有必要find循环。

C结构inheritance指针alignment

背景 我已经创build了一个基本的链接列表数据结构主要用于学习目的。 列表的一个目标是可以处理不同的数据结构。 因此,我在结构组成方面尝试过我的手来模拟C中的“inheritance”。下面是构成我的链表的基础的结构。 typedef struct Link { struct Link* next; struct Link* prev; } Link; typedef Link List; 在我的实现中,我select了一个作为列表头部和尾部的标记节点(这就是为什么链接==列表)。 为了让列表实际处理数据,一个结构只包含Link结构作为第一个成员: typedef struct { Link link; float data; } Node; 所以链表就像这样 ┌───┬───┬───┐ ┌───┬───┐ ┌───┬───┬───┐ … <—>│ P │ N │ D │<—>│ P │ N │<—>│ P │ N │ D │<—> … └───┴───┴───┘ └───┴───┘ […]

创build一个非常简单的链接列表

我试图创build一个链表,只是为了看看我能不能,而且我很难find它。 有没有人有一个非常简单的实现使用C#的链接列表的例子? 到目前为止,我发现的所有例子都过分了。

采访:删除链接列表中的循环 – Java

我在采访中被问到这个问题:“如何检测链表中的循环?”,我解决了这个问题,但是面试官立即问我如何去除链表中的循环。 我失手了 那么如何解决这个问题的任何指针,可能是伪代码,还是方法定义? 我很熟悉Java,所以我在java下面标记了这个问题。 对于实例,这个链表有一个循环 0—>1—->2—->3—->4—->5—->6 ▲ | | ▼ 11<—-22<—-12<—-9<—-8

何时通过LinkedList或ArrayList使用HashMap,反之亦然

什么是我们不能总是使用HashMap的原因,尽pipe它比ArrayList或LinkedList在添加,删除操作方面效率更高,而且不pipe元素的数量如何。 我google了一下,发现了一些原因,但总是有一个使用HashMap的解决方法,其优点仍然存在。