数据结构导论(概论)

数据结构

------数据结构使计算机组织数据存储数据的方式。

------是指一组相互之间存在一种或多种特定关系的数据的组织方式和他们在计算机内的存储方式,以及定义在该组数据上的一组操作。

计算机解决一个具体问题的步骤:

1)从具体问题抽象出一个数学模型;

2)设计一个求解该数学模型的算法;

3)用某种计算机语言编写实现该算法的程序,调试运行解答问题。

计算机解决问题就是一个数据到逻辑再存储的一个过程,期间涉及到的内容有:原始数据、逻辑结构(算法)、存储结构(编程)。如下图:

基本概念

数据——被计算机存储、处理的对象。数据的含义非常广,例如,利用迭代法求方程根的程序处理对象为实数,语音采集程序处理的对象为声音。

数据元素(元素)——数据的基本单位,在程序中作为一个整体考虑和处理。是运算的基本单位,具有完整确定的实际意义。

数据项——数据元素由数据项组成。在数据库中数据项又称字段或域,是数据不可分割的最小标识符。

数据的逻辑结构——数据元素之间的逻辑关系(逻辑关系是数据元素之间的关联方式或“邻接关系”)。

基本逻辑结构

四类基本逻辑结构示意图
集合 线性结构 树形结构 图结构
任意两结点间没有邻接关系,形式松散。 依次排列队形成一条“链”,结点依次相邻接。 有分支、层次分明,上层结点可以和多个下层结点相邻接,反则不行。 最复杂,任何两个结点都可相邻接。

数据的存储结构

1)存储数据元素;

2)数据元素之间的关联方式。

      ------顺序存储方式:结点在一个连续的存储区里。

      ------链式存储方式:每个存储结点除了含有一个数据元素外,还包括指针,每个指针指向一个与本结点有逻辑关系的结点,指针表示数据元素之间的逻辑关系。

算法

1、函数描述形式

函数类型 函数名 (函数参数表)
    //算法说明
    {
    语句序列
    }

2、输入、输出语句

输入语句:

scanf(格式串,变量1,...,变量n);

输出语句:

printf(格式串,变量1,...,变量n);

3、选择语句

条件语句:

if(表达式)语句;

if(表达式)语句;
else 语句;

分支语句:

switch
{
    case1:语句序列;break;
    case2:语句序列;break;
    ...
    casen:语句序列;break;
    default:语句序列;//可省略
}

4、循环语句

for(赋初值表达式序列;条件;修改表达式序列)语句;

while(条件)语句;
do
{
    语句;
    
}while(条件);

算法分析

1)时间复杂度T(n)

问题:编制函数求1!+2!+.......+n!  算法如下:

int fact1(int n)
{    int i, j,temp,s;
    s=0;
    for(i=1;j<=i;j++)
    {    temp=1;
        for(j=1;j<=i;j++)
        s=s+temp;
    }
    return s;
}
    

fact1算法中乘法操作执行次数1+2+3+....+n=\frac{n(n+1)}{2} ,它与n^{2}成正比。

fact1中乘法、加法和赋值 的次数记为T(n)=n(n+1)/n+n+n(n+1)/2+2n+1=n^{2}+4n+1O(n^{2})表示T(n)的近似值,算法的执行时间与n^{2}成正比。

fact1的时间复杂度T(n)=n^{2}+4n+1=O(n^{2}),当n充分大时,算法的执行时间与n成正比。

时间复杂度的阶数

2)空间复杂度

------该算法所消耗的存储空间(程序代码、输入数据、辅助变量所占的空间)

------S(n)=O(g(n))       , g(n)为问题规模n的函数。

问题:读入n=100个整数到一个数组中,写出该数组进行逆置算法,分析空间复杂度。

void f1(int a[],int n)
{    int i,temp;
    for(i=0;i<=n/2-1;i++)
    {
        temp=a[i];
        a[i]=a[n-1-i];
        a[n-1-i]=temp;
    }
}

f1中所需的 辅助变量 为2个整型变量 i 和 temp ,与问题规模无关,其空间复杂度为O(1)

猜你喜欢

转载自blog.csdn.net/horizon_junmowen/article/details/81141330
今日推荐