陈越《数据结构》第一讲 基本概念


1什么是数据结构


1.1 引子

例子:如何在书架上摆放图书?

  1. 随便放;
  2. 按照书名的拼音字母顺序排放;
  3. 把书架划分成几块区域,每块区域指定摆放某种类别的图书;在每种类别内,按照书名的拼音字母顺序排放。

解 决 问 题 方 法 的 效 率 , 跟 数 据 的 组 织 方 式 有 关 。 \color{red}{解决问题方法的效率, 跟数据的组织方式有关。} 解决问题方法的效率,跟数据的组织方式有关。

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

  1. 循环实现;
  2. 递归实现。//数值从 10 到 1 0 6 10到10^6 10到106
    解 决 问 题 方 法 的 效 率 , 跟 空 间 的 利 用 效 率 有 关 。 \color{red}{解决问题方法的效率, 跟空间的利用效率有关。} 解决问题方法的效率,跟空间的利用效率有关。

例3:写程序计算给定多项式在给定点x处的值。

  1. 利用 p + = ( a [ i ] ∗ p o w ( x , i ) ) ; p += (a[i] * pow(x, i)); p+=(a[i]∗pow(x,i));进行计算;

  2. 秦九韶利用 p = a [ i − 1 ] + x ∗ p ; p = a[i-1] + x*p; p=a[i−1]+x∗p;进行计算;
    用 time.h中的常数CLK_TCK,clock_t start, stop;计算时间。
    解 决 问 题 方 法 的 效 率 , 跟 算 法 的 巧 妙 程 度 有 关 。 \color{red}{解决问题方法的效率, 跟算法的巧妙程度有关。} 解决问题方法的效率,跟算法的巧妙程度有关。

即:解决问题方法的效率,跟数据的组织方式、跟空间的利用效率和跟算法的巧妙程度有关。

数据结构是:

  1. 数 据 对 象 \color{red}{数据对象} 数据对象 在计算机中的组织方式(逻辑结构、物理存储结构);
    2.数据对象必定与一系列加在其上的 操 作 \color{red}{操作} 操作相关联;
    3.完成这些操作所用的方法就是 算 法 \color{red}{算法} 算法。

1.2 抽象数据类型

数据结构

  • 数据对象在计算机中的组织方式(逻辑结构、物理存储结构);
  • 数据对象操作的关联关系;
  • 数据对象的最高效算法。

抽象数据类型

数据类型

  • 数据对象集;
  • 数据集合相关联的操作集。

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

  • 与存放数据的机器无关;
  • 与数据存储的物理结构无关;
  • 与实现操作的算法和编程语言均无关。

2. 什么是算法

算 法 ( A l g o r i t h m ) \color{red}{算法(Algorithm )} 算法(Algorithm)定义:

  1. 一个有限指令集;
  2. 接受一些输入(有些情况下不需要输入);
  3. 产生输出(必须);
  4. 一定在有限步骤之后终止;
  5. 每一条指令必须:
    • 有充分明确的目标,不可以有歧义;
    • 计算机能处理的范围之内;
    • 描述应不依赖于任何一种计算机语言以及具体的实现手段。

2.1什么是好的算法?

  • 空 间 复 杂 度 S ( n ) \color{red}{空间复杂度S(n)} 空间复杂度S(n) 占用存储单元的长度。
  • 时 间 复 杂 度 T ( n ) \color{red}{时间复杂度T(n)} 时间复杂度T(n) 耗费时间的长度。

在例3中,第一种方法的时间复杂度是 T ( n ) = C 1 n 2 + C 2 n T(n) = C_1n^2+C_2n T(n)=C1​n2+C2​n;秦九韶的时间复杂度是 T ( n ) = C . n T(n) =C.n T(n)=C.n。

在分析一般算法的效率时,我们经常关注下面两种复杂度:

  • 最 坏 情 况 复 杂 度 \color{red}{最坏情况复杂度} 最坏情况复杂度 T w o r s t ( n ) T_{worst}( n ) Tworst​(n);
  • 平 均 复 杂 度 \color{red}{平均复杂度} 平均复杂度 T a v g ( n ) T_{avg}( n ) Tavg​(n)。
    其中我们最关心 最 坏 情 况 复 杂 度 \color{red}{最坏情况复杂度} 最坏情况复杂度。

2.2 一些基本概念


复 杂 度 的 渐 进 表 示 法 \color{red}{复杂度的渐进表示法} 复杂度的渐进表示法

  • 上界: T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n));
  • 下界: T ( n ) = Ω ( g ( n ) ) T(n) = Ω(g(n)) T(n)=Ω(g(n));
  • 上下界等价: T ( n ) = Θ ( h ( n ) ) ; Θ ( h ( n ) ) = O ( f ( n ) ) , Θ ( h ( n ) ) = Ω ( g ( n ) ) T(n) = Θ(h(n));Θ(h(n))=O(f(n)),Θ(h(n))=Ω(g(n)) T(n)=Θ(h(n));Θ(h(n))=O(f(n)),Θ(h(n))=Ω(g(n))。
    我 们 写 O ( f ( n ) ) 时 , 是 写 最 小 上 界 , 写 Ω ( g ( n ) 时 , 是 写 最 大 下 界 , 这 样 才 有 意 义 。 \color{red}{我们写{O(f(n))}时,是写最小上界,写Ω(g(n)时,是写最大下界,这样才有意义。} 我们写O(f(n))时,是写最小上界,写Ω(g(n)时,是写最大下界,这样才有意义。

复 杂 度 的 渐 进 表 示 法 \color{red}{复杂度的渐进表示法} 复杂度的渐进表示法

  1. 若两段算法分别有复杂度 T 1 ( n ) = O ( f 1 ( n ) ) T_1(n) = O(f_1(n)) T1​(n)=O(f1​(n))和 T 2 ( n ) = O ( f 2 ( n ) ) T_2(n) =O(f_2(n)) T2​(n)=O(f2​(n)),则:
  • T 1 ( n ) + T 2 ( n ) = m a x ( O ( f 1 ( n ) ) , O ( f 2 ( n ) ) ) T_1(n)+T_2(n)=max( O(f_1(n)),O(f_2(n))) T1​(n)+T2​(n)=max(O(f1​(n)),O(f2​(n)));
  • T 1 ( n ) ∗ T 2 ( n ) = O ( f 1 ( n ) ∗ f 2 ( n ) ) 。 T_1(n) * T_2(n) = O( f_1(n) * f_2(n) )。 T1​(n)∗T2​(n)=O(f1​(n)∗f2​(n))。
  1. 若 T ( n ) T(n) T(n)是关于 n 的 k 阶 多 项 式 \color{red}{n的k阶多项式} n的k阶多项式,那么起作用的是最大项,即 T ( n ) = Θ ( n k ) ; \color{red}{T(n)=Θ(n^k);} T(n)=Θ(nk);

  2. 一 个 f o r 循 环 的 时 间 复 杂 度 \color{red}{一个for循环的时间复杂度} 一个for循环的时间复杂度等于 循 环 次 数 \color{red}{循环次数} 循环次数乘以 循 环 体 代 码 的 复 杂 度 ; \color{red}{循环体代码的复杂度;} 循环体代码的复杂度;

  3. i f − e l s e 结 构 \color{red}{if-else 结构} if−else结构的复杂度取决于if的条件判断复杂度和两个分枝部分的复杂度, 总 体 复 杂 度 取 三 者 中 最 大 ; \color{red}{总体复杂度取三者中最大;} 总体复杂度取三者中最大;

  4. O ( n 2 ) 复 杂 度 的 算 法 本 能 的 优 化 为 O ( n l o g n ) 。 \color{red}{O(n^2)复杂度的算法本能的优化为O(n log n)。} O(n2)复杂度的算法本能的优化为O(nlogn)。


3.应用实例:最大子列和问题


应用实例:最大子列和问题

01 - 复杂度1 最大子列和问题(20分)
例如给定序列 { − 2 , 11 , − 4 , 13 , − 5 , − 2 } \{ -2, 11, -4, 13, -5, -2 \} {−2,11,−4,13,−5,−2},其连续子列 { 11 , − 4 , 13 } \{ 11, -4, 13 \} {11,−4,13}有最大的和 20 20 20。现要求你编写程序,计算给定整数序列的最大子列和。

  • 本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

    • 数据1:与样例等价,测试基本正确性;
    • 数据2: 1 0 2 10^2 102个随机整数;
    • 数据3: 1 0 3 10^3 103个随机整数;
    • 数据4: 1 0 4 10^4 104个随机整数;
    • 数据5: 1 0 5 10^5 105个随机整数;
  • 输入格式 :
    输入第1行给出正整数K(≤100000);第2行给出K个整数,其间以空格分隔。
  • 输出格式 :
    在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
  • 输入样例 :

    6
    -2 11 -4 13 -5 -2

  • 输出样例 :

    20

解 决 方 法 : \color{red}{解决方法}: 解决方法:

  1. 时间复杂度为 T ( N ) = O ( N 3 ) T( N ) = O( N^3 ) T(N)=O(N3);
  2. 时间复杂度为 T ( N ) = O ( N 2 ) T( N ) = O( N^2 ) T(N)=O(N2);
  3. 时间复杂度为 T ( N ) = O ( N l o g N ) T( N ) = O( N logN ) T(N)=O(NlogN);(分而治之)
  4. 时间复杂度为 T ( N ) = O ( N ) T( N ) = O( N ) T(N)=O(N)。(在线处理)

时间复杂度为 T ( N ) = O ( N 2 ) T( N ) = O( N^2 ) T(N)=O(N2)的代码:

#include<stdio.h>
#include<iostream>#define MAXN 100000
int arr[MAXN];int MaxSubseqSum(int A[], int N);int main()
{int i, n;scanf("%d",&n);for (i = 0; i < n; i++)scanf("%d",&arr[i]);printf("%d\n",MaxSubseqSum(arr,n));system("pause");return 0;
}int MaxSubseqSum(int A[], int N)
{int ThisSum, MaxSum = 0;int i, j;for (i = 0; i < N; i++){ThisSum = 0;for (j = i; j < N; j++){ThisSum = ThisSum + A[j];if (ThisSum > MaxSum)MaxSum = ThisSum;}      }return MaxSum;
}

分而治之的代码:

#include<stdio.h>
#include<iostream>
#define MAXN 100000
int arr[MAXN + 10];int maxThree(int a,int b,int c);
int maxSubSeq(int arr[],int low,int height);
int maxSubSeq1(int arr[],int n);
int main()
{int i, n;scanf("%d", &n);for(i = 0; i < n; i++)scanf("%d", &arr[i]); printf("%d\n", maxSubSeq(arr, 0, n-1));system("pause");return 0;
}
int maxSubSeq1(int arr[],int n)
{int i = 0, iThisSum = 0, iMaxSum = 0;for(i = 0; i < n; i++){iThisSum += arr[i];if(iThisSum > iMaxSum) iMaxSum = iThisSum;else if(iThisSum < 0) iThisSum = 0;}return iMaxSum;
}
int maxSubSeq(int arr[], int low, int height)
{int i = 0, iMid = 0, iThisSum = 0, iLeftMax = 0, iRightMax = 0, iLeftMaxSum = 0, iRightMaxSum = 0;if(low >= height) return arr[low];iMid = (low + height)/2;iLeftMax = maxSubSeq(arr,low,iMid);//左边最大iRightMax = maxSubSeq(arr,(iMid+1),height);//右边最大//中间(跨越)最大iThisSum = iLeftMaxSum = 0;for(i = iMid ; i >low ; i-- ){iThisSum += arr[i];if(iThisSum > iLeftMaxSum) iLeftMaxSum = iThisSum;}iThisSum = iRightMaxSum = 0;for(i = iMid ; i <height ; i++){iThisSum += arr[i];if(iThisSum > iRightMaxSum) iRightMaxSum = iThisSum;}return maxThree(iLeftMax , iRightMax, (iRightMaxSum + iLeftMaxSum));}
int maxThree(int a,int b,int c)
{int max = a;if(b > max) max = b;if(c > max) max = c;return max;
}

陈越《数据结构》第一讲 基本概念相关推荐

  1. 数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)

    目录 第一讲 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 - 例:图书摆放 1.1.2 关于空间使用 - 例:PrintN函数实现 1.1.3 关于算法效率 - 例:计算多项式值 计算 ...

  2. 陈越 数据结构第一节

    第一章 基本概念 1.1什么是数据结构 --解决问题方法的效率跟数据的组织方式.空间的利用效率.算法的巧妙程度有关. --数据结构:数据对象在计算机中的组织方式.(1)逻辑结构(个人存放数据的方式,如 ...

  3. [数据结构] 第一讲 基本概念

    目录 一.概念 二.分类 一.概念 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符合集合. 数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常 ...

  4. 陈越、何钦铭《数据结构》第一讲基本概念 笔记

    <数据结构>第一讲基本概念  1.1什么是数据结构 1.1.1关于数据组织-例:图书摆放 "数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系.这些联系 ...

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

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

  6. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  7. 并行算法第一讲:概念及目标

    文章目录 第一讲:概念及目标 并行算法的意义 提高性能的主要手段 现状 并行计算分类 并行计算互联网络 并行计算存储组织 Brent定理(work-time) PRAM上并行求和算法 并行算法设计与分 ...

  8. 大话西游之王道考研数据结构第一讲---线性表的顺序表示

    大话西游之王道考研数据结构第一讲---线性表的顺序表示 写在前面的话 王道考研数据结构是一本非常好的书,本系列所有的内容是按照其书进行讲述的,所以您可以以那本书作为主要内容,这个做参考. 大学时候,在 ...

  9. C语言数据结构-第一讲-数据结构基础概念-电大

    第一讲数据结构基础概念内容简介 数据是表征客观事物的可记录可识别的符号集合.数据是信息处理的核心基础. 本讲主要介绍了与数据结构有关的基本概念术语: l       数据 l       数据元素 l ...

最新文章

  1. C#获取文件的当前路径
  2. USB入门系列之二:USB的连接模型
  3. 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
  4. 文巾解题 1035. 不相交的线
  5. VC++的应用程序框架中各类之间的访问方法
  6. what if you can not achieve them on a list
  7. 浅谈JavaScript中的事件
  8. android jni 回调 java_android linux线程通过JNI回调java函数 | 学步园
  9. 【faster-rcnn】训练自己的数据集时的坑
  10. hadoop学习——Hadoop核心组件
  11. c++ 异常处理(3)
  12. java编写一个个人通信录程序
  13. 卷积神经网络及其特征图可视化
  14. 虚拟机利用Host-only实现在不插网线的情况下,虚拟机与主机实现双向通信,实现ssh连接以及samba服务实现共享...
  15. 白嫖党进,全网最详细的信息安全术语合集终于来了
  16. 动手实现图像双线性插值——实现图像resize
  17. 【YOLOV5-5.x 源码解读】yolo.py
  18. c语言1000万位圆周率,如何设计C语言程序输出圆周率小数点后的1000位?请大侠出手啊。...
  19. iOS开发细碎知识点总结二
  20. Proximity sensor---Px318J

热门文章

  1. android米聊手写和涂鸦源码,Android访米聊手写和涂鸦源码
  2. java library jna_Java JNA 调用dll库
  3. vivo Z1青春版全面评测:Z系列的继承者,展示全新千元态度
  4. Linux C 语言日期时间函数总结
  5. OpenGL基础知识梳理——Windows上搭建opengles运行环境
  6. vue项目中的 env文件从何而来?什么是 process.env
  7. 【MFC】使用CMemDC解决图像显示闪烁问题
  8. 运用python工具画图
  9. ubuntu更新源(默认美国改为中国)
  10. 意外发现迅雷可以自动下载linux对应链接的文件