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

前言 :    

      在开始写关于这篇数据结构的绪论之前,我已经开始学习了一小部分的数据结构,比如线性表、树的内容,但是当我第一次接触到链表时,我坐在电脑前看了很久的链表创建、删除某个结点、清除链表时,我第一次感觉到了吃力。这并不是说我在学习c语言的时候不困难,只是没有学习数据结构这么吃力。但是我认为再难攀的山也总有翻过去的时候,之所以选择用写博客的方式来记录自己学习数据结构的过程,首先是给自己一个学习的动力,同时,也希望能给刚接触数据结构朋友一些可以借鉴的经验,当然这些经验根本就是无稽之谈,因为我根本没有什么经验,自我感动罢了,或许说成学习笔记更好,好了,不多说了。

1.1  什么是数据结构

学科形成和发展的背景:自1946年第一台计算机问世以来,计算机产业的飞速发展已远远超出人们对它的预料,在某些生产线上,甚至几秒钟就能生产出一台微型计算机,产量猛增,价格低廉,这就使得它的应用范围迅速扩展。如今,计算机已深刻到人类社会的各个领域。计算机的应用已不再局限于科学计算,而更多地用于控制、管理及数据处理等非数值计算的处理工作。与此相应,计算机加工处理的对象由纯粹的数值发展到字符、表格和图像等各种具有一定结构的数据,这就给程序设计带来一些新的问题。为了编写出一个”好“的程序,必须分析待处理的对象的特性以及处理对象之间存在的关系。

    一般来说,用计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编出程序,进行测试、调整直至得到最终解答。

1.2 基本概念和术语

①数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

②数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项。

③数据对象:性质相同的数据元素的集合,是数据的一个子集。

④数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

⑤结构:在二任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构

根据数据元素之间关系的不同特性,通常有下列4类基本结构:

a、集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系;

b、线性结构:结构中的数据元素之间存在一个对一个的关系;

c、树形结构:结构中的数据元素之间存在一个对多个的关系;

d、图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系;

例题(帮助理解)

  • 结构定义中的“关系”描述的是数据元素之间的逻辑关系,因此又被称为数据的逻辑结构。
  • 数据结构在计算机的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。
  • 在计算机中表示信息的最小单位是二进制数的一位,叫作位(bit)
  • 在计算机中,我们可以用一个由若干位组合起来形成的一个位串表示一个数据元素(如用一个字长的位串表示一个整数,用8位二进制数表示一个字符等),通常称这个位串位为元素(element)或结点(node)
  • 当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。因此,元素或结点可看成是数据元素在计算机中的映像。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像非顺序映像。并由此得到两种不同的存储结构:顺序存储结构链式存储结构。顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。例如,假设用两个字长的位串表示一个实数,则可以用地址相邻的4个字长的位串表示一个复数,如图1.6(a)为表示复数Z1 = 3.0 - 2.3i和Z2 = -0.7+4.8i的顺序存储结构;非顺序映像的特点是借助指示元素存储地址的指针表示数据元素之间的逻辑关系,如图1.6 (b)为表示复数Z1的链式存储结构,其中实部和虚部之间的关系用值为“0415”的指针来表示。

(0415是虚部的存储地址)

  • 抽象数据类型:指一个数学模型以及定义在该模型上的一组操作。

   抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。若按其值的不同特性,可细分为下列3种类型:

  • 1、原子类型:属原子类型的变量的值是不可分解的。这类抽象数据类型较少,因为一般情况下,已有的固有数据类型足以满足需求。但有时也有必要定义新的原子数据类型,例如位数为100的整数。
  • 2、固定聚合类型:属该类型的变量,其值由确定数目的成分按某种结构组成。例如,复数是由两个实数依确定的次序关系构成。
  • 3、可聚合类型:和固定聚合类型相比较,构成可变聚合类型”值“的成分的数目不确定。例如,可定义一个”有序整数序列“的抽象数据类型,其中序列的长度是可变的。

1.3 算法和算法分析

1.3.1 算法

 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有下列5个重要特性:

  1. 有穷性   一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。、
  2. 确定性  算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
  3. 可行性  一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
  4. 输入  一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
  5. 输出  一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量

1.3.2 算法设计的要求

通常设计一个”好“的算法应考虑达到以下目标

  1. 正确性  算法应当满足具体问题的需求。”正确“一词的含义在通常的用法中有很大差别,大体可分为以下4个层次:a、程序不含语法错误;b、程序对于几组输入数据能够得出满足规格说明要求的结果;c、程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;d、程序对于一切合法的输入数据都能产生满足规格说明要求的结果。显然,达到第d层意义下的正确是极为困难的,所有不同输入数据的数量大得惊人,逐一验证的方法是不现实的。对于大型软件需要进行专业测试,而一般情况下,通常以第c层意义的正确性作为衡量一个程序是否合格的标准。
  2. 可读性  算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试和修改。
  3. 健壮性  当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
  4. 效率与低存储量需求  通俗地说,效率指的是算法执行的时间。对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。存储量需求执行过程中所需要的最大存储空间。效率与低存储量需求这两者都与问题的规模有关。

1.3.3算法效率的度量

算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间度量。而度量一个程序的执行时间通常有两种方法。

(1)事后统计的方法   因为很多计算机内部都有计时功能,有的甚至可精确到毫秒级,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种事前分析估算的方法。

(2)事前分析估算的方法  一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

① 依据的算法选用何种策略;

② 问题的规模,例如求100以内还是1000以内的素数;

③ 书写程序的语言,对于同一个算法,实现语言的级别越高,执行效率就越低;

④ 编译程序所产生的机器代码的质量;

⑤ 机器执行指令的速度;

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

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

它表示随问题规模n的增大,算法执行时间的增长率和f (n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度

频度  指的是该语句重复执行的次数。

时间复杂度计算样例:

1.3.4 算法的存储空间需求

空间复杂度:算法所需存储空间的量度

                                    S (n)  =  O ( f(n) )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值