为什么我们使用数据结构? (当不需要动态分配时)

时间:2011-11-26 18:19:06

标签: memory data-structures

我很确定这是一个愚蠢的新手问题,但我不知道,所以我不得不问......

为什么我们使用数据结构,如链接列表,二进制搜索树等? (当不需要动态分配时)

我的意思是:如果我们为单个对象保留一个变量,它会不会更快?这不会加快访问时间吗?例如:BST可能必须首先运行一些指针才能获得实际数据。

除了需要动态分配的时候,是否有理由使用它们?

例如:在可以使用简单(非动态)数组的情况下使用链表/ BST / std :: vector。

3 个答案:

答案 0 :(得分:5)

您存储的每件事都保存在自己的变量(或存储位置)中。数据结构将组织应用于您的数据。想象一下,如果你有10,000件事你试图跟踪。您可以将它们存储在10,000个单独的变量中。如果你这样做,那么你总是被限制在10,000种不同的东西上。如果你想要更多,你必须修改你的程序,并在每次想要增加数量时重新编译它。如果项目的顺序发生变化,您可能还必须修改代码以更改计算的完成方式,因为 new 是在中间引入的。

使用数据结构,从简单数组到更复杂的树,哈希表或自定义数据结构,可以使代码更加有条理和可扩展。使用一个数组,可以创建数组以保存所需数量的元素,也可以在第一次创建后扩展以容纳更多元素,这样每次数据项数量发生变化时都不必重写代码。使用适当的数据结构,您可以根据数据元素之间的关系而不是某些固定顺序设计算法,从而为您提供更大的灵活性。

一个简单的类比可能有助于理解。例如,您可以将所有重要文件放入单独的文件柜中来组织所有重要文件。如果你这样做,你必须记住(即硬编码)可以找到每个项目的文件柜,以便有效地使用它们。或者,您可以将每个存储在同一个文件柜中(如通用阵列)。这是更好的,因为它们都在一个地方,但仍然不是最佳的,因为你每次想要找到它时都必须搜索它们。更好的是按主题组织它们,将相同的主题放在同一个文件夹中(单独的数组,不同的结构)。这样,您可以查找正确主题的文件夹,然后找到您要查找的项目。根据您的需要,您可以使用不同的归档方法(数据结构/算法)来更好地组织您的信息以用于其预期用途。

我还会注意到次,这对于您正在使用的每个数据项使用单个变量是有意义的。通常,根据特定项目的使用,使用适当的方法将各个变量和更复杂的结构混合在一起。例如,您可以将整数集合的总和存储在变量中,而整数本身存储在数组中。在引入数据结构之前,程序需要非常简单。

答案 1 :(得分:4)

很抱歉,但你并没有找到一种很好的新方法;)这种方法有几个巨大的问题。

一旦允许的项目数量发生变化,如果不需要程序员大量(并且非常)重写大量代码,怎么办呢?即使您必须在编译时修复数据结构大小(例如C中的数组),也可以使用常量。然后,更改单个常量并重新编译就足以更改该大小(如果编写代码时考虑到这一点)。使用您的方法,每次更改某些尺寸时,我们必须输入数百甚至数千行。更不用说所有这些代码都难以置信难以阅读,编写,维护和验证。在这种情况下,旧的真理“更多的代码行=更多的错误空间”被占用到11个。

然后事实上,这个数字几乎从未陷入困境。即使它是编译时常量,仍然可能发生变化。为未成年人编写数百行代码(如果存在的话),性能提升几乎不值得。如果您每次想要更改某些内容时都需要再次执行相同的工作量,则需要三次。更不用说一旦数据结构的大小中存在任何远程动态组件,就不可能 。也就是说,这种情况很少发生。

还要考虑implicitsuccinct数据结构的概念。如果您使用一组硬编码变量而不是抽象大小,您仍然有一个数据结构。你只是把它隐含起来,展开了对其进行操作的算法,并将其大小设置为一成不变的。从哲学上讲,你什么都没改变。

但它肯定有性能优势吗?嗯,可能,虽然它会很小。但不能保证在那里。您将在数据上节省一些空间,但代码大小会爆炸。并且每个通知内联的人都应该知道,小代码大小对于性能非常有用,以允许代码在缓存中。此外,参数传递会导致过度复制,除非你想出一个从几个指针派生大多数变量的位置的技巧。毋庸置疑,这将是不可移植的,即使在单个平台上也是非常棘手的,并且可能因代码或编译器调用的任何更改而被破坏。

最后,请注意,有时会执行较弱的表单 。关于隐式和简洁数据结构的维基百科页面有一些例子。在较小规模上,一些数据结构在一个地方存储了大量数据,使得可以用较少的指针追踪来访问它并且更可能在缓存中(例如,缓存感知和缓存不经意的数据结构)。对于所有代码中的99%而言,这是不可行的,并且将其带到极端只会增加一小部分(如果有的话)。

答案 2 :(得分:1)

在我看来,对数据结构的主要好处是,您可以对它们进行关联分组。例如,您可以拥有一个将所有变量分组的数据结构,而不是具有类MyClass的10个单独变量。此分组允许执行某些操作,因为它们是一起构造的。

更不用说,拥有数据结构可能会强制实施类型安全性,这在许多情况下是强大且必要的。

最后但并非最不重要的是,你宁愿做什么?

string string1 = "string1";
string string2 = "string2";
string string3 = "string3";
string string4 = "string4";
string string5 = "string5";

Console.WriteLine(string1);
Console.WriteLine(string2);
Console.WriteLine(string3);
Console.WriteLine(string4);
Console.WriteLine(string5);

或者...

List<string> myStringList = new List<string>() { "string1", "string2", "string3", "string4", "string5" };

foreach (string s in myStringList)
    Console.WriteLine(s);