资深流水灯工程师

资深流水灯工程师

数据结构课程的起源

1968年高德纳教授开创了数据结构这门学科,同年,数据结构作为计算机科学的学位课程。

数据结构研究什么

        研究非数值计算类型的程序问题;

        研究数据之间的组织和操作方式;

        研究数据的逻辑结构和存储结构;

为什么要学习数据结构

        学习C语言或者C++只是学了一个语法,就像武侠片里面学武功不仅要学心法还要学招式,这个心法就对应语法,这个招式就要通过学习数据结构来提高。数据结构可以培养专业的程序设计思维,提高使用程序语言描述解决方案的能力。

数据结构与算法的关系

        数据结构是研究数据之间的关系,解决实际问题的还是算法。

        算法是在一定的数据结构基础上来完成的,数据结构与算法是相互交融的。

不下降序列问题

由n个数组成的数列,分别是:a[1]、a[2] 、a[3] ...... a[n],

若存在i1<i2<......<im满足a[i1]<=a[i2]<=......<=a[im],

则称为长度为m的不下降序列。

例如:3,18,7,14,10,12,23,41,16, 24

则:3,18,23,24是一个长度为4的不下降序列;

3、 7、 10 、12、 16、 24是一个当度为6 的不下降序列;

求:如何求最长不下降序列?如何求所有不下降序列?

学习数据结构需要具备的三大技术点:

C++面向对象技术

C++模板技术

C++异常处理技术

为什么有各种各样的程序存在,程序的本质是什么?

程序 = 数据结构 + 算法

程序是为了解决实际问题而存在的没从本质上而言,程序是解决问题的步骤的描述。

比如:怎样把大象放到冰箱里?

步骤:

1、打开冰箱门;

2、把大象放进去;

3、关上冰箱门。

对应的程序

Elephan* e = new Elephan;

Fridge* f = new Fridge;

f->open();

f->put(e);

f->close();

如何解决问题

首先确认问题的类型;

然后确认解决步骤;

解决问题的步骤也是有好差的区分的。

比如:求1到n之间的数累加和的三种算法

程序实例1:

#include <iostream>

using namespace std;

//方法1:使用两个for循环
long sum1(int n)
{
    long ret = 0;
    int* array = new int[n];

    //将数组填充进数组
    for(int i=0; i<n; i++)
    {
        array[i] = i + 1;
    }

    //数组元素累加
    for(int i=0; i<n; i++)
    {
        ret += array[i];
    }

    delete[] array;

    return ret;
}


//方法2:一个循环解决问题
long sum2(int n)
{
    long ret = 0;
    for(int i=1; i<=n; i++)
    {
        ret += i;
    }

    return ret;
}

//方法3:不用循环解决问题
long sum3(int n)
{
    long ret = 0;

    if(n>0)
    {
        ret = (1+n)*n/2;
    }
    else
    {
        ret = 0;
    }

    return ret;
}



int main()
{
    cout <<"sum1 = " << sum1(100) << endl;
    cout <<"sum2 = " << sum2(100) << endl;
    cout <<"sum3 = " << sum3(100) << endl;
    return 0;
}



int main()
{
    cout << sum1(100) << endl;
    return 0;
}

 显然3种方法都可以得出正确的结果,但是显然第三种方法的效率是最高的。好在哪里?

评价好程序的标准

用尽量少的时间解决问题;

用尽量少的步骤解决问题;

用尽量少的内存解决问题;

NASA用64K内存的代码就能实现探索外太空。

数据的概念

数据是程序的操作对象,用于描述客观事物,数据可以输入到计算机,可以被计算机程序处理。

数据元素:组成数据的基本单位

数据项:一个数据元素由若干数据项组成

数据对象:性质相同的数据元素的集合

struct Student //数据类型
{
    char* name;
    int age;
};

Student s; //数据元素

Student sArray[10]; //数据对象

s.name = "lili"; //数据项
s.age = 10;      //数据项

数据结构就是指数据对象中数据元素之间的关系。比如数组中,各元素之间存在固定的线性关系。

典型的数据结构

逻辑结构:

        集合结构:数据元素之间没有特定的关系,仅同属相同集合;

        线性关系:数据元素之间时一对一的关系;

        树形关系:数据元素之间存在一对多的层次关系;

        图形关系:数据元素之间时多对多的关系。

物理结构:

        顺序存储结构:将数据存储在地址连续的存储单元中;

        链式存储结构:将数据存储在任意的存储单元中,通过保存地址的方式找到相关联的数据元素。

算法是程序的灵魂

算法的特性:

        算法有输入:

        算法有输出:

        算法的有穷性:算法在有限的步骤会结束,不会无限循环

        算法的确定性:算法的每一步都有确定的含义

        算法的可行性:算法的每一步都是可行的

如何评价算法的好坏

如果两个算法都能满足功能性需求,在工程中怎么评判,怎么选择?

性价比是工程上最关注的。

事后统计法:比较不同算法对同一组输入数据的运行处理时间。

事前分析估算: 依据统计的方法对算法效率进行评估。

如何学习数据结构

1、从概念上形象的理解数据元素之间的关系

2、思考数据关系能解决什么问题;

3、思考基于这种关系能够产生哪些算法;

4、理解并熟悉最终的算法;

5、选择一种熟悉的语言编码实战。

10-09 16:00