数据结构 #考研#408

第零章 文章简介

考研数据结构一共有 绪论;线性表;栈、队列和数组;串;树与二叉树;图;查找;排序8个章节。每个章节都有一定量的代码和理解难度。本文章的目标是精炼并且直观的用自己的方式讲述考研所要求的各个数据结构,并且理解c语言数据结构的基本概念,分享我的一些解题思路等等。复习参考书目是王道数据结构23版单科书。如有错误还希望佬们指出,这几个月会陆续更新,希望能和大家一起进步。

第一章绪论

1.1 数据结构的基本概念

        1.1.1基本概念和术语(前面都是一些理论,没啥好玩的)

        1.数据

        数据就是一切能够输入到计算机里面被计算机加工的原料。比如一些符号,大小写字母,阿拉伯数字。举个栗子ASCII表里面的每一个项都是数据

        2.数据元素

        数据元素是数据的基本单位,通常作为一个整体进行考虑和处理,数据项是组成数据元素的基本单位。比如链表中的一个个结点就是数据元素,里面表示数据的data部分以及指向下一个结点的指针部分就是数据项。

        3.数据对象

        数据对象是具有相同性质的数据元素的集合,是数据元素的一个子集。比如所有整数,所有小写字母等。

        4.数据类型

        数据类型是一个值的集合和定义在此集合上面的一组操作的总称。

        1)原子类型。值不能再分的数据类型。比如int char 这些。

        2)结构类型。值可以再分解成若干成分的数据类型。比如自己定义的数据结构比如LNode。

        3)抽象数据类型。抽象数据组织及与之相关的操作。比如在不同的处理器上面int的实现方法不同,但是int对于程序员而言是相同的,这里的int就是抽象数据类型。

        5.数据结构        

        在任何问题中,数据都不是孤立存在的,他们之间存在某种关系,这种关系称之为结构,在c语言中用结构体实现各种数据结构。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。

        数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于逻辑结构,算法的实现取决于数据结构。

        1.1.2数据结构三要素

        1.数据的逻辑结构

        逻辑结构是指数据之间的逻辑关系,即从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的,分为线性结构和非线性结构,如下图

        2.数据的存储结构

        就是数据在内存里面的的存储方式。

        1).顺序结构,把逻辑上相邻的元素,物理存储上也相邻,这样以来,就能实现数据的随机存储,比如线性表的顺序存储方式——顺序表。但是这样不方便插入数据,每次插入需要挪动很多数元素。而且只能使用相邻的一整块数据单元,对内存的要求高。

        2).链式结构,链式结构可以更方便的进行插入和删除操作,也可以使用不相邻的存储单元来保存数据元素,但是如果要查找链表中的某一个元素的话,只能从第一个元素开始往后查找,不能随机查找

        3).在存储关键信息的时候,还建立附加的索引表,索引表中的每一项称之为索引项。索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是检索表占用额外的存储空间,而且增加和删除数据时也要修改索引表,因此会花费较多的时间。

        4).散列存储。根据元素的关键字直接计算出该元素的存储地址,又称哈希存储。优点是检索增加删除元素的时候都很快;缺点是如果函数没有设计好,那么就会出现元素存储单元的冲突,而解决冲突会增加时间的开销。

        3.数据的运算

        施加在数据上面的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能,运算的实现是针对存储结构的,指出运算的具体步骤。

举个栗子像插空法快速排序,快速排序的过程是首先选择首项为枢轴,然后再把所有比枢轴小的元素移动它的左边把大于枢轴的元素移动到它的右边,然后再从枢轴的左边一堆元素进行上述过程,直到枢轴的左右元素只有一个为止,排序结束。这是运算的定义。

而运算的实现是具体对于移动过程的具体描述,先设置一个变量pivot保存最左边的枢轴元素,此位置就变成了一个空,然后再到最右边找到小于枢轴的元素,如果找到那么则把他填充到枢轴原来的位置,

while(low<high&&a[high]>pivot] high--;
    a[low] = a[high];    //找到小于枢轴的元素并且放到空位

填充完之后,右边的这个被填充到左边的、小于枢轴的元素的位置就可以看成一个空,然后再返回左边找大于枢轴的元素,如果找到那么则把他填充到枢轴的位置,

while(low<high&&a[low]<pivot] low++;
    a[high] = a[low]; //找到大于枢轴元素并放在右边空位

填充完之后,左边的这个被填充到右边的、大于枢轴的元素的位置就也可以看成一个空,然后程序再重新执行到高位往低位查找比枢纽小的元素的操作,直到最终low=high,把枢纽放到中间点,完成一轮排序。这是运算的具体实现。一般来说,只有清晰的懂得了运算的定义,才能去考虑运算的具体实现,直接考虑运算的实现,会导致思维十分混乱,而无法实现目标结果。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值