数据结构和算法之学前吹牛

建议关注收藏,持续更新中……

数据结构算法和绪论

1.什么是数据结构?

1.1 数据结构的概念:

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。(程序设计=数据结构+算法)

1.2 数据结构的划分:

传统上,数据结构分为逻辑结构和物理结构。

逻辑结构: 是指数据对象中数据元素之间的相互关系。
集合结构: 集合结构中的数据元素除了同属于一个集合外,没有其他关系。
线性结构: 元素有一对一的关系。
树型结构: 一对多的层次关系。
图形结构: 元素是多对多的关系。

物理结构: 是指数据的逻辑结构在计算机中的存储形式。
顺序存储结构: 把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。例如数组。
链式存储结构: 把数据元素存储在任意存储单元里,存储单元可以是连续的,也可以是不连续的。

2.算法浅谈

2.1 算法的概念:

解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
特征:

  1. 输入:算法具有零个或多个输入。
  2. 输出:至少有一个或多个输出。
  3. 有穷性:有穷执行步骤。
  4. 确定性:算法的每一个步骤都有确定的含义。
  5. 可行性:每一步都能够通过有限次数执行。

2.2 算法设计的要求:

  1. 正确性:指算法至少具有输入、输出和加工处理的无歧义性、能正确反映问题的需求、能够得到正确答案。(无错、输出、说明、结果)
  2. 可读性:便于阅读、理解和交流。
  3. 健壮性:不合法时能做出处理。
  4. 时间效率高和存储量低

2.3 算法效率的度量方法:

事后统计方法: 通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。缺陷:不便捷。

事前分析估算方法: 编写程序前,依据统计方法对算法进行估算。
研究算法的复杂度,侧重研究的是算法随着输入规模扩大增长量的抽象(不关心语言,只关心算法),分析一个算法的运行时间时,重点是把基本操作的数量和输入模式关联起来。

判断算法效率时只需关心主项的阶数。

3.时间复杂度和空间复杂度

3.1 时间复杂度:

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。
用O()来体现算法时间复杂度的记法,称为大O记法。

如何推导大O阶:
(1) 用常数1取代运行时间中所有加法常数。
(2) 在修改后的运行次数函数中,只保留最高阶项。
(3) 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
(4) 得到的最后结果就是大O阶。

线性阶: 一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长。
平方阶: 嵌套。
对数阶: o(logn)

在这里插入图片描述常用的时间复杂度所耗费的时间从小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n<O(2n)<O(n!)<O(n^n)

3.2 算法的空间复杂度:

写代码时可以空间换时间。计算公式:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。

通常,用“时间复杂度“来指运行时间的需求,用”空间复杂度”指空间需求。当直接要让我们求“复杂度“时,通常指的是时间复杂度。显然,时间复杂度是算法的潮流。

备注:欢迎加入qq群互相交流学习

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45823731/article/details/113065348