第一章 引入

1.1 什么是数据结构

  • 解决问题方法的效率,和数据的组织方式有关。
  • 递归函数在处理大量数据时,会大量占用空间。这体现了解决问题方法的效率,跟空间的利用效率有关。
  • 解决问题方法的效率,与算法的巧妙程度有关。

一、数据结构是数据对象在计算机中的组织方式

1. 数据对象的逻辑结构

  • 线形结构(一对一)
  • 树(一对多)
  • 图(多对多)

2. 数据对象在计算机中的物理存储结构

  • 数组
  • 链表 等

3. 描述数据对象的方法 —— 抽象数据类型

(1)数据类型
  • 数据对象集

  • 数据集合相关联的操作集

    注意:在C语言中,这两个分开处理;但在面向对象的编程语言中,这两个会在同一个类(class)中出现

(2) 抽象:描述数据类型的方法不依赖于具体实现

对数据类型的描述:

  • 与存放数据的机器无关

  • 与数据存储的物理结构无关

  • 与是实现操作的算法和编程语言无关

    注意:我们只描述数据对象集和相关操作集 “是什么” ,并不涉及 “如何做到” 的问题

二、数据对象必定与一系列加在其上的操作相关联

三、完成这些操作所用的方法是算法


1.2 什么是算法

一、算法

  • 是一个有限指令集

  • 接收一些输入,有时候不需要输入

  • 一定产生输出

  • 一定在有限步骤后终止

  • 其中的每一条指令必须:

    • 有明确的目标,不可以有歧义
    • 在计算机能处理的范围之内
    • 算法描述应该抽象,不依赖与任何一种计算机语言,以及具体的实现手段

二、什么是好的算法

1. 空间复杂度 S(n) :程序在执行时占用存储单元的长度

  • 占用存储单元的长度,与输入数据的规模有关
  • 空间复杂度过高的算法可能导致使用的内存超限,从而造成程序的中断

2. 时间复杂度 T(n) :程序在执行时耗费时间的长度

  • 耗费时间的长度与输入数据的规模有关
  • 时间复杂度过高的低效算法可能导致在规定时间内等不到运行结果

3. 在分析一般算法的效率时,一般关注下面两种复杂度

  • 最坏情况复杂度 Tworst(n):一般通过该标准比较算法间的优劣
  • 平均复杂度 Tavg(n)
  • Tavg(n) <= Tworst(n)

三、复杂度的渐进表示法

1. 复杂度的渐进表示

  • 在上图中,我们可以看出,f(n)T(n)的某种上界,g(n)T(n)的某种下界
  • 为了保证能够准确地、有意义地分析算法,一般选取上界中最大的、下界中最小的

2. 复杂度分析小窍门

  • 若两段算法分别有复杂度T1(n) = O(f1(n))T2(n) = O(f2(n)),则

    • T1(n) + T2(n) = max(O(f1(n)), o(f2(n)))
    • T1(n) x T2(n) = O(f1(n) x f2(n))
  • T(n)是关于nk阶多项式,则T(n) = θ(n^k)

    • 考虑最高阶的一项即可,可以忽略其他的项
  • 一个 for 循环的时间复杂度 = 循环次数 x 循环体代码的复杂度

  • if-else 结构的复杂度 = 在各种分情况下的复杂度中最大的复杂度


1.3 应用实例:求连续最大子列和问题

  • 题目:给定N个整数的序列 {A1,A2,...,AN}\{ A_1, A_2, ... , A_N \}{A1​,A2​,...,AN​},求函数 f(i,j)=max{0,∑k=ij}f(i, j) = max\{0, \sum_{k=i}^j\}f(i,j)=max{0,∑k=ij​} 的最大值

  • 注意:再计算子列和的过程中,参与计算的元素必须前后相邻。

算法1:

/** 输入:int    A[]     整数序列* 输出:int     N       整数序列中元素的个数*/
int MaxSubseqSum1 (int A[], int N) {int ThisSum, MaxSum = 0;int i, j, k;/* 遍历所有子列和 */for (i=0; i<N; i++) { /* i是子列左端位置。此行选定i */for (j=i; j<N; j++) { /* j是子列右端位置。此行选定j */ThisSum = 0; /* ThisSum是从A[i]到A[j]的子列和 */for (k=i; k<=j; k++) { /* A[k]的起点是A[i], 终点是A[j] */ThisSum += A[k]; /* 前面选定了i和j, 接下来计算出这一段子列和 */}if (ThisSum > MaxSum) { /* 如果刚得到的这个子列和更大 */MaxSum = ThisSum;   /* 则更新结果 */}} /* j循环结束 */} /* i循环结束 */return MaxSum;
}
  • 算法1复杂度:T(N)=O(N3)T(N)=O(N^3)T(N)=O(N3)
    有三层循环,每一层循环的循环变量都会取到最大值N

算法2:

int MaxSubseqSum2 (int A[], int N) {int ThisSum, MaxSum = 0;int i, j;for (i=0; i<N; i++) { /* i是子列左端位置。此行选定i */ThisSum = 0; /* ThisSum是从A[i]到A[j]的子列和 */for (j=i; j<N; j++) { /* j是子列右端位置。此行选定j */ThisSum += A[j]; /* i相同,j不同时,只要在j-1次循环的基础上累加一项即可 */if (ThisSum > MaxSum) { /* 如果刚得到的这个子列和更大 */MaxSum = ThisSum;  /* 则更新结果 */}} /* j循环结束 */} /* i循环结束 */return MaxSum;
}
  • 算法2复杂度:T(N)=O(N2)T(N) = O(N^2)T(N)=O(N2)
    只有两层循环,每层循环的循环变量最大取N

算法3:运用 “分而治之” 思想,采取递归的方法

static int MaxSubSum (const int A[], int Left, int Right) {int MaxLeftSum, MaxRightSum;int MaxLeftBorderSum, MaxRightBorderSum;int LeftBorderSum, RightBorderSum;int Center, i;if (Left == Right) {if (A[Left] > 0) {return A[Left];} else {return 0;}}
}
  • 算法3复杂度:
    整体复杂度为T(N)=2T(N/2)+cNT(N)=2T(N/2)+cNT(N)=2T(N/2)+cN,且T(1)=O(1)T(1)=O(1)T(1)=O(1)
    递推式子(展开等号右边的T(.)T(.)T(.)项),最终,T(N)=2kO(1)+ckNT(N)=2^kO(1)+ckNT(N)=2kO(1)+ckN,其中,N/2k=1N/2^k=1N/2k=1
    进一步化简得,T(N)=O(N⋅logN)T(N)=O(N·logN)T(N)=O(N⋅logN)
  • 算法3算法抽象化
    表1
    左部分1 左部分2 右部分1 右部分2
    4 -3 5 -2 -1 2 6 -2

在左部分1中,从右往左,第一步取-3,第二步取4-3=1,取最大值得1。左部分2,从左往右,第一步取5,第二步取5-2=3,取最大值得5;同理,右部分1从右往左、右部分2从左往右执行相应操作。最终得到如下表所示的第一轮子列和。

表2
左部分1 左部分2 右部分1 右部分2
1 5 2 6

左部分在1,5,1+5=6中取最大值,得6;右部分在2,6,2+6=8中取最大值,得8,得到如下表所示的第二轮子列和

表3
左部分 右部分
6 8

如下表所示

表4
左部分 右部分
4 -3 5 -2 -1 2 6 -2

左部分从右往左依次相加,最大值为-2+5+(-3)+4=4。右部分从左往右依次相加,最大值为-1+2+6=7。这就是第三轮子列和;在4,7,4+7=11中,得到第四轮子列和

四轮子列和中,11最大,所以,最终结果为11

算法4:在线处理算法

  • “在线”指,每输入一个数据就进行即时的处理,在任何地方种植输入,算法都能正确地给出当前的解。
int MaxSubseqSum4(int A[], int N) {int ThisNum, MaxSum;int i;ThisSum = MaxSum = 0;for (i = 0; i < N; i++) {ThisSum += A[i];    // 正常向右累加if (ThisSum > MaxSum) {MaxSUm = ThisSUm;   // 再累加过程中,若发现更大子列和,则更新当前结果} else if (ThisSum < 0) { // 若当前子列和为负数ThisSum = 0;  // 则此时不可能使后面的部分和增大,抛弃现在的子列和,从0再开始计算子列和}}return MaxSum;
}
  • 算法4复杂度:T(N)=O(N)T(N)=O(N)T(N)=O(N)
    整个函数只有一个for循环,每次循环中的if结构都是常数数量级的复杂度,故该算法的复杂度是线性的。

数据结构与算法 第一章 引入相关推荐

  1. 数据结构与算法 --- 第一章 绪论

    数据结构与算法 第一章 绪论 1. 作者的话 2. 为什么要学习数据结构与算法 3. 数据结构与算法的作用 4. 数据结构的概念 4.1 名词解读 4.2 什么是数据 4.3 数据结构 4.4 逻辑结 ...

  2. PTA数据结构与算法-第一章——褚论

    文章目录 第一章--褚论 第二章--线性表 第三章--栈与队列 第四章--字符串 第五章--树与二叉树 第六章--图 第七章--排序 第八章--检索 判断题 单选题 程序填空题 第一章--褚论 第二章 ...

  3. 数据结构和算法 第一章 综述(1)

    数据结构和算法能起到什么作用 数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.数据结构包括数组,链表,栈,二叉树,哈希表等等.算法对这些结构中的数据进行各种处理,例如,查找一条特殊的数据项 ...

  4. 数据结构与算法——第一章——绪论

    1.2数据结构的概念 1.2.1基本概念和术语 1.数据 是信息的载体,是所有能够被计算机识别.存储和加工处理的符号的总称. 是计算机程序加工的原料. 可以是数值数据(整数.实数.复数),也可以是非数 ...

  5. 清华大学-邓俊辉MOOC数据结构与算法-第一章

    第一节 1.计算 对象:规律.技巧 目标:高效.低耗 例子 绳索计算机及其算法 尺规计算机及其算法 总结 计算 = 信息处理 计算模型 = 计算机 = 信息处理工具 算法,即在特定计算模型下,旨在解决 ...

  6. 【数据结构总结】第一章:数据结构基本概念

    [数据结构总结]第一章:数据结构基本概念 本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读 ...

  7. 数据结构和算法 | 第一部分第二课:小鸭子们去旅行

    作者 谢恩铭,公众号「程序员联盟」. 转载请注明出处. 原文:https://www.jianshu.com/p/31d14bd080d4 内容简介 引出算法复杂度的故事 两种算法 两种算法的对比 第 ...

  8. 数据结构和算法 | 第一部分第一课:什么是数据结构和算法

    作者 谢恩铭,公众号「程序员联盟」. 转载请注明出处. 原文:https://www.jianshu.com/p/b2f23799a5bb 内容简介 前言 什么是算法 算法无处不在 计算机的" ...

  9. 斗地主AI算法——第一章の业务逻辑

    转眼间快到了五月,帝都的天气也变的非常梦幻. 时而酷暑炎热,时而狂风席卷. 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华. 世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂 ...

  10. 数据结构与算法--第一个只出现一次的字符

    第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符,比如输入"wersdfxvsdfwer",则输出x. 方法一: 还是老规矩,初始想法是从头遍历每一个字符,每遍历 ...

最新文章

  1. 从一个点云里面创建一个深度图
  2. SIP Servlet开发环境配置
  3. 如何写好一份专利交底书?
  4. HTML5+JS调用摄像头
  5. CCNA学习指南 TCP/IP
  6. 单片机的现状即发展前景
  7. 一天搞懂深度学习—学习笔记1
  8. chrome redhat 下载源_RedHat 7.0 Chrome浏览器 安装
  9. EasyClick Html UI 第十四节 CSS 盒子模型
  10. SNMP中的MIB是什么?
  11. RDIFramework.NET ━ 9.10 岗位(职位)管理 ━ Web部分
  12. mysql答题系统android_Android答题APP的设计与实现
  13. 非零段划分(python)
  14. 一文看懂AutoML
  15. 读书笔记-《领导力21法则》
  16. 云服务上搭建halo博客
  17. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件
  18. 计算机与linux基础
  19. 物理隔离网闸——入门篇(2)
  20. 1-给出n阶方阵里所有数,求方阵里所有数的和(华为机试)

热门文章

  1. 搭建Open××× Server路由模式、证书认证
  2. Form的显式方式。
  3. 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载
  4. Set集合HashSet,TreeSet
  5. 2.冒泡排序----还是不懂,先记录下来
  6. 我的Python之路:浏览器模拟
  7. iOS上线后程序崩溃日志处理-- Crashlytics
  8. 国内10大广告联盟各自有哪些优势?
  9. C# SendMessage 全集
  10. python开发之路---第二模块--OS模块