数据结构C语言 Part1 基本概念与引入

什么是数据结构呢?没有官方定义,不过数据结构+算法==程序。而很好的Data Structure(本学期以后简称DS)可以带来最优效率的算法。解决问题的效率,和数据的组织方式、空间的利用效率以及算法的巧妙程度有关。应该说,算法和数据结构都很重要。按学校的安排,我们先学DS再学Algorithm。我们先看几个例子引入一下:

例子一:写程序计算给定多项式在某一个给定的点的值:

介绍与一些知识储备:

#include <stdio.h>
#include <time.h>

//这个多项式是f(x)=a0+a1x+a2x^2+...+an*x^n

//我们用最直接的想法来计算:
double f1(int n,double a[],double x) //我们要尽可能避免浮点数和整型的四则运算
{
    int i;
    double p=a[0];  //a[i] represents the value of i(th) term in sequence
    for(i=1;i<=n;i++)
        p+=a[i-1]+x*p;
    return p;
}


//当n足够大了,我们看得出来这个计算量还是很大的,不如我们改进一下算法:
double f2(int n,double a[],double x)
{
    int i;
    double p=a[n];
    for(i=n;i>0;i--)
        p=a[i-1]+x*p;
    return p;
}

//这个思路是基于f(x)=a0+x(a1+x(...(an-1 + x(an))...))

/*接下来我们再介绍一下clock()这个函数,这个函数是捕捉从程序开始运行 到clock()被调用所消耗时间,这个时间单位时clock tick,即“时钟打点”。常数CLOCKS_PER_SEC代表机器时钟每秒走过的时钟打点数,即1000ms*/

clock_t start,stop; //clock_t 时clock()函数返回的变量类型
double duration; //记录被测函数的运行时间

int main()
{
    start=clock();
    function();               //这里代表一个抽象的函数模块,你懂我的意思吧
    stop=clock();
    duration =((double)(stop-start))/CLOCKS_PER_SEC; //计算function的运行时间
    exit(0);   //啊哈,题外话,exit是退出当前进程,return只是退出当前的函数
}

这里我们简化一下问题,就是求f(x)=x+2x^2+...+n*x^n在x=1.1处的值f(1.1),按顺序结构编写代码,如下:

我们再谈谈ADT--抽象数据类型:

一、数据类型:数据对象集与 数据集合相关联的操作集

二、抽象:描述数据类型的方法不依赖于具体实现,于存放数据的机器无关,与数据存储的物理结构无关,与实现操作的算法和编程语言无关。也就是说,我们只关注数据对象集和操作集是什么,而不关注其如何做到的实现机理。

你譬如说:矩阵,的抽象数据类型定义,我们可以给出如下的定义:

类型名称:矩阵(Matrix)

数据对象集:一个m×n的矩阵Am×n=(aij),其中i从1到m,j从1到n,由m*n哥三元组(a,i,j)构成,a代表这个位置元素的大小,i,j代表行号和列号。

操作集:对于任意矩阵...和整数...,有:

Matrix Create(int M,int N);//返回一个M*N的空矩阵

int GetMaxRow(Matrix A);//返回A的总行数

Matrix Add(Matrix A,Matrix B);//如果A,B可加,则返回他们的和矩阵,否则返回错误提示信息

...(etc)。

我们接下来看看算法,第一章都是很浅的东西,这个我们瞅瞅浙大的ppt就好。

可见,算法需要的时间规模是需要我们比较严格把控的,比如当基数比较大,我们就不推荐用选择排序,而用快速排序等更好的排序方式。

另外在分析复杂度的时候,别的我们不说了,if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大者。

接下来我们应用一下我们前面所学的知识,来解决一个最大子列和的问题,顺便提提分治法。

——————————————————————————————————————————今天先到这里,明天把这个水完了,接着水线性表。

猜你喜欢

转载自blog.csdn.net/qq_42229034/article/details/82953520