1.数据结构
1.1数据
数据是指对客观事物进行逻辑归纳,是用于表示客观事物的未经加工的原始素材。它可以包括数值数据、时间日期数据、文本数据等不同类型。
1.2数据结构三要素
数据结构的三要素是:逻辑结构、存储结构和运算。
- 逻辑结构:指数据元素之间的逻辑关系,也称为数据元素的"形式结构",包括线性结构、非线性结构、集合结构、树形结构等。
- 存储结构:指数据结构中元素在计算机存储器中的表示方式,也称为数据元素的"物理结构",包括顺序存储结构、链式存储结构、索引存储结构等。
- 运算:指对数据结构可以进行的操作和算法,也称为数据结构的"基本操作",包括插入、删除、查找、排序、遍历等。
1.3数据元素
数据元素也称为数据项,是数据的基本单元,通常由一组属性描述其定义、标识、表示和允许值的数据单元。数据元素将若干具有相关性的数据元按一定的次序组成一个整体结构即为数据模型。
1.4数据对象
数据对象是必须由软件理解的复合信息表示。数据对象可能是外部实体、事物、偶发事件或事件、角色、组织单位、地点或结构等。例如,一个人或一部车可以被认为是数据对象,在某种意义上它们可以用一组属性来定义。
1.5数据类型
数据类型是指一组性质相同的数据值的集合以及定义在这个值集合上的一组操作的总称。例如,整数类型包括byte、short、int、long等,字符类型包括char,布尔类型包括boolean,小数类型包括float、double等。
1.6逻辑结构与存储结构
数据的存储结构与逻辑结构是密切相关的。
逻辑结构是数据元素之间抽象化的关系,独立于计算机,是从具体问题中抽象出来的数学模型。它描述了数据元素之间的逻辑关系,是数据在问题中的抽象表示。而存储结构是数据元素及其关系在计算机中的存储方式,包括顺序存储和链式存储等。
数据的逻辑结构决定了它的存储结构。不同的逻辑结构需要不同的存储结构来存储数据。例如,线性结构可以采用顺序存储结构或链式存储结构,而树形结构通常采用链式存储结构。反过来,数据的存储结构也会影响它的逻辑结构。例如,采用链式存储结构时,可以很方便地实现链表的插入和删除操作。
因此,数据的逻辑结构和存储结构是相互依存、相互影响的两个方面,它们共同决定了数据在计算机中的表示和处理方式。
2.算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
2.1算法五大特性
算法的五大特性包括:
- 有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
- 确切性:算法的每一步骤都具有确定的含义,不会出现二义性。
- 可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。
- 输入:算法具有零个或多个输入。 尽管对于绝大多数算法来说,输入参数都是必要的,但对于个别情况,如打印"helloworld"这样的代码,不需要任何输入参数,因此算法的输入可以是零个。
- 输出:算法至少有一个或多个输出。 算法是一定要有输出的,输出形式可以是打印输出,也可以是返回一个或多个值等。
2.2算法衡量指标
算法的衡量指标通常包括:
- 时间复杂度:衡量算法执行时间与数据规模之间的关系。通常以输入规模n来作为参数,用O(f(n))来表示时间复杂度。例如,冒泡排序的时间复杂度为。
- 空间复杂度:衡量算法在执行过程中所使用的存储空间大小。可以用O(f(n))来表示空间复杂度,其中f(n)是关于输入规模n的函数。例如,冒泡排序的空间复杂度为O(1)。
- 正确性:算法应该能够正确地解决问题,满足问题的实际需求。
- 健壮性:算法应该能够处理异常情况,例如输入数据的格式不正确或存在缺失值等。
- 可读性:算法应该易于理解和维护,有助于代码的协作和复用。
- 可扩展性:算法应该能够适应不同规模的数据集,并且在数据量增加时仍能保持高效的性能。
- 稳定性:算法应该对输入的变化不太敏感,即输入数据的微小变化不应该导致算法结果的巨大变化。
所以设计一个好的算法需要考虑:正确性、可读性、健壮性、效率与低存储量
试思考,同一个算法,为什么实现语言的级别越高执行效率越低?
这是因为实现语言的级别越高,意味着抽象程度越高,离底层硬件越远,因此执行效率会相对较低。高级语言为了提供更易用、更抽象的编程接口,会引入更多的运行时开销,包括内存管理、垃圾回收、动态类型检查等。这些特性虽然使编程更加方便,但同时也增加了额外的计算成本,导致高级语言的执行效率相对较低。
相比之下,低级语言如汇编语言直接操作硬件,能够精确控制计算机执行的每一步操作,避免了高级语言中的额外开销,因此执行效率更高。但是,使用低级语言编程需要更多的开发时间和经验,并且容易出错,所以高级语言在开发效率和易用性方面更具优势。
参考资料
[1]《数据结构》知识点汇总+算法代码总结【全】