数据结构(Java语言描述)-第一章:概述

第一章 概述

1.0 序言

自己为啥要学数据结构嘞,我觉得主要有以下三个原因:

  • 前段时间在看并发编程时,发现aqs,corrunthashmap等底层都用到了数据结构,主要的有队列,还有链表,学习数据结构有助于你更好的去看懂源码。
  • 学习数据结构让你在编写代码时,在脑海中有一个更好的轮廓,知道自己要用什么来存储、处理数据,效率更高。
  • 主要是最近面了一个公司,自己Java基础、多线程、redis、mq、分布式框架等都回答的可以,后面又加了一轮算法机试,因为不是科班,自己这块太薄弱了,😔难过呀铁子,决定花时间把这块啃下。
    目标
  • 由于自己是用微信读书看的,没有开通会员,只领取了20天的无限观看权,希望在20天内看完这些,不至于给微信充钱观看,嘻嘻。
  • 本书由于只算法部分只涉及了排序算法,后面会再学习别的课程进行补充,不在此20天内,不然是完不成的,毕竟我还要上班不是,已经很累了。

总体要求
• 了解数据结构的意义、数据结构在计算机领域的地位和作用
• 掌握数据结构各名词、术语的含义和有关的基本概念,以及数据的逻辑结构和存储结构之间的关系
• 了解使用Java语言对数据结构进行抽象数据类型的表示和实现的方法
• 了解算法的五要素
• 掌握计算语句频度估算算法时间复杂度的方法

学习重点
• 数据的逻辑结构和存储结构及其之间的关系
• 算法时间复杂度的计算

1.1 数据结构的作用和意义

作用:

数据是外部世界信息的计算机化,是计算机加工处理的对象。运用计算机处理数据时,必须解决四个方面的问题:一是如何在计算机中方便、高效地表示和组织数据;二是如何在计算机存储器(内存和外存)中存储数据;三是如何对存储在计算机中的数据进行操作,可以有哪些操作,如何实现这些操作以及如何对同一问题的不同操作方法进行评价;四是必须理解每种数据结构的性能特征,以便选择一个适合于某个特定问题的数据结构。这些问题就是数据结构这门课程所要研究的主要问题。

我们知道,虽然每个人都懂得英语的语法与基本类型,但是对于同样的题目,每个人写出的作文,水平却高低不一。程序设计也和写英语作文一样,虽然程序员都懂得语言的语法与语义,但是对于同样的问题,不同的程序员会写出来不一样的程序。有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问题。

数据结构正是前人在思索问题的过程中所想出的解决方法。一般而言,在学习程序设计一段时间后,学习“数据结构”便能让你的程序设计水平上一个台阶。如果只学会了程序设计的语法和语义,那么你只能解决程序设计三分之一的问题,而且运用的方法并不是最有效的。但如果学会了数据结构的概念,就能在程序设计上,运用最有效的方法来解决绝大多数的问题。

意义:

数据结构是一门介于数学、计算机硬件和计算机软件三者之间的核心课程。数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。学习“数据结构”既为进一步学习其他计算机专业课程提供必要的准备知识,也有助于提高软件设计和程序编制水平

1.2基本概念和术语

1.2.1基本概念和术语

1. 数据
数据即信息的载体,是对客观事物的符号表示,凡能输入到计算机中并被计算机程序处理的符号都可称之为数据,如整数、实数、字符、文字、声音、图像等都是数据,如图1.3所示。

2.数据元素
数据元素是数据的基本单位,它在计算机处理和程序设计中通常作为独立个体。数据元素一般由一个或多个数据项组成,一个数据元素包含多个数据项时,常称为记录、结点等。(可以类比数据库中的一条记录,就是数据元素,而这条记录中的各个列字段称为数据项,数据项是数据元素的基本单位),数据项也称为域、字段、属性、表目、顶点。
如表1-3所示,每个同学的信息即表中的一行,是一个数据元素。每个数据元素又包含若干个数据项,如专业、学号等。

3. 数据对象
数据对象是具有相同特征的数据元素的集合,是数据的一个子集,如一个整型数组、一个字符串数组都是一个数组对象。这里特意查了下子集的概念,也就是说数据对象是数据的一个子集,即数据对象中的任何一个元素都是一个数据。

例如要将表1-3中的学生信息按照学号大小进行排序,排序时比较的是各个数据元素中学号这一数据项的大小。此时整个表中的数据元素就是待处理的数据对象。
4. 数据结构
数据结构简称DS(Data Structure),是数据及数据元素的组织形式。任何数据都不是彼此孤立的,通常把相关联的数据按照一定的逻辑关系组织起来,这样就形成了一个数据结构。
数据结构包含两个方面的内容,一是数据对象,二是数据对象中数据元素之间内在的关系。数据结构通常有四类基本形式:集合结构,线性结构,树型结构,图形结构或网状结构。




数据结构:图(Graph)可以参考下
5.数据类型
数据类型是一组具有相同性质的操作对象以及该组操作对象上的运算方法的集合,如整数类型、字符类型等。每一种数据类型都有自身特点的一组操作方法,即运算规则。JAVA中提供的基本的数据类型有int,double,long,float,short,byte,character,boolean

1.2.2数据的逻辑结构

数据的逻辑结构(Logic Structure)是从具体问题抽象出来的数学模型,与数据在计算机中的具体存储没有关系。数据的逻辑结构独立于计算机,是数据本身所固有的特性。从逻辑上可以把数据结构分为线性结构和非线性结构,上述数据结构的定义就是数据的逻辑结构(Logic Structure),主要包括:集合、线性、树和图形结构,其中集合、树和图形结构都属于非线性结构。
关于什么是线性结构,什么是非线性结构?这里,有一些问题我还是不明白,比如ArrayList底层是一唯数组,它是线性的么?书中说集合是非线性数据结构。
什么是线性结构,什么是非线性结构?
常用的线性结构有:线性表,栈,队列,双队列,数组,串。
数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系集,它反映了D中各数据元素之间的前驱后继关系,通常记为R,即一个数据结构可以表示成二元组B=(D,R)。

这里只举这一个例子即可,表述的是一种线性结构,书中另外2个例子分别是单位管理关系代表的是一种一对多关系的树型结构,而某人的人际关系例子则是代表的多对多的图行结构关系。

1.2.2数据的物理结构

我们讨论数据结构的目的是为了在计算机中实现对它的操作,因此还需要研究在计算机中如何表示和存储数据结构,即数据的物理结构(Physical Structure)。数据的物理结构又称存储结构,它的实现依赖于具体的计算机语言。数据存储结构有顺序和链式两种不同的方式,顺序存储的特点是数据元素在存储器的相对位置来体现数据元素相互间的逻辑关系,顺序存储结构通常用高级编程语言中的一维数组来描述或实现。

链式存储结构是通过一组任意的存储单元来存储数据元素的,而这些存储单元可以是连续的,也可以是不连续的。为建立起数据元素之间的逻辑关系,对任一数据元素a,除了存放元素自身信息a之外,还需要存放与a有关系的其他元素的地址150,通过这个地址就可以找到下一个数据元素b,依此类推,可以发现字符序列(‘a’,‘b’,‘c’,‘d’,‘e’,‘f’)在存储器中的地址是不连续的。

1.3面向对象的数据结构表示

1.3.1 Java面向对象基础

  1. 类的声明与实例化
    Java语言是面向对象的程序设计语言,类和对象是面向对象的核心。Java语言提供了创建类和创建对象的语法支持。定义类的简单语法如下。


    其中,变量c本质是一个Circle型的变量,是一个半径为2.5的圆对象。该对象就是通过操作符new并且调用构造器Circle(2.5)完成半径radius的初始化之后得到的。
  2. 类的成员的定义与使用
    类是数据以及数据的操作的封装体。类的成员详细描述了类的数据信息(成员变量)以及针对这些数据信息的操作方法(成员方法)

    3.抽象类
    当类表达的是抽象概念(例如几种图形)时,其运算处理往往也是抽象的,此时只能定义方法的格式,而无法写出语句代码。
  3. 泛型类
    顾名思义,泛型就是一种包含了要运算处理的数据的类型尚不明确而临时使用类型参数(如K)来表示的一种自定义数据类型。

1.3.2 面向对象的抽象数据类型





1.3.3 使用Java语言描述数据结构的优势

  1. 使用Java描述数据结构更加简单
    Java语言是一种完全面向对象的程序设计语言,支持使用对象、类、继承、封装、消息等基本概念来进行程序设计。在Java中,使用类时必须先声明变量名(也称对象名),然后实例化,再引用类的成员。其中,实例化的本质是为对象分配足够的内存空间,以保存各数据成员的值。对象名代表对象的引用,可理解为对象所拥有的内存空间的首地址。因此,Java语言不使用指针就可以描述数据结构的前驱后继关系。
    Java提供了自动的垃圾回收机制,在实现复杂的数据结构运算处理时程序员不必为内存管理而担忧。因此Java语言使用时简单、方便。
  2. Java的泛型机制更加适合数据结构的抽象表示
    Java的泛型类定义了一个代码模板,专门针对暂时不确定的数据类型进行抽象描述和定义。因此,相对抽象数据类型的传统表示方法,Java的泛型类将更加直观和方便。例如,在不使用泛型机制描述集合时,必须指定集合元素的数据类型,每种类型都要写一种结合,代码量重复,并且繁重。


    3.java.util提供多种数据结构,可以加速应用系统开发
    在java.util包中,Java提供了多种数据结构,包括ArrayList、Hashtable、LinkedList、Map、Queue、Set、Stack、TreeSet、Vector等,这些数据结构在Java程序中可直接使用,而不需要用户自己编程实现,这样可大大加快应用系统的开发速度。

看到这里,有读者会说“既然Java已经实现了各种数据结构,我们为什么还要学习数据结构呢?”是的,Java API确实提供了多种数据结构,但这些数据结构往往只满足通用的功能需求,在实际应用中通常需要自定义数据结构,以提供特殊数据运算处理。此外,数据结构这门课是提升编程能力的最给力的课程,因此作为刚涉足程序设计的在校学生来说,除了要了解各种数据结构的概念之外,最重要的是要理解各种数据结构的操作算法并提高实际编程能力。

1.4算法和算法分析

1.4.1 算法的基本概念


算法(Algorithm)是指在有限的时间范围内,为解决某一问题而采取的方法和步骤的准确完整的描述,它是一个有穷的规则序列,这些规则决定了解决某一特定问题的一系列运算。
一个算法应该具备以下特征。

  1. 有穷性
    一个算法应包含有限个操作步骤,即一个算法在执行若干个操作步骤之后应该能够结束,并且每一步都要在合理时间内完成。
  2. 确定性
    算法中的每一个步骤必须有确切的含义,无二义性,在任何情况下,对于相同的输入只能得出相同的输出。
  3. 可行性
    算法中的每一个步骤都应该能够通过已经实现的基本运算的有限次执行得以实现。
  4. 输入
    输入指的是在算法执行时,从外界取得必要的数据。一个算法可以有一个或一个以上的输入,也可以没有输入。
  5. 输出
    数据结构输出指的是算法对输入数据处理后的结果。一个算法可以有一个或一个以上的输出,没有输出的算法是无意义的。

1.4.2 算法效率的度量

对于一个特定的问题,采用的数据结构不同,其设计的算法一般也不同,即使在同一种数据结构下,也可以采用不同的算法。那么,对于解决同一问题的不同算法,选择哪一种算法比较合适,以及如何对现有的算法进行改进,从而设计出更适合于数据结构的算法,这就是算法效率的度量问题。评价一个算法优劣的主要标准如下。



1.4.3 算法效率分析

  1. 时间复杂度(Time Complexity)
posted @ 2020-12-16 14:10  皮卡丘和羊宝贝😄  阅读(266)  评论(2编辑  收藏  举报