数据结构与算法笔记 - 绪论

数据结构与算法笔记 - 绪论

1. 什么是计算
2. 评判DSA优劣的参照(直尺)
3. 度量DSA性能的尺度(刻度)
4. DSA的性能度量的方法
5. DSA性能的设计及其优化

x1. 理论模型与实际性能的差异
x2. DSA优化的极限(下界)

计算机与算法

计算机科学(computer science)的核心在于研究计算方法与过程的规律,而不仅仅是作为计算工具的计算机本身,因此E. Dijkstra及其追随者更倾向于将这门科学称作计算科学(computing science)。

计算 = 信息处理

计算模型 = 计算机 = 信息处理工具

1. 计算机的本质是计算,计算是寻找对象的规律,并从中找到技巧。计算的目标是高效,低耗。

2. 算法就是借助一定的工具,在一定的规则下,以明确而机械的形式来进行的计算。
算法定义:基于特定的计算类型,旨在解决某一信息处理问题而设计的一个指令序列。

3. 算法需具备以下要素
        输入与输出
                输入(input):对所求解问题特定实例的描述
                输出(output):经计算和处理之后得到的信息,即针对输入问题实例的答案
        确定性和可行性:算法应可描述为由若干语义明确的基本操作组成的指令序列,且每一基本操作在对应的计算模型中均可兑现。
        有穷性:任意算法都应在执行有限次基本操作之后终止并给出输出
        正确性:算法所给的输出应该能够符合由问题本身在事先确定的条件
        退化和鲁棒性:例如算法数据的各种极端的输入实例都属于退化(degeneracy)情况,鲁棒性(robustness)要求尽可能充分地应对此类情况。
        重用性:算法模式可推广并适用于不同类型基本元素的特性

证明算法的有穷性和正确性:从适当的角度审视整个计算过程,找出其所具有的某种不变性和单调性
        单调性:问题的有效规模会随着算法的推进不断递减
        不变形:不仅应在算法初始状态下自然满足,而且应与最终的正确性相呼应----当问题的规模缩减到0时,不变性应随即等价于正确性
        例如, 冒泡排序的正确性证明:(不变性)经过k趟扫描交换后,最大的前k个元素必然就位;(有穷性)经过k趟扫描交换后,待求解问题的有效规模将缩减至n-k。

好的算法:效率最高(速度尽可能快,存储空间尽可能少)同时又兼顾正确(算法能够正确地解决问题)、健壮(容错性好)、可读(易于阅读)。 类似既要马儿跑的快,又要吃的少。

算法 + 数据结构 = 程序         (算法 + 数据结构) * 效率 = 计算

计算模型

1. 一个好的程序不仅要考虑数据结构与算法,还要考虑效率,即:(数据结构+算法)*效率 = 程序 => 应用。

2. 算法分析的两个重要指标 (需要进行度量)
        正确性:算法功能是否与问题一致
        成本:时间消耗与存储空间消耗

3. 定义:T(n) 为一个算法在最坏的情况下所需要操作的步骤。不同算法之间的好坏主要看T(n)的大小,T(n)是屏蔽了计算机硬件差异,语言差异,编译差异等差异之后的理想平台下的运行指标,如大O,大Ω,大Θ等。

4. 一般的计算模型有图灵模型与RAM模型,它们均将算法的运算时间转换成算法执行的基本操作次数。

图灵机模型

图灵机的三个组成要件
        1. 有限的字母表: cell中存储的内容
        2. 读写头: 只是当前位置, 可读可写
        3. 状态表: 当前读写头的状态

图灵机状态转换过程 transform(q,c; d,L/R,p)
        q:当前状态
        c:读写头所指cell当前的内容
        d:读写头所指cell改写的内容
        L/R:向左/右移位
        p:读写头转换后的状态

RAM 模型

1. 与图灵机类似,均假设有无限空间
2. 由一系列顺序编号寄存器组成,但总数无限
3. 算法所运行的时间转换成算法运算时的次数

数据结构

数据结构示意

数据对象由数据元素组成,数据元素由数据项组成,数据项是最基本的单位
        数据结构指数据对象中数据元素之间的关系
        数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系

数据结构的逻辑结构

集合结构
        线性结构
        树结构
        图结构

数据结构的物理结构

顺序存储结构
        链式存储结构

数据的运算

插入
        删除
        修改
        查找
        排序

复杂度度量

1. 算法的效率主要看时间消耗与存储空间消耗,这里我们屏蔽存储空间的消耗,仅仅考虑时间的消耗。

2. 大O的定义:T(n)=O(f(n)) ,f(n)为一个函数。当c>0,T(n)<c?f(n),即大O记号表示T(n)的一个上界,其性质为:
        O(n)=O(c?n)
        O(n2+n)=O(n2)

3. 大Ω的定义:T(n)=Ω(f(n)) ,f(n)为一个函数。当c>0,T(n)>c?f(n),即大O记号表示T(n)的一个下界。

4. 大Θ的定义:T(n)=Θ(f(n)) ,f(n)为一个函数。当c1>c2>0,c1?f(n)>T(n)>c2?f(n),即大O记号表示T(n)的一个区间。

5. 大O记号的分类:
        常数类:O(1)=2 or222222 ,有效
        对数类:O(logcn)与常底数、常数次幂无关,复杂度接近常数,有效。
        多项式:O(nc)
        线性:O(n)
        指数:cn=O(2n)任何c均可。成本增长极快,不是有效的。

6. 时间复杂度T(n) :特定算法处理规模为n的问题所需的时间,由于n相同,但T(n)不同,---->简化为:
                                        在规模为n的所有输入中选择时间最长者作为T(n),并以T(n)度量算法的时间复杂度。

7. 渐进时间复杂度:注重时间复杂度随问题规模n的增长的总体变化趋势
        大O记号(T(n)的渐进上界):
                若存在正的常数c和函数f(n),使的对任何n>>2都有: T(n) <= c * f(n),即认为在n足够大之后,f(n)给出了T(n)增长速度的一个渐进上界,记为:T(n) = O( f(n) )

8. 大O记号性质:
对于任一常数 c > 0, 有O( f(n) ) = O( c * f(n) ):在大O记号意义下:函数各项正的常系数可以忽略并等同于1
对于任意常数 a > b > 0,有 O( n ^ a + n ^ b ) = O( n ^ a ):在大O记号意义下:多项式中的低次项均可忽略

9. 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)= O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。

关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。

10. 对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

11. 通常,我们都使用“时间复杂度”来指运行时间的需求,使用“空间复杂度”指空间需求。当不用限定词地使用“复杂度”时,通常都是指时间复杂度。

算法分析

1. 算法分析主要有两个任务:

正确性

复杂度

2. 复杂度的分析方法有三种:

迭代式算法:级数求和

递归式算法:递归跟踪 + 递归方程

猜测 + 验证

3. 算数级数:与末项的平方同阶

4. 幂方级数:比幂次高出一阶

5. 几何级数(a>1):与末项同阶

6. 收敛级数:O(1)

7. 可能未必收敛,但长度有限

8. 循环:一般随着层数的增加指数式增长

9. 递归跟踪分析:检查每个递归实例,累计所需时间(调入语句本身,计入对应的子实例),总和即为算法执行时间。

迭代与递归

算法的两种思想方法:分而治之,减而治之。
        分而治之:将一个问题分两个规模大小差不多的子问题。
        减而治之:将一个问题分为一个子问题和一个规模缩减的问题。

动态规划

1. 动态规划的目的:
        make it work(递归可以保证)
        make it right(递归可以保证)
        make it fast(迭代可以保证)
2. 递归对于资源的消耗大而且O(n)比较大,然而迭代可以降低对存储空间的使用,有时亦可以降低O(n)
3. 子序列:由原序列中若干个元素,按原来相对次序排列而成的新的序列。
4. 最长公共子序列(longest common subsequence, LCS)是两个序列中,在其相同的子序列中长度最长的那个子序列,可能含有多个。

--------------------------------------------------------------------------------

参考 http://blog.csdn.net/horizontalview/article/details/50804801

参考 http://www.cnblogs.com/joh-n-zhang/p/5759226.html

时间: 2024-08-07 07:05:23

数据结构与算法笔记 - 绪论的相关文章

数据结构与算法笔记(1)基本概念

1.什么是数据结构 用计算机解决一个具体的问题,需要以下几个步骤: 从具体问题抽象出一个适当的数学模型: 设计一个解此数学模型的算法: 编出程序: 进行测试.调整直至得到最终解答. 寻求数学模型的实质: 分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述. 很多问题求解最后都转化为求解数学方程或数学方程组.如:求解梁架结构中应力的数学模型为线性方程组.预报人口增长情况的数学模型为微分方程.然而:当计算机进入非数值计算领域,特别是用在管理上的时候,计算机的操作

数据结构与算法之绪论

什么是数据结构 简单来说可以解释为:程序设计=数据结构+算法: 主要是用来研究数据结构的关系,数据元素之间存在的一种或多种特定关系的集合: 数据结构的分类 按照传统意义上来讲,数据结构可以分为两类:逻辑结构和物理结构: 逻辑结构指的是数据对象中数据元素之间的相互关系. 主要有四种逻辑结构: 集合结构:集合结构中的数据元素同属于一个集合体中,但是它们之间没有其他关联: 线性结构:线性结构中的数据元素之间是一对一的关系,如同夫妻关系: 树形结构:树形结构中的数据元素之间是一对多的关系,如同一个爸爸对

数据结构 排序算法 笔记

/* 冒泡排序 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序 */ # include <stdio.h> # define LEN 6 void bubble_sort(int *, int); int main(void) { int arry[LEN] = {6, 2, 4, 1, 5, 9}; int i; for (

数据结构与算法笔记(3) 排序算法基础

1.什么是排序 排序就是将一个数据元素(或记录)的任意序列,通过一定的方法重新排列成一个按关键字有序的序列的过程. 2.排序的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的:否则称为不稳定的. 稳定的排序的优点是,从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用. 例如,假设一个班的学生已经按照学号大

【4】学习JS 数据结构与算法笔记

第一章 JS 简介 1. 环境搭建的三种方式 1. 下载浏览器 2. 使用 Web 服务器 ( XAMPP ) 3. 使用 Node.js 搭建 Web 服务器 4. 代码地址>> 2. JS 语法

数据结构学习笔记——绪论

数据结构学习笔记——绪论 为了更贴切的描述一种数据结构,通常采用二元组表示:(对于一种数据结构其逻辑结构唯一) B=(D,R)其中,B是一种数据结构,它由数据元素的集合D和D上二元关系的集合R所组成.即D={ di | 1 <= i<= n, n > 0}R={ rj | 1 <= j<= n, n > 0}D 上的一个关系r是序偶的集合,对于r中任一序偶<x,y>(x,y属于集合D),把x叫做偶序第一节点,把y叫做偶序第二结点,又称序偶的第 一结点为第二结

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

数据结构与算法(刺猬书)读书笔记----目录

最近在抓底层的语言基础,以前对数据结构和算法并没有太大感觉,但越往深处学就越觉得这些基础真的是要牢牢掌握住.一个简简单单的数组,深究起来都有很多学问.所以打算写个一系列的读书笔记,好好梳理一下这一块的基础知识.这本书是<数据结构预算法JavaScript描述>,是基于JavaScript的.里面大致介绍了数组.列表.栈.队列.链表.散列.集合及各种常见基础算法.作为基础读物算是很全面的.这系列读书笔记也将会跟着书里的顺序一章章的进行梳理.整个过程计划耗时2-3个月,每周更新一到两张,更新的笔记

数据结构与算法绪论

安装opencv2.0 解压OpenCV-2.0.0.tar.bz2 tar xvf OpenCV-2.0.0.tar.bz2 配置 ./configure --host=arm-linux \ --without-carbon \ --without-quicktime \ --without-1394libs \ --without-ffmpeg \ --without-python \ --without-swig \ --without-gtk \ --enable-static \ -