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

前端之家收集整理的这篇文章主要介绍了陈越《数据结构》第一讲 基本概念前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


1什么是数据结构


1.1 引子

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

  1. 随便放;

  2. 按照书名的拼音字母顺序排放;

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

@H_404_164@

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

  1. 循环实现;

  2. 递归实现。//数值从 10106

@H_777_403@@H_125_404@

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

  1. 利用 p+=(a[i@H_244_502@]pow(x,i)); 进行计算;

  2. 秦九韶利用 p=a[i1]+xp; 进行计算;

用 time.h中的常数CLK_TCK,clock_t start,stop;计算时间。

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

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


1.2 抽象数据类型


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

抽象数据类型

数据类型
- 数据对象集;
- 数据集合相关联的操作集。

抽象(描述数据类型的方法不依赖于具体实现)
- 与存放数据的机器无关;
- 与数据存储的物理结构无关;
- 与实现操作的算法和编程语言均无关。


2. 什么是算法

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

2.1什么是好的算法?


  • S(n) 占用存储单元的长度。
  • T(n) 耗费时间的长度。

在例3中,第一种方法的时间复杂度是 T(n)=C1n2+C2n ;秦九韶的时间复杂度是 T(n)=C.n

在分析一般算法的效率时,我们经常关注下面
两种复杂度:
- Tworst(n) ;
- @H_285_1502@ Tavg(n)
其中我们最关心

2.2 一些基本概念



- T(n)=O(f(n)) 上界;
- T(n)=Ω(g(n)) 下界;
- T(n)=Θ(h(n));Θ(h(@H_404_1951@n))=O(f(n))Θ(h(n))=Ω(g(n))
O(f(n))Ω(g(n)@H_404_2264@

  1. 若两段算法分别有复杂度 T1(n)=O(f1(n)) T2(n)=O(f2(n)) ,则:
    - T1(n)+T2(n)=max(O(f1(n)),O(f2(n))) ;
    - T1(n)T2(n)=O(f1(n)f2(n))

  2. 若T(n)是关于 nk ,那么 T(n)=Θ(nk);

  3. @H_156_3012@@H_102_3013@@H_277_3014@for @H_404_3104@\color{red}{一个for循环的时间复杂度}等于循环次数乘以

  4. if@H_301_3232@else 的复杂度取决于if的条件判断复杂度和两个分枝部分的复杂度,

  5. @H_573_3403@@H_850_3404@O(n2)@H_444_3502@O(nlogn)


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


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

  1. //01 - 复杂度1 最大子列和问题(20分)
  2. //例如给定序列{ -2,11,-4,13,-5,-2 },其连续子列{ 11,13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
  3. //
  4. //本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:
  5. //
  6. //数据1:与样例等价,测试基本正确性;
  7. //数据2:10^2个随机整数;
  8. //数据3:10^3个随机整数;
  9. //数据4:10^4个随机整数;
  10. //数据5:10^5个随机整数;
  11. //输入格式 :
  12. //
  13. //输入第1行给出正整数KK(\le 100000≤100000);第2行给出KK个整数,其间以空格分隔。
  14. //
  15. //输出格式 :
  16. //
  17. //在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
  18. //
  19. //输入样例 :
  20. //
  21. //6
  22. //- 2 11 - 4 13 - 5 - 2
  23. //输出样例 :
  24. //
  25. // 20

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

分而治之的代码

  1. #include<stdio.h>
  2. #include<iostream>
  3. #define MAXN 100000
  4. int arr[MAXN + 10];
  5.  
  6. int maxThree(int a,int b,int c);
  7. int maxSubSeq(int arr[],int low,int height);
  8. int maxSubSeq1(int arr[],int n);
  9. int main()
  10. {
  11. int i,n;
  12.  
  13. scanf("%d",&n);
  14. for(i = 0; i < n; i++)
  15. scanf("%d",&arr[i]);
  16. printf("%d\n",maxSubSeq(arr,n-1));
  17. system("pause");
  18. return 0;
  19. }
  20. int maxSubSeq1(int arr[],int n)
  21. {
  22. int i = 0,iThisSum = 0,iMaxSum = 0;
  23. for(i = 0; i < n; i++)
  24. {
  25. iThisSum += arr[i];
  26. if(iThisSum > iMaxSum) iMaxSum = iThisSum;
  27. else if(iThisSum < 0) iThisSum = 0;
  28. }
  29. return iMaxSum;
  30. }
  31. int maxSubSeq(int arr[],int height)
  32. {
  33. int i = 0,iMid = 0,iLeftMax = 0,iRightMax = 0,iLeftMaxSum = 0,iRightMaxSum = 0;
  34. if(low >= height) return arr[low];
  35. iMid = (low + height)/2;
  36. iLeftMax = maxSubSeq(arr,low,iMid);@H_552_4041@//左边最大
  37. iRightMax = maxSubSeq(arr,(iMid+1),height);@H_552_4041@//右边最大
  38. //中间(跨越)最大
  39. iThisSum = iLeftMaxSum = 0;
  40. for(i = iMid ; i >low ; i-- )
  41. {
  42. iThisSum += arr[i];
  43. if(iThisSum > iLeftMaxSum) iLeftMaxSum = iThisSum;
  44. }
  45. iThisSum = iRightMaxSum = 0;
  46. for(i = iMid ; i <height ; i++)
  47. {
  48. iThisSum += arr[i];
  49. if(iThisSum > iRightMaxSum) iRightMaxSum = iThisSum;
  50. }
  51.  
  52. return maxThree(iLeftMax,iRightMax,(iRightMaxSum + iLeftMaxSum));
  53.  
  54. }
  55. int maxThree(int a,int c)
  56. {
  57. int max = a;
  58. if(b > max) max = b;
  59. if(c > max) max = c;
  60. return max;
  61. }

猜你在找的数据结构相关文章