数据结构的概念官方定义是什么:数据结构是一门研究非数值计算编程问题中的操作对象,以及它们与其他相关的关系和操作的学科问题。我的理解:程序设计=数据结构+算法数据结构,顾名思义,就是数据之间的结构关系,或者理解为一种或多种数据元素之间特定关系的集合。当然,这些概念都是大学喜欢考的。我们不需要执着于这个概念。我们只需要有自己合适的解释,别人也能接受。数据结构中结构的概念数据结构中的结构是我们研究的主要对象。在数据结构中,我们很少去研究数据,因为数据在内存中的表现形式对我们来说都是一样的,就是二进制。传统上,我们将数据结构分为逻辑结构和物理结构。逻辑结构是指反映数据元素之间逻辑关系的数据结构,其中逻辑关系是指数据元素之间的上下文关系,与它们在计算机中的存储位置无关。逻辑结构分为以下四类:1.集合结构集合结构中的数据元素属于同一个集合,它们之间存在并列关系,不存在其他关系。如下图所示,集合结构中元素之间的关系可以很好的表示:2.线性结构线性结构中的元素是一对一的关系。如下图所示,线性结构中元素之间的关系可以很好的表示:3.树结构树结构中的元素是一对多的关系。如下图所示,可以很好的表示树形结构中元素之间的关系:4.图形结构图形结构中的元素是多对多的关系。如下图所示,可以很好地表示图形结构中元素之间的关系:物理结构物理结构也称为存储结构,是指数据的逻辑结构在计算机存储空间中的存储形式。通俗地说,物理结构研究的是数据在内存中的存储形式。存储主要是内存,而硬盘、软盘、光盘等外部存储的数据组织通常用文件结构来描述。数据在内存中的存储结构,即物理结构,分为顺序存储结构和链式存储结构两种。顺序存储结构顺序存储结构:数据元素存储在地址连续的存储单元中,数据之间的逻辑和物理关系是一致的。数组是顺序存储结构的典型代表。它在内存中的存储形式类似于下图:链式存储结构链式存储结构:将数据元素存储在内存中的任意存储单元中,即数据可以存储在内存中的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。与顺序存储结构不同的是,链式存储结构的数据元素是通过指针连接起来的。我们可以使用指针找到某个数据元素的位置,然后对这个数据元素进行一些操作。如下图所示,可以帮助我们理解链式存储结构:顺序存储结构和链式存储结构的区别,所有顾客按照先到先得的顺序坐在大堂的椅子上(注:有坐的先后顺序)。链式存储结构相当于所有客户一到银行,大堂经理会给他们每人一个编号,然后他们就可以坐在自己想坐的椅子上(随便坐,不需要按顺序坐)),等工作人员可以广播呼叫号码。每个顾客手中的数字相当于一个指针,当前指针指向下一个存储空间,这样所有不连续的空间就可以按顺序线性连接起来。算法说到数据结构,就必须带上算法。在我看来,没有算法的数据结构只是你懂概念,只能装X,只有讲数据结构和算法,才能真正装高手。可惜凭着脑子里剩下的那点小概念,出去也只能装X了。废话少说,直接干货!算法的概念是指对问题求解方案的准确、完整的描述,是解决问题的一系列明确的指令,算法是系统地描述问题求解的策略机制。以上是我在百度百科上找到的解释。在我看来,算法就是解决一个问题所需的步骤所形成的解。每个步骤包括一个或多个操作。无论是在现实生活中还是在电脑中,解决同一个问题的方法可能有很多种。在这N种算法中,一定有一种方法执行效率最快,那么这个方法就是最优算法。算法的特征算法有五个基本特征:输入、输出、有限性、确定性和可行性。输入一个算法有零个或多个输出。描述运算对象的初始条件,所谓0输入,就是算法本身设置了初始条件。后一句的翻译是,如果一个算法本身给出了初始条件,那么可能就没有输出了。比如打印一句话:NSLog(@"你是最棒的!");输出算法至少有一个输出。换句话说,算法必须有输出。输出的形式可以是打印,也可以是返回一个值或多个值等,也可以是显示一些提示。有限算法的执行步数是有限的,算法的执行时间也是有限的。确定性算法的每一步都有明确的含义,没有歧义。有一个可行的算法,即能够解决当前的问题。当然,回过头来看,这五个特点都是扯淡,依稀记得大学老师都教过。所以,我们没必要在这些无谓的概念上浪费脑力,因为大学离我很远,考试我一分钱也拿不出来,只要我知道就好。算法设计要求要设计一个好的算法,需要考虑以下四个特点(其实大部分都是废话)。正确性废话,谁会设计一个解决不了问题的方法。可读性是指算法必须能够保证算法的可读性,即无论是在设计思路上还是在注释上,都能被其他人看懂。其实也是废话,这是一个优秀程序员的必备条件。健壮性通俗地说,一个好的算法应该具备捕获异常/处理异常的能力。此外,该算法应该能够轻松克服测试人员的压力测试和边界值测试等困难的测试方法。时间效率高和存储容量低其实是两个概念。时间效率是指时间复杂度,存储容量是指空间复杂度。翻译过来就是一个好的算法应该考虑时间复杂度和空间复杂度。通常时间复杂度和空间复杂度是相辅相成的。也就是说,从某些角度来说,我们可以通过牺牲算法的运行时间来减少内存占用,反之亦然。对于时间复杂度和空间复杂度这两个概念,大家不用被泰国搞糊涂了。我会拿出一篇文章来解释它。请大家保持冷静,继续关注。PS:本文是简单的入门。里面涉及到一些概念,大家不用太担心。这些概念将在以后的文章中逐步讲解。请不要急躁,不要气馁!
