《数据结构(C语言版)》学习——day1,初识数据结构

1. 什么是数据结构

一般而言,使用计算机解决一个具体的问题时,大致需要经过以下几个步骤:

① 从具体的问题中抽象出一个适当的数学模型;

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

③ 编写程序,进行测试、调整,直至得到最终的问题解答。

对实际问题建立数学模型的实质是:分析问题,并从中提取操作的对象,并找出这些对象间含有的关系,然后使用数学的语言加以描述。

数据结构(data structure)可以定义为:相互之间存在一种或多种特定关系的数据元素的集合。

在任何问题中,数据元素都不是孤立存在的,而是存在着某种相互牵连的关系,这种关系称为结构(structure)。根据关系特性的不同,通常有4种基本结构:

① 集合,数据元素之间除了同属一个集合外,别无其他关系;

② 线性结构,数据元素之间存在一对一的关系;

③ 树形结构,数据元素之间存在一对多的关系;

④ 图状结构或网络结构,数据元素之间存在多对多的关系。

数据结构的形式定义为:数据结构是一个二元组

Data Structure = (D,S)

其中,D是数据元素的有限集,S是D上关系的有限集。

2. 算法

算法是求解特定问题的一种分步骤描述,它是指令的有限序列,每一条指令对应一个或多个操作,算法具有以下5个重要特性:

① 有穷性,一个算法总是在执行有穷步后结束,且每一步可在有穷步内完成;

② 确定性,算法的每一条指令,必须具有确切的含义,不会产生二义性,在任何条件下,相同的输入只能得出相同的输出;

③ 可行性,算法中描述的操作都是可行的;

④ 输入,算法中存在0个或多个输入,这些输入取决于特定的对象集合;

⑤ 输出,算法存在1个或多个输出,这些输出是同输入有着某些特定关系的量。

算法设计,需要考虑以下目标:

① 正确性(correctness),算法应当满足具体问题的需求,要以指定的方式进行输入和输出;

② 可读性(readability),算法主要是为了供人阅读与交流的,其次是机器执行;

③ 健壮性(robustness),当输入数据非法时,算法也能适当地做出反应并进行进行处理,而不会出现莫名其妙的输出结果,或者崩溃;

④ 效率和低存储,效率指的是算法执行时间,存储需求指算法执行过程中所需最大存储空间。

算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量可以记作

T(n) = O(f(n))

它表示随问题规模n的增大,执行时间的增长率和f(n)的增长率相同,这就是算法的时间复杂度(time complexity)。

原文地址:http://blog.51cto.com/10741210/2105382

时间: 2024-08-07 13:30:33

《数据结构(C语言版)》学习——day1,初识数据结构的相关文章

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

《数据结构(C语言版)》学习——day2,线性表

1. 线性表定义 线性表是一种内部数据类型相同.数据个数有限的数据结构.线性表的长度指的是线性表中元素的个数,如果线性表的长度为0时,则称其为空表.在非空表中的每个数据元素都有一个确定的位置,其中i为数据元素ai的位序. 2. 线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元依次存储连续线性表的数据元素. 通常情况下,采用数组来描述数据结构中的顺序存储结构.但由于线性表的长度可变,且所需最大存储空间随问题不同而不同,因此在C语言中,可用动态分配的一维数组来进行描述. //-

深入浅出数据结构C语言版(5)——链表的操作

上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游标数组--我决定还是给它单独写个博文比较好~). 那么,我们的过程应该是怎么样的呢?首先当然是分析需要什么操作,然后再逐一思考该如何实现,最后再以代码的形式写出来. 不难发现,我们希望链表能支持的(基础,可以由此延伸)操作就是: 1.给出第n个元素 2.在第n个元素的后面插入一个元素(包含在最后一个

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

深入浅出数据结构C语言版(9)——多重表(广义表)

在深入浅出数据结构系列前面的文章中,我们一直在讨论的表其实是"线性表",其形式如下: 由a1,a2,a3,--a(n-1)个元素组成的序列,其中每一个元素ai(0<i<n)都是一个"原子","原子"的意思就是说元素本身是一个个体,所有元素都是相同的结构. 但是在我们常见的某些应用,比如Excel的表格中,我们发现表并不一定是线性表,Excel中的表就明显是二维的结构 那么在数据结构中,我们会使用这种广义上的表吗?答案是会,我们也会.或

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

严蔚敏《数据结构(C语言版)》——第1章 绪论

数据是对客观事物的符号表示.在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象是性质相同的数据元素的集合,是数据的一个子集. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 存储结构是数据结构在计算机中的表示. 数据类型是一个值的集合和定义在这个值集上的一组操作的总称. 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作,是对一般数据类型的扩展. 试描述数据结构和抽象数据类型

深入浅出数据结构C语言版(19)——堆排序

在介绍优先队列的博文中,我们提到了数据结构二叉堆,并且说明了二叉堆的一个特殊用途--排序,同时给出了其时间复杂度O(N*logN).这个时间界是目前我们看到最好的(使用Sedgewick序列的希尔排序时间复杂度为O(N4/3),下图为两者函数图像对比,但是注意,这并不是希尔排序与堆排序的对比,只是两个大O阶函数的对比).这篇博文,我们就是要细化用二叉堆进行排序的想法,实现堆排序. 在介绍优先队列的博文中(http://www.cnblogs.com/mm93/p/7481782.html)所提到