建议关注收藏,持续更新中……
目录
数据结构算法和绪论
1.什么是数据结构?
1.1 数据结构的概念:
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。(程序设计=数据结构+算法)
1.2 数据结构的划分:
传统上,数据结构分为逻辑结构和物理结构。
逻辑结构: 是指数据对象中数据元素之间的相互关系。
集合结构: 集合结构中的数据元素除了同属于一个集合外,没有其他关系。
线性结构: 元素有一对一的关系。
树型结构: 一对多的层次关系。
图形结构: 元素是多对多的关系。
物理结构: 是指数据的逻辑结构在计算机中的存储形式。
顺序存储结构: 把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。例如数组。
链式存储结构: 把数据元素存储在任意存储单元里,存储单元可以是连续的,也可以是不连续的。
2.算法浅谈
2.1 算法的概念:
解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
特征:
- 输入:算法具有零个或多个输入。
- 输出:至少有一个或多个输出。
- 有穷性:有穷执行步骤。
- 确定性:算法的每一个步骤都有确定的含义。
- 可行性:每一步都能够通过有限次数执行。
2.2 算法设计的要求:
- 正确性:指算法至少具有输入、输出和加工处理的无歧义性、能正确反映问题的需求、能够得到正确答案。(无错、输出、说明、结果)
- 可读性:便于阅读、理解和交流。
- 健壮性:不合法时能做出处理。
- 时间效率高和存储量低
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)
3.2 算法的空间复杂度:
写代码时可以空间换时间。计算公式:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。
通常,用“时间复杂度“来指运行时间的需求,用”空间复杂度”指空间需求。当直接要让我们求“复杂度“时,通常指的是时间复杂度。显然,时间复杂度是算法的潮流。