《数据结构》第1章 数据结构与算法分析概述(C语言描述)

2024-08-30 13:32

本文主要是介绍《数据结构》第1章 数据结构与算法分析概述(C语言描述),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.1数据结构概述

1.1.1 数据结构的含义

数据结构和算法是程序设计最重要的两个内容。

简单的说,数据结构是数据的组织,存储和运算的总和。它是信息的一种组织方式,是以数据按某种组织关系起来的一批数据,其目的是为了提高算法的效率,然后用一定的存储方式存储到计算机中,并且它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

在计算机处理的大量数据中,它们都是相互关联,彼此联系的。
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作,因此,主要有三个方面的内容,数据的逻辑结构,数据的物理结构,对数据的(或算法),通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

1.1.2数据结构的基本术语

1. 数据(Data)
数据即信息的载体,是对客观事物的符号表示,指能输入到计算机中并被计算机程序处理的符号的总称。如整数,实数,字符,文字,声音,图形,图像等都是数据。

2. 数据元素(Data Element)
数据元素是数据的基本单位,它在计算机处理和程序设计中通常作为独立个体考的对象。数据元素一般由一个或多个数据项组成,一个数据元素包含多个数据项时,常称为记录,结点等。数据项也称为域,字段,属性,表目,顶点。

3. 数据对象(Data Object)
数据对象是具有相同特征的数据元素的集合,是数据的一个子集。

4. 数据结构(Data Structure)
数据结构简称 DS,是数据元素组织形式,或数据元素相互之间存在一种或多种特定关系的集合。任何数据都不是彼此孤立的,通常把相关联的数据按照一定的逻辑关系组织起来,按照计算机语言的语法,语义的规定相应的存储结构或形式,并且为这些数据指定一组去处操作,这样就形成了一个数据结构。
数据结构通常有四类基本形式:集合形式,线性结构,树型结构,图形结构或网状结构。

5. 数据的逻辑结构(Logical Structure)
数据的路逻辑结构是指数据结构中数据元素之间的逻辑关系,它是从具体问题中抽象出来的数学模型。是独立于计算机存储器的(与具体的计算机无关)。

6. 数据的存储结构(PhysicalStructure)
数据的存储结构是数据的逻辑结构在计算机内存中的存储方式,又称物理结构。数据存储结构的实现要用计算机语言来实现,因而是依赖于具体的计算机语言。数据存储结构有顺序和链式两种不同的方式,诉特点是要数据元素在存储器的相对位置来体现数据元素相互间的逻辑关系。顺序存结构通常用高级编程语言中的 一维数组 来描述或实现。而链式存储结构则通常用链表来实现。

在有顺序存储结构的基础上,又可延伸变化出另外两种存储结构,即索引存储,和散列存储。
索引存储就是在数据文件的基础上增加了一个索引表文件。通过索引表建立索引,可以把一个顺序表分成几个顺序子表,其目的是在查询时查找效率,避免盲目查找。

散列存储就是通过数据元素与存储地址之间建立起某种映射关系,使每个数据元素与每一个存储地址之间尽量达到一一对应的目的。这样,查找时同样可以大大提高效率。

7. 数据类型(Data Type)
数据类型是一组具有相同性质的操作对象以及该组操作对象以及该组操作对象上的运算方法的集合。如整数类型,字符类型等。每一种数据类型都有自身特点的一组操作方法(即运算规则)。

8. 抽象数据类型(Abstract Data Type)
抽象数据类型是指一个数据模型以及在该模型上定义的一套运算规则的集合。在对抽象数据类型进行描述时,要考虑到完整性的广泛性,完整性就是要能体现所描述的抽象数据类型的全部特性,广泛性就是所定义的抽象数据类型适用的对象要广。在大型程序设计和系统软件开发中,对抽象数据类型用的较多。

1.2算法分析概述

提到算法,必须提到数据结构,我们要知道一个著名公式:

数据结构 + 算法 = 程序

我们先看看下面这张图:

这里写图片描述

图1

算法是什么?算法是一个有穷规则(或语句、指令)的有续集和。他确定了解决某一问题的一个运算序列,简单的说,就是解决某一问题的步骤描述。

1.2.1算法的特性

1)有穷性 ——算法执行的步骤(或规则)是有限的;
2)确定性 ——每个计算步骤无二义性;
3)可行性——每个计算步骤嫩巩固在有限的时间内完成;
4)输入——算法有一个或多个外部输入;
5)输出——算法有一个或多个输出;

1.2.2评价一个算法的好坏

1)消耗时间的多少;
2)消耗存储空间的多少;
3)算法的设计是否容易理解,是否容易编程实现,方便调试和维护;

1.2.3时间复杂度

时间复杂度的概念:
1)问题的规模:输入数据量的大小,用n来表示;
2)算法的时间复杂度:算法消耗时间,它是问题规模的函数 T ( n ) T (n) Tn

1.2.3.1语句的频度

语句的频度定义为可执行语句在算法(或程序)中重复执行的次数。若某语句执行一次的时间为 t t t ,执行次数为 f f f,则该语句所耗时间的估计为 t ∗ f t * f tf 。以下面程序为例,求两个N阶方阵乘积:

void MATRIXM(A,B,C)  
{  float A[n][n],B[n][n],C[n][n];  int i,j,k;                                                 // 语句频度  for(i = 0;i < n; i++)                                      //   n+1  for(j = 0;j < n;j++)                               //  n(n+1)  {  C[i][j] = 0;                                  //   n*n  for(k = 0; k < n;k++)                        //  n*n(n+1)  C[i][j] = c[i][j]+A[i][k]*B[k][j];     //   n*n*n  }  
}  
1.2.3.2算法的时间复杂度

算法的时间复杂度定义为算法中可执行语句的频度之和,记为T(n)。T(n) 是算法所需时间的一种估计,其中n为问题的规模(或大小、体积)。如上面的例子中,问题的规模n为矩阵的阶,该算法的时间复杂度为:

T ( n ) = ( n + 1 ) + n ( n + 1 ) + n ∗ n + n ∗ n ( n + 1 ) + n ∗ n ∗ n = 2 ∗ n ∗ n ∗ n + 3 ∗ n ∗ n + 2 ∗ n + 1 T(n) = (n+1)+n(n+1)+n*n+n*n(n+1)+n*n*n = 2*n*n*n + 3*n*n +2*n +1 T(n)=(n+1)+n(n+1)+nn+nn(n+1)+nnn=2nnn+3nn+2n+1

n n n趋于无穷大时, l i m ( T ( n ) / ( n ∗ n ∗ n ) = 2 lim(T(n)/(n*n*n) =2 lim(T(n)/(nnn)=2,故 T ( n ) T(n) T(n) n ∗ n ∗ n n*n*n nnn为同阶无穷大,或者说 T ( n ) T(n) T(n) n ∗ n ∗ n n*n*n nnn成正比、 T ( n ) T(n) T(n)的量级为 n ∗ n ∗ n n*n*n nnn,记为 T ( n ) = O ( n ∗ n ∗ n ) T(n) = O(n*n*n) T(n)=O(nnn);
问题规模 n n n的某个函数 f ( n ) f(n) f(n),

T ( n ) = O ( f ( n ) ) T(n) = O (f(n)) T(n)=O(f(n))
它表示岁问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。

这篇关于《数据结构》第1章 数据结构与算法分析概述(C语言描述)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120959

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整