Language agnostic 数据结构也是如此;算法课程到底真的有用吗?

Language agnostic 数据结构也是如此;算法课程到底真的有用吗?,language-agnostic,Language Agnostic,我记得当我在DSA的时候,我就像wtf O(n)一样,想知道除了在研究生院或者如果你不是布洛赫那样的博士,我会在哪里使用它。不知何故,it的使用的确会在业务分析中突然出现,所以我想知道你们什么时候需要调用自己的大O技能来了解如何编写算法,使用哪种数据结构来适应,或者是否必须实际创建新的ds(比如您自己的splay tree或trie实现)在《旅行推销员》的实施中,网络是我所使用的全部。理解数据结构是我所从事的许多项目的基础,这超出了在面试中被问到这样一个问题时的十分钟歌舞 尽管拥有各种收集类的现

我记得当我在DSA的时候,我就像wtf O(n)一样,想知道除了在研究生院或者如果你不是布洛赫那样的博士,我会在哪里使用它。不知何故,it的使用的确会在业务分析中突然出现,所以我想知道你们什么时候需要调用自己的大O技能来了解如何编写算法,使用哪种数据结构来适应,或者是否必须实际创建新的ds(比如您自己的splay tree或trie实现)

在《旅行推销员》的实施中,网络是我所使用的全部。

理解数据结构是我所从事的许多项目的基础,这超出了在面试中被问到这样一个问题时的十分钟歌舞


尽管拥有各种收集类的现代环境可以轻松地存储和访问大量数据,但了解使用特定数据结构最好地解决特定问题可以节省大量时间。我所说的“省时”是指“工作和不工作的区别”。

当然(尽管我是一个卑微的EE硕士——没有博士学位,没有CS,与我的同事Joshua Block不同),我写了很多需要高度可伸缩的东西(或者可能需要在高度可伸缩的应用程序中重用的组件),因此,在我的设计中,大O的考虑因素总是在起作用(并且考虑它们并不困难)。我使用的数据结构几乎总是来自Python的简单但丰富的供应(我曾帮助开发;-),很少是完全定制的(而不是构建在列表、dict等之上);但当它真的发生时(例如,我的开源项目gmpy中的位向量),没什么大不了的。

当我在算法类中了解到B树时,我就能够正确地使用它们(那是大约15年前,那时可用的开源实现少得多)。甚至后来,关于e。G容器类派上了用场……

老实说,能够回答这些问题是我在面试中认真对待受访者的最大标准。了解基本数据结构是如何工作的、基本的O(n)分析和一些轻理论对于成功编写大型应用程序非常关键

这在面试中很重要,因为它在工作中很重要。我过去曾与自学成才的技术人员一起工作,他们没有参加数据结构课程或阅读数据结构书籍,他们的代码偶尔会以他们应该看到的方式出现问题

如果您不知道n2的运行速度比n logN慢,那么您需要了解更多


就数据结构课程的后半部分而言,它通常不适用于大多数技术工作,但如果你最终需要它,你会希望你能多加注意。

Big-O表示法是描述特定库实现的算法时使用的基本表示法之一。例如,我所看到的所有关于STL的文档都用big-O来描述各种操作,因此自然地,您必须理解O(1)、O(logn)和O(n)之间的区别,以理解您选择STL容器和算法的含义。MSDN也为.NET类这样做,IIRC Java文档为标准Java类这样做。因此,我要说的是,了解符号在很大程度上是理解大多数流行框架文档的一个必要条件。

大约十年前,当我需要实现一个可定制的事件驱动系统时,我发现我的数据结构知识非常有用。这是个大问题,但我经常以较少的方式使用这类知识

对我来说,知道确切的算法是。。。背景知识不错。然而,最有用的是更一般的背景,即必须注意算法的不同部分是如何相互作用的。例如,在代码中的某些地方,移动一段代码(即循环外)可以在时间和空间上产生巨大的差异


与其说是课程教授的具体知识,不如说是几年的经验。这门课程花了很多年的时间,在纯粹的“真实世界经验”中,你可能会遇到(已经深入到)所有的变化,并将其浓缩

绝对正确:尽管堆栈、队列等非常简单,但以一种严格的方式介绍给他们会有所帮助

B-Tree和更高级的排序有点困难,所以尽早学习它们是一个很大的好处,我确实不得不在不同的地方实现它们

最后,几年前,我为单连接组件创建了一个算法,该算法明显优于我们的信号处理团队使用的算法,但我无法说服他们该算法更好,直到我能够证明它是O(n)复杂度,而不是O(nlogn)

…仅举几个例子


当然,如果你满足于继续做一个CRUD系统黑客,除了收取工资外,没有真正的愿望做更多的事情,那么可能没有必要……

你问题的标题询问数据结构和算法,但你问题的主体集中在复杂性分析上,因此我也将重点关注这一点:

在很多编程工作中,能够进行复杂性分析至少偶尔是有用的。请参阅以获取这些示例

我可以想到在我的职业生涯中,我或同事发现了一段代码,其中(通常是时间,有时是空间)的复杂度比它本应该的要高。当它可以是线性或nlog(n)时,它是二次或三次的。这样的代码在给定小的输入时可以很好地工作,但在较大的输入上会很快被删除