您是否在业务编程中使用链接列表,双向链表等?

时间:2009-06-22 14:25:45

标签: data-structures linked-list

像链接列表这样的数据结构是纯粹用于实际编程的学术内容还是您真正使用它们?它们是泛型所涵盖的东西,因此您不需要构建它们(假设您的语言具有泛型)?我不是在讨论理解它们是什么的重要性,只是在学术界之外使用它们。我从前端Web请求后端数据库透视图。我确定有人在某处建造这些。我是从我的背景中问。

谢谢。

编辑:泛型是否因此您不必构建链接列表等?

12 个答案:

答案 0 :(得分:4)

这取决于您使用的语言和框架。大多数现代语言和框架都不会让你重新发明这些轮子。相反,他们会提供List<T>或HashTable等内容。

修改

我们可能一直使用链表,但没有意识到。我们不必自己编写链表的实现,因为我们使用的框架已经为我们编写了它们。

您可能也对“仿制药”感到困惑。您可能指的是List<T>等通用列表类。这与非泛型类List相同,但元素始终为T类型。它可能是作为链表实现的,但我们不必关心它。

我们也不必担心物理内存的分配,或中断的工作方式,或者如何创建文件系统。我们有操作系统为我们这样做。但我们可能会被教导学校的信息也一样。

答案 1 :(得分:3)

当然可以。现代语言中的许多“List”实现实际上是链表,有时与数组或哈希表结合使用以进行直接访问(通过索引而不是迭代)。

链接列表(尤其是双向链表)在“真实世界”的数据结构中非常常用。

我敢说每种通用语言都有预先构建的链表实现,无论是作为语言原语,本机模板库(例如C ++),本机库(例如Java)还是某些第三方实现(可能是开放式)资源)。

话虽如此,过去我曾多次在为复杂数据结构创建基础架构代码时从头开始编写链表实现。有时完全控制实现是个好主意,有时您需要为经典实现添加“扭曲”以满足您的特定需求。只要您了解替代方案和权衡取舍,就是否编写自己的实施方案没有对错。在大多数情况下,当然在像C#这样的非常现代的语言中我会避免它。

另一点是你应该使用列表与数组/向量或哈希表。从你的问题我知道你知道这里的权衡,所以我不会过多介绍它,但基本上,如果你的主要用法是按顺序遍历列表,并且列表大小可能有很大差异,列表可能会是一个可行的选择。另一个考虑因素是插入类型。如果一个常见的用例是“插入中间”,那么列表比数组/向量具有明显的优势。我可以继续,但这些信息在经典的CS书中:)

澄清:我的答案与语言无关,并且与Generics没有特别的关系,据我所知,它具有链表实现。

答案 2 :(得分:2)

单链接列表是拥有内存高效不可变列表的唯一方法,可以将其组合为“变异”它。看看Erlang是如何做到的。它可能比数组支持的列表稍慢,但它在多线程和纯函数实现中具有非常有用的属性。

答案 3 :(得分:1)

是的,有真实世界的应用程序使用链表,我有时必须维护一个巨大的应用程序,使得链接列表的使用。

是的,链接列表几乎包含在从C ++ / STL到.net的任何类库中。

我希望它改为使用数组。

在现实世界中链接列表是缓慢的,因为分页和CPU缓存大小之类的东西(链表往往会传播你的数据,这使你更有可能需要访问来自不同内存区域的数据,这很多今天的计算机比使用一个序列存储所有数据的数组慢。

Google“参考地点”了解更多信息。

答案 4 :(得分:1)

除了大学的家庭作业外,从未使用手工制作的列表。

答案 5 :(得分:1)

根据使用情况,链表可能是最佳选择。使用链表而不是数组列表,从列表前面删除的速度要快得多。

在我保持性能分析的Java程序中,我可以通过从ArrayList移动​​到LinkedList来提高性能,以便在开头有大量删除的List。

答案 6 :(得分:0)

我多年来一直在开发业务线应用程序(.NET),我只能想到我使用链表的一个实例,即便如此我也不必创建对象。

这是我的经历。

答案 7 :(得分:0)

我想说这取决于用法,在某些情况下,它们比典型的随机访问容器更快。

另外我认为它们被一些库用作底层集合类型,所以看起来像非链接列表可能实际上是下面的一个。

答案 8 :(得分:0)

在我上一家公司开发的C / C ++应用程序中,我们一直使用双向链表。它们对我们正在做的事情至关重要,即实时3D图形。

答案 9 :(得分:0)

是的,各种数据结构在日常软件开发中非常有用。在我所知的大多数语言中(C / C ++ / Python / Objective-C),都有实现这些数据结构的框架,因此您不必重新发明轮子。

是的,数据结构不仅适用于学术界,它们非常有用,如果没有它们,你将无法编写软件(取决于你的工作)。

您在消息队列,数据映射,哈希表中使用数据结构,保持数据排序,快速访问/删除/插入等等取决于需要做什么。

答案 10 :(得分:0)

是的,我知道。这一切都取决于具体情况。如果我不会在其中存储大量数据,或者特定应用程序需要FIFO结构,我会毫不犹豫地使用它们,因为它们很快就可以实现。

然而,在我所知道的其他开发人员的应用程序中,有时链接列表完全适合,除了糟糕的局部性导致大量缓存未命中。

答案 11 :(得分:0)

我无法想象许多不涉及列表的程序。 你需要处理超过1件事的那一刻,需要所有形式和形状的列表,因为你需要在某处存储这些东西。该列表可能是一个单/双链表,一个数组,一个集,一个哈希表,如果你需要根据一个键索引你的东西,一个优先级队列,如果你需要对它进行排序等。

通常,您将这些列表存储在数据库系统中,但是您需要从数据库系统中获取它们,将它们存储在应用程序中并对其进行操作,即使检索一小部分内容列表也很简单。一个下拉式组合框。

现在,在诸如C#,Python,Java等语言中,您通常不需要实现自己的列表。这些语言带有大量可以存储内容的容器抽象。可以通过标准库或内置到语言中。

您仍然可以学习这些主题,例如:如果您正在使用C#,您想知道ArrayList是如何工作的,并且根据您需要添加/插入/搜索/随机索引这样的列表来选择ArrayList或其他东西。