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

1什么是数据结构

1.1 引子

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

  1. 随便放;

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

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

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

  1. 循环实现;

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

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

  1. 利用 p+=(a[i]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) ;
- Tavg(n)
其中我们最关心

2.2 一些基本概念


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

  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. for 等于循环次数乘以

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

  5. O(n2)O(nlogn)

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

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

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

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

分而治之的代码:

#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,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 height)
{
    int i = 0,iMid = 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 c)
{
    int max = a;
    if(b > max) max = b;
    if(c > max) max = c;
    return max;
}

陈越《数据结构》第一讲 基本概念的更多相关文章

  1. swift篇第一期:简单的数据结构

    首先我们可以去使用Playground来编码,并且会实时的显示对应的编码信息,这样我们就不用每次都去运行程序来显示输出的东西了哦,也方便了我们对某些语句的验证,这个是比较赞的var与let前者为可变修饰符,后者为不可变从字面意思我们就可以很好的区分了常用的类型呢,跟其他语言基本相同啦,主要有几种:1.int类型2.Float,Double类型3.String类型4.Boolean类型当我们去声明一

  2. Swift 集合数据结构性能分析

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. Swift中的集合类数据结构

    在那种情况下,你将会需要一种基本的集合类数据结构。继续学习,你将会比较成熟的Cocoa数据结构与对应的纯Swift结构的性能。常见iOS数据结构iOS中三种最常用的数据结构是arrays,dictionaries和sets。除了在Swift和Objective-C中旧的Foundation框架中的数据结构,现在又有了新的仅支持Swift版本的数据结构与语言紧密结合在一起。Swift数组是同质的,意味着每一个Swift数组都只包含一种类型的对象。

  4. 11.Swift 中的类和结构体

    举例来说,以下情境中适合使用结构体:1.几何形状的大小,封装一个width属性和height属性,两者均为Double类型。这次就讲到这里,下次我们继续

  5. a place you can learn algorithms and data structures(算法和数据结构) in swift

    https://github.com/raywenderlich/swift-algorithm-club

  6. Swift3.0 类和结构体的选择

    结构体实例总是通过值传递,类实例总是通过引用传递先说说值类型和引用类型的区别值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝在Swift中,所有的结构体和枚举类型都是值类型。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体”Swift中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。Objective-C中Nsstring,NSArray和NSDictionary类型均以类的形式实现,而并非结构体。

  7. 【Swift】结构体和类

    Swift中结构体和类有很多共同点与结构体相比,类还有如下的附加功能:结构体和枚举是值类型值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。为了达到这个目的,Swift内建了两个恒等运算符:类和结构体的选择在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。Swift中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。

  8. 如何在Swift中创建打包数据结构?

    我正在将一个项目从Objective-C转换为Swift,我正在使用一个打包的结构来输入通过套接字发送的转换二进制消息:我不确定Swift中最好的方法是什么,我能得到的最接近的近似值是:翻译中丢失了两个重要的细节:没有保证整数类型的比特,并且没有结构打包.我不认为这可以在Swift中表达,但如果是这样,怎么样?

  9. swift – 后缀(来自:)和dropFirst(_ :)之间有什么区别吗?

    我突然想到在使用Swift中的子序列时,func后缀似乎与dropFirst(_:)完全相同只是重复一遍.所以:当然,对于一个长度为十的数组.我的意思是func后缀与“2”将与dropFirst(_:)与“8”相同,例如.同样upTo/through似乎与dropLast(_:)完全相同除了方便之外还有什么区别吗?(也许是在错误的条件,性能或?)我想知道,事实上,在Swift中是否只是通过调用另一个来实现?

  10. android – 如何正确删除保留的实例片段

    解决方法正如@Luksprog所建议的,以下方法有效.但是,它仍然无法解释为什么通过onDetach完成的先前清理不起作用.如果有人能解释为什么这个解决方案有效,而以前没有,我会非常感激.版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

随机推荐

  1. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  2. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  3. BZOJ 1895 &amp; POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

  4. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  5. 陈越《数据结构》第三讲 树上

    -这个集合可以为空;-若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。特殊二叉树二叉树的性质二叉树的存储结构顺序存储;链式存储在此处再次说一说:typedefstructPloyNode*polynomial;//这句有什么用呢?你可以用polyNode来代表整个结构体变量。

  6. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

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

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  8. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  9. 【数据结构】【C++STL】FIFO队列&amp;优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  10. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

返回
顶部