目录:

  • 一.什么是数据结构
  • 二.什么是算法
    • 1.定义
    • 2.什么是好算法
    • 3.最坏情况复杂度与平均复杂度
    • 4.复杂度的渐进表示法
    • 5.常见函数的输入规模
    • 6.复杂度分析小窍门
  • 三.应用实例(最大子列和问题)
    • (1) 什么是最大子列和问题
    • (2) 算法1
    • (3) 算法2
    • (4) 算法3
    • (4) 算法4(在线处理)
  • 四.常见数据结构

一.什么是数据结构

关于什么是数据结构,官方没有统一的定义,陈越老师对于这个问题列举了3个(sartaj sahni,Clifford A.Shaffer,中文维基百科)描述,从中我们发现数据结构和算法息息相关。

然后陈越老师列举了以下3个例子,来理解数据结构。
例1:如何在书架上摆放图书?
摆放图书的操作:

  • 新书怎么插入
  • 怎么找到某本指定图书

摆放图书的方法:

  • 随便摆放(插入方便,当插入的图书数量较多时查找麻烦)
  • 按照书名的拼音字母顺序排放(插入比较方便,查找比较方便)
  • 把书架划分成几块区域,每块区域指定摆放某种类别的图书;在每种类别内,按照书名的拼音字母顺序排放(插入方便,查找方便,需要考虑类别划分,和空间分配问题)

从上面的例子我们可知:

  • 解决问题方法的效率,跟数据的组织方式有关

例2:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数。
通过循环实现:

运行效果:

通过递归实现:

运行效果:

每一个程序,存放临时数据存储空间是有限的(使用的临时数据存放到内存中),上面的程序,每迭代一次,就会多一个临时数据,就会占用一个临时空间,当占的存储空间超过程序使用的存储空间的时候,就会非正常退出,出现像上面那样,没有任何结果输出。

从上面的例子可知:

  • 解决问题方法的效率,跟空间的利用效率有关

c语言计时函数:

第一种求多项式方法: 通过f(x)=an X xn 对每项求和

第二种求多项式方法: 秦九韶算法

具体代码:

#include <stdio.h>
#include <time.h>
#include <math.h>clock_t start, stop;
double duration;
double f1( int n, double a[], double x, int count);
double f2( int n, double a[], double x, int count);int main (){double a[100];int i=0,count=10000000;for (i=0;i<10;i++){a[i]=i;}start = clock();// 被测函数f1(9,a,6,count);stop = clock();duration = ((double)(stop-start))/CLK_TCK/count;printf("第一种方法打点个数:%f\n",(double)(stop-start));printf("第一种方法运行时间:%6.2e\n",duration);start = clock();// 被测函数f2(9,a,6,count);stop = clock();duration = ((double)(stop-start))/CLK_TCK/count;printf("第二种方法打点个数:%f\n",(double)(stop-start));printf("第二种方法运行时间:%6.2e\n",duration);return 0;
}double f1( int n, double a[], double x,int count)
{int i;double p = a[0];while(count!=0){--count;for ( i=1; i<=n; i++){p += (a[i] * pow(x,i));}    }return p;
}double f2( int n, double a[], double x,int count)
{int i;double p = a[0];while(count!=0){--count;for ( i=n; i>0; i--){p += a[i-1] + x*p;}    }return p;
}

运行效果:

从上面的例子我们可知:

  • 解决问题方法的效率,跟算法的巧妙程度有关

通过上面的实例,再来思考上面的问题(什么是数据结构)?

  • 数据对象在计算机中的组织方式,分为逻辑结构(集合结构,线性结构,树形结构,图形结构)和物理结构(顺序存储和链式存储)
  • 数据对象必定与一系列加在其上的操作相关联
  • 完成这些操作所用的方法就是算法

备注:

  • 逻辑结构:是指数据对象中数据元素之间的相互关系。
  • 物理结构:是指数据的逻辑结构在计算机中的存储形式。

关于什么是抽象数据类型

  • 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称(在面向对象语言中叫做类)。
  • 抽象:是指抽取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息。
  • 抽象数据类型(Abstract Data Type,ADT):是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关(只描述数据对象集和相关操作集“是什么”,并不涉及“如何做到”的问题)。


二.什么是算法

1.定义

2.什么是好算法

衡量算法的好坏由时间复杂度和空间复杂度决定,并不仅仅只是时间复杂度或空间复杂度一方越好该算法就越好,而是根据实际场景,选择时间复杂度和空间复杂度的一个平衡点,有的时候为了追求运行速度我们会相应的舍弃一些空间来换取时间(提高运行速度),或者为了减少使用的空间降低运行的速度。

复杂度分析:

  • T(N)= C·N



3.最坏情况复杂度与平均复杂度

  • 最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。
  • 平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。

4.复杂度的渐进表示法

(无需关心算法具体执行了多少次,只需要粗略地知道它的增长趋势即可)

  • 上界
  • 下界
  • 等价


大O()记法:用来体现算法时间复杂度
推导大O阶

  • 1.用常数1取代运行时间中的所有加法常数。
  • 2.在修改后的运行次数函数中,只保留最高阶项。
  • 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。

常数阶
以下代码的大O()表示为O(1)而不是O(3)=O(1+1+1)(由推导大O阶第1条可知)

同理以下代码的大O()表示为O(1)

事实上无论n为多少,上面的两段代码就是3次和12次执行的差异。这种与问
题的大小无关(n的多少),执行时间恒定的算法,我们称之为具有0(1)的时间复杂
度,又叫常数阶。
注意:不管这个常数是多少,我们都记作0(1),而不能是0(3)、 0(12)等其他任何数字,这是初学者常常犯的错误。

线性阶
线性阶的循环结构会复杂很多。要确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。因此,我们要分析算法的复杂度,关键就是要分
析循环结构的运行情况。
下面这段代码,它的循环的时间复杂度为0(n),因为循环体中的代码须要执行n次。

int i;
for(i=0;i<n;i++){/* 时间复杂度为O(1)的程序步骤序列
}

对数阶

平方阶

5.常见函数的输入规模




备注: 当我们编写的算法运行时间要大于nlogn的时候,我们尽量将该算法优化到nlogn。

6.复杂度分析小窍门

三.应用实例(最大子列和问题)

(1) 什么是最大子列和问题

(2) 算法1

(3) 算法2

(4) 算法3

4:4和-3二个数,不运算值为4,运算后值为1,所以最大为4
5:5和-2二个数,不运算值为5,运算后值为3,所以最大为5
6:4和-3(运算后1,不运算是4),4,-3和5(4和-3运算后为1再和5运算为6),4,-3,5,和-2(前面进行运算后为6如果再和-1运算就为5了,所以选择不运算为6),所以最大为6

(4) 算法4(在线处理)

四.常见数据结构

常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。

相关视频学习链接:
数据结构与算法基础(青岛大学-王卓)

数据结构与算法-浙江大学陈越数据结构第一章学习相关推荐

  1. 数据结构与算法(陈越版)第五讲 (树下)树的应用——集合及其运算

    数据结构与算法(陈越版)第五讲 (树下)树的应用--集合及其运算 一.集合的表示 1.1.集合的表示 1.2.集合的储存 二.集合的运算 2.1查找以及普通并 2.2按照秩的合并算法 2.3路径压缩优 ...

  2. 数据结构与算法(陈越)(学习笔记)(更新ing)

    数据结构(陈越) 一.数据结构(计算运行时间) #include<stdio.h> #include<time.h> #include<math.h> clock_ ...

  3. 陈越数据结构_第一周

    陈越数据结构_第一周 1. 最大子列和问题 是第一周最后讲到的4种算法的实验题,属于基本要求,一定要做: 题目见PAT 输入样例: 6 -2 11 -4 13 -5 -2 输出样例: 20 1.1 解 ...

  4. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  5. 链表的相关操作-数据结构与算法(北航991数据结构)

    数据结构与算法(北航991数据结构) 下面的这一段代码是针对于这30道题而写的关于单向链表,双向链表以及循环链表等链表的创建及遍历,做辅助使用. 所有题目均是自己理解敲的,并执行成功的.可能会存在一起 ...

  6. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  7. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 竞赛树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 竞赛树 一.赢者树 二.二叉树的数组描述(补充) 1.声明 2.实现 三.赢者树 1.抽象数据类型 2.赢者树的表示 3.声明 ...

  8. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  9. 数据结构与算法python语言实现-第四章答案

    数据结构与算法python语言实现-第四章答案 4.1 def findmax(S, index=0):if index == len(S) - 1:return S[index]max=findma ...

  10. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

最新文章

  1. MySQLDump的备份方法
  2. 报名|首届中国智慧城市大数据开放创新应用大赛
  3. Git 分支 - 变基
  4. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS
  5. NSTimer 进阶使用总结与注意事项
  6. 网站三级分销数据库如何设计,简单案例
  7. Redhat5下haproxy+keepalived+nginx配置笔记
  8. opendaylight_使用OpenDaylight在软件中定义网络
  9. linux查找出全部doc文件,linux 查找出包含某个字符串的所有文件的方法详解
  10. 将一个十六进制数的字符串参数转换成整数返回
  11. 喵哈哈村小学上课啦(欧拉函数)
  12. 一线算法工程师总结:python常用数据挖掘算法PDF版
  13. 光学软件国产化项目开发心得
  14. MS-office计算机二级选择题大全
  15. JPA(hibernate)一对多根据多的一方某属性进行过滤查询
  16. 关于win7 环境下安装docker容器的步骤 以及过程中的问题解决
  17. Installations UVA - 1467
  18. 单片机led灯闪烁实验总结_这样处理家中LED灯和节能灯关了还是微亮或闪烁的故障...
  19. 戴尔-卡耐基:《人性的优点 How to stop worrying and start living》
  20. train.py部分

热门文章

  1. 【优化算法】白头鹰搜索优化算法(BES)【含Matlab源码 1381期】
  2. 【回归预测】基于matlab Logistic混沌映射改进的麻雀搜索算法优化BP神经网络回归预测【含Matlab源码 1552期】
  3. 【水果识别】基于matlab GUI柑橘质量检测及分级系统【含Matlab源码 738期】
  4. 【心电信号】基于matlab GUI心电信号数字滤波处理【含Matlab源码 1067期】
  5. 人工智能+社交 csdn_关于AI和社交媒体虚假信息,我们需要尽快进行三大讨论
  6. jio tomcat_透过Jio Glass看
  7. 数据库的根据当前id查询所有父级菜单
  8. 【无标题】提示用户输入用户名,然后再提示输入密码,如果用户名 是“admin”并且密码是“88888”,则提示正确,否则,如果 用户名不是admin还提示用户用户名不存在,如果用户名是
  9. python执行命令不阻塞_Python 命令行非阻塞输入
  10. nuxt解决首屏加载慢问题_为什么Nuxt.js创建服务器端渲染的应用程序更有优势?...