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

Memory 我们为什么使用数据结构?(不需要动态分配时),memory,data-structures,Memory,Data Structures,我很确定这是一个愚蠢的新手问题,但我不知道,所以我不得不问 为什么我们要使用数据结构,如链表、二叉搜索树等?(不需要动态分配时) 我的意思是:如果我们为一个对象保留一个变量,不是会更快吗?这不会加快访问时间吗?BST可能必须先运行一些指针,然后才能获得实际数据 除了需要动态分配外,是否有理由使用它们 例如:在可以使用简单(非动态)数组的情况下使用链表/BST/std::vector。在我看来,数据结构的主要好处是可以对它们进行相关分组。例如,您可以使用一个数据结构将它们全部分组,而不是使用10个

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

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

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

除了需要动态分配外,是否有理由使用它们


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

在我看来,数据结构的主要好处是可以对它们进行相关分组。例如,您可以使用一个数据结构将它们全部分组,而不是使用10个单独的class
MyClass
变量。此分组允许执行某些操作,因为它们是结构化的

更不用说,拥有数据结构可能会强制执行类型安全性,这在许多情况下是非常强大和必要的

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

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 myStringList=new List(){“string1”、“string2”、“string3”、“string4”、“string5”};
foreach(myStringList中的字符串s)
控制台。写入线(s);

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

使用数据结构(从简单数组到更复杂的树、哈希表或自定义数据结构)可以使代码更具组织性和可扩展性。使用数组(可以创建数组以容纳所需数量的元素,也可以在首次创建数组后扩展数组以容纳更多元素)可以避免每次数据项数量发生变化时都必须重写代码。使用适当的数据结构,您可以根据数据元素之间的关系而不是某些固定的顺序来设计算法,从而提供更大的灵活性

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


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

对不起,您并没有找到一种新的工作方式;)这种方法存在几个巨大的问题

如果不要求程序员在允许的项目数量发生变化时立即大量(非平凡地)重写成吨的代码,如何做到这一点?即使在编译时必须固定数据结构大小(例如C中的数组),也可以使用常量。然后,更改单个常量并重新编译就足以更改该大小(如果编写代码时考虑到这一点)。按照你的方法,每次尺寸变化时,我们都必须键入数百行甚至数千行。更不用说,所有这些代码都非常难读、写、维护和验证。在这样的设置中,“更多的代码行=更多的bug空间”这一古老的真理被占用了多达11行

还有一个事实,这个数字几乎从来都不是一成不变的。即使它是一个编译时常量,仍然有可能发生更改。为微小的性能增益(如果存在的话)编写数百行代码几乎不值得。如果每次你想改变某件事时都要做同样数量的工作,那么这会重复三次。更不用说,一旦数据结构中存在任何远程动态组件,就根本不可能实现。也就是说,这几乎是不可能的

也要考虑数据结构的概念。如果使用一组硬编码变量,而不是对大小进行抽象,仍然可以得到一个数据结构。你只是让它隐式化,展开在它上面运行的算法,并把它的大小固定下来。从哲学上讲,你什么也没改变

但它肯定有性能优势吗?嗯,有可能,尽管它很小。但这并不能保证会出现。您可以在数据上节省一些空间,但代码大小会爆炸。正如每个人都知道的那样
List<string> myStringList = new List<string>() { "string1", "string2", "string3", "string4", "string5" };

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