DataWhale组队 LeetCode task1

目录

1. 数据结构

2. 算法

3. 程序设计

总结

1. 算法复杂度的评估方法

2. 问题规模 n

3. 时间复杂度

4. 空间复杂度的定义

5. 空间复杂度的组成

6. 空间复杂度的计算

总结


一、什么是算法?算法的用处是什么?
算法 + 数据结构 = 程序 这一公式简洁地表达了程序设计的核心要素。算法是解决问题的步骤或方法,而数据结构则是数据的组织、存储和管理方式。程序则是算法和数据结构的具体实现。

1. 数据结构

数据结构是带有结构特性的数据元素的集合,研究的是数据的逻辑结构、物理结构以及它们之间的相互关系。数据结构的主要目的是高效地组织、存储和操作数据。

  • 逻辑结构:数据元素之间的关系,分为集合结构、线性结构、树形结构和图形结构。

    • 集合结构:数据元素同属于一个集合,无其他关系。

    • 线性结构:数据元素之间是“一对一”关系。

    • 树形结构:数据元素之间是“一对多”的层次关系。

    • 图形结构:数据元素之间是“多对多”的关系。

  • 物理结构:数据的逻辑结构在计算机中的存储方式,常见的有顺序存储结构和链式存储结构。

2. 算法

算法是解决特定问题的步骤描述,表现为一系列指令的集合。算法的设计追求高效性,主要体现在时间复杂度和空间复杂度上。

  • 算法的特性

    • 输入:算法开始前赋给算法的参数。

    • 输出:算法执行后返回的结果。

    • 有穷性:算法必须在有限的步骤内结束。

    • 确定性:算法的每一步必须清晰明确,无歧义。

    • 可行性:算法的每一步必须可执行,且能在有限时间内完成。

  • 算法的目标

    • 时间复杂度更低:运行时间更少。

    • 空间复杂度更低:占用内存空间更小。

    • 正确性:算法能够正确解决问题,满足需求。

    • 可读性:算法易于理解和维护。

    • 健壮性:算法能够处理非法数据和操作。

3. 程序设计

在程序设计中,选择合适的算法和数据结构是关键。优秀的算法和数据结构能够显著提升程序的效率和质量。程序员需要从时间复杂度和空间复杂度两方面综合考虑,选择最优的解决方案,从而编写出高质量的代码,提升编程技能和工作回报。

总结

  • 数据结构是数据的组织方式,决定了数据的存储和操作效率。

  • 算法是解决问题的步骤,决定了程序的执行效率。

  • 程序是算法和数据结构的具体实现,优秀的程序需要在时间和空间上达到平衡,同时具备正确性、可读性和健壮性。

二、算法评判标准

  算法复杂度 是衡量算法效率的重要指标,分为 时间复杂度 和 空间复杂度。它描述了在输入规模为 n 的条件下,算法运行所需的时间和空间资源。

1. 算法复杂度的评估方法
  • 事后统计

    • 将算法实现为可执行程序,通过实际运行记录时间和空间消耗。

    • 缺点:实现成本高,结果受编程语言、计算机性能等因素影响,不具备普适性。

  • 预先估算

    • 在算法设计完成后,通过分析算法的步骤,估算其时间复杂度和空间复杂度。

    • 优点:高效、通用,不受具体实现环境和硬件影响。

    • 常用方法:大多数情况下选择预先估算,因为它更实用且可比较。

2. 问题规模 n
  • 定义:问题规模 n表示算法输入的数据量大小,具体定义因算法类型而异。

    • 排序算法:n表示需要排序的元素数量。

    • 查找算法:n表示查找范围内的元素总数(如数组大小、字符串长度等)。

    • 二进制计算:n表示二进制的展开宽度。

    • 图算法:n可能表示图的节点数或边数.

3. 时间复杂度
  • 定义:在输入规模为 nn 的条件下,算法运行所需的时间,记作 T(n)。

  • 度量标准:以 基本操作次数 作为时间复杂度的衡量依据。

    • 基本操作:算法中的每一条语句,且每条语句的执行时间为常数时间。

  • 目标:通过分析基本操作的次数,估算算法的时间消耗,从而比较不同算法的效率。

  • 计算:

  • 加法原则:总的时间复杂度等于量级最大的基本语句的时间复杂度。
  • 如果 T1(n)=O(f1(n)),T2(n)=O(f2(n)),T(n)=T1(n)+T2(n),则 T(n)=O(f(n))=max(O(f1(n)),O(f2(n)))=O(max(f1(n),f2(n)))

  • 乘法原则:循环嵌套代码的复杂度等于嵌套内外基本语句的时间复杂度乘积。
  • 如果 T1=O(f1(n)),T2=O(f2(n)),T(n)=T1(n)×T2(n),则 T(n)=O(f(n))=O(f1(n))×O(f2(n))=O(f1(n)×f2(n))

4. 空间复杂度的定义
  • 公式表示:空间复杂度可以表示为 S(n)=O(f(n)),其中 f(n) 是问题规模 n 的函数。

  • 含义:随着问题规模 n 的增大,算法所占用的空间增长趋势与 f(n) 相同。

  • 目标:衡量算法对内存资源的使用效率。


5. 空间复杂度的组成

空间复杂度主要包括以下两部分:

  1. 局部变量占用的存储空间

    • 算法范围内定义的变量(如临时变量、数组、对象等)所占用的空间。

  2. 系统为实现递归所使用的堆栈空间

    • 如果算法是递归实现的,递归调用过程中使用的栈空间也需要计入空间复杂度。


6. 空间复杂度的计算
  • 相比于时间复杂度,空间复杂度的计算通常更简单,因为它主要关注算法运行过程中额外分配的空间。

  • 常见空间复杂度

    • O(1):常数空间,算法使用的空间不随输入规模 n 变化。

    • O(n):线性空间,算法使用的空间与输入规模 n 成正比。

    • O(n2):平方空间,算法使用的空间与输入规模 n的平方成正比。


总结

  • 时间复杂度 和 空间复杂度 是评估算法性能的两个重要维度。

  • 时间复杂度 衡量算法运行时间的增长趋势,通过基本操作次数进行分析。

  • 空间复杂度 衡量算法占用内存的增长趋势,重点关注辅助空间的使用。

  • 问题规模 n 是算法复杂度的输入参数,具体定义因算法类型而异。

你可能感兴趣的:(leetcode,算法)