数据结构-第零章-绪论

数据结构与算法

第一章:数据结构与算法综述

​ 综述:本章主要回答以下问题

​ 1、什么是数据结构?以及数据结构是如何产生的?

​ 2、什么是算法?以及如何衡量算法的好坏?

​ 3、学习数据结构所需要哪些预备知识?

问题1:什么是数据结构?以及数据结构是如何产生的?

​ 都说数据结构是计算机科学中最核心的一门课程,那么数据结构为何会成为最重要的一环呢?提到计算机,我们都知道计算机是为处理数据而生的,它只负责运算数据,而数据需要操作计算机的人来提供,你当然可以给计算机两个数,然后来运行加法运算,但是在面对复杂问题时,你如何给计算机合理的数据就成为问题了。使用数据结构一般是遇到比较大量复杂的数据,工程师在面对数据时,合适的将数据全部提取出来,用合理的结构将数据表示出来,这就是数据结构的核心。

程序的重点是对数据的处理,核心是数据,而非程序!将纷繁问题中的数据提取出来便于程序处理是数据结构的核心内容,我觉得只是从数据结构这个名字来说的话,数据结构这门课是并不包含算法的,更好的称呼应该是《数据结构和算法》。

数据是可以结构化的,数据和数据之间的关系可以归纳为一对一(线性表、栈、队列共三章),一对多(树一章),多对多(图一章)这三种关系,注意,以下讲述的数据结构均是这三种类型,没有其他。将复杂大量的数据找出规律然后再进行运算,是合理且高效的方法,所以说,数据结构只是一门让你在复杂巨量数据中找出数据规律的课程,换句话说,有了数据结构,整个世界都可以数据化,所有的一切都可以数字化,然后交由计算平台处理,这就是为什么计算机专业中,数据结构是其核心的原因!

问题2:什么是算法?以及如何衡量算法的好坏?

​ 什么是算法?算法就是解决问题的方法(查找和排序,最后两章内容)。所有的方法,不论优劣,都称之为算法。学习算法的目的就是要在一堆算法中找到问题最优的解法,即最优解!我们在学习数学时说到,数学是一切自然学科的基础!那么数学也是计算机科学的基础,计算机科学归根到底也就属于数学中的求最优解问题。毕竟计算机硬件资源是有限的,如何合理高效的使用计算机资源就是一个找最优解的过程,包括操作系统的工作,计算机网络数据传输的处理,计算机体系结构是如何一层层的工作的,均是在现有条件下找一个平衡,即最优解!算法就是在处理问题的逻辑层找最优解。说到最优解,那你写一个算法,我也写一个算法,你咋知道谁的是最优解?因此就引出衡量算法优劣的时间复杂度和空间复杂度。

空间复杂度就是算法运行时所占用的存储空间,这里略过,主要讲时间复杂度。

时间复杂度:时间复杂度所指的并不是解决问题所写的程序的运行时间,他是一个关于问题规模的函数,将程序中基本操作的执行次数作为算法时间复杂度的度量,且将最坏的情况作为其度量结果。简单来说,时间复杂度并不是测量算法运行所需的具体时间,而是一个以数量级的表示方法,比方说你的钱比别人多一个数量级,你有三位数的存款(100-999),那别人就有(10-99)。

举个例子,看下面一段代码:

void fun(int n){
  int i,j,x = 0;
  for(i = 0;i < n; ++i){
    for(j = i + 1;j < n; ++j){
      ++x;
    }
  }
}

1、首先找出程序的基本操作,确定程序的问题规模

​ 在该程序中,显然 ++x 操作是处于程序的最内层循环,因此定为基本操作,其规模为n 。

2、确定规模

​ 计算出 ++x 的执行次数为f(n) = n(n - 1)/2,故起决定性的项是(n^2) / 2,因此时间复杂度T(n) = O(n^2);

时间复杂度的计算先了解,后面章节的算法部分每一个算法都会详细计算其时间复杂度(包括最好以及最坏情况)

问题3:学习数据结构的预备知识

读者在学习数据结构时需要了解两个知识点,分别是指针和结构体类型。下面详细说明。

1、指针

先说指针是什么,指针变量主要是用来存储变量在内存中的地址,注意指针存放的是地址,而非变量本身。指针变量用*表示,例如 *pointer 表示一个指针变量,那么在C语言中有细分的基础数据类型,如果想指向一个整数的地址,那么就需要在指针前加上相应的数据类型。

例如 int *pointer ; 表示指向一个整数的指针

再如 float *myPointer ;表示指向一个浮点数的数据指针

以上的int、float表示指向的数据类型,*表示指针,pointer、myPointer表示指针变量的变量名。

指针既然指向的是数据在内存中的地址,那么如何表示出一个数据在内存中的地址呢?在编程语言中,&符号是地址符,如果你定义了一个变量a(int a;),那么&a即表示变量a在内存中的地址;把变量a的地址可以用指针变量保存,即int *pointer = &a;

即把变量a的地址赋给了指针型变量pointer。

以上是定义一个指针变量的同时并给指针变量赋值,亦可以先定义再赋值,语句如下

int *p;

p = &a;

在定义一个指针变量时,若不想让指针指向内存地址,可以将其赋值为NULL,语句如下int *p = NULL; 这样指针p就不指向内存地址。

在指针变量的使用过程中,*p表示取指针变量的变量值

例如 int num = *p; 即把指针p所指的值赋值给num

2、构造结构体

​ 数据结构的使用一般是复杂大量的数据处理时,基础数据类型已经不方便使用,工程师使用自己定义数据类型能更好的处理数据,那么自己定义数据类型的过程就叫结构体构造,结构体和基础数据类型一样也是数据类型,

只不过这个数据类型是读者自己用基础数据类型构造的而已。下面就拿一个构造的数据类型来举例。

typedef struct{
  int age;
  char sex;
  float weight;
}Student; 

以上代码即构造了一个结构体变量,那么就说说这段代码的含义

typedef是由type define组成的,意思为类型定义,struct意思为结构,还记得结构体是什么吗?结构体即为工程师自己定义的数据类型,那么typedef struct即为定义结构体,{ }中的int、char、float是工程师进行构造数据类型所使用的基础数据类型,Student是该数据类型的名称,就像整数数据类型是int一样,Student不是固定的,工程师可以随意起属于自己的数据类型名 。

对于上面定义的结构型,如果我想定义一个Student的数据类型,直接Student stu; 即可,对比基础数据类型,其定义的方式都一样。如果给结构型里的分量赋值,直接写stu.age = 15; ,如果取分量的值则int n = stu.age;。

说回构造类型,构造结构体和面向对象语言中的对象一样,对象有对象名,结构体定义时有结构题名;对象有属性,对应结构体的分量;对象取属性值的方式也和结构体相同,都是用 . 的方式。

下面给出Java面向对象Student类的代码,读者可以比较看待

public class Student {
	int age;
	char sex;
	float weight;
}

最后再说一下数据结构与算法整本书的骨骼

一、数据结构部分

数据结构是研究数据的,那么数据就有其逻辑结构,上文讲过的以下四种

1、元素之间没有关系对应———>集合

2、一对一关系———>线性表(线性表、栈、队列)

3、一对多关系———>树

4、多对多关系———>图

还有两种存储结构

1、顺序结构

2、链式结构

二、算法部分

1、排序

2、查找

转载于:https://my.oschina.net/u/3696232/blog/3053781

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值