数据结构学习之一绪论和基本概念
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构学习之一绪论和基本概念相关的知识,希望对你有一定的参考价值。
结束了常用设计模式的学习,有空的话我会把剩下的几个模式发布上来,下一步计划就是关于数据结构方面和源码的学习,每天给自己安排了计划,希望自己能如期执行
这一篇文章全部是关于我对数据结构理论的整理和个人见解,参考的是资料是<数据结构(Java语言描述)>,清华大学出版社 的教科书,我不是科班毕业,这本书是我今年端午节在南师大附近淘到的,感觉还不错
言归正传,上正式内容
package com.hola.data.structure; /** * * @author Dougest 2017年7月31日 下午9:57:25 * */ public class Day01 { /******************1.绪论*********************/ /** * 从表面上来看,程序的设计和编写主要是实现某类数据的处理 * 实质上,更为重要的是考虑如何在计算机中组织这些数据,以支持后续高效的处理过程 * * 程序 = 算法 + 数据结构 * 程序:计算机指令的组合,用来控制计算机的工作流程,完成一定的逻辑功能以及实现某种任务 * 算法:程序的逻辑抽象,解决牟写客观问题的策略 * 数据结构:现实世界中的数据以及之间的关系反应 * *利用计算机解决实际的问题,需要完成一个从问题到程序的实现过程: * (1)确定问题求解的数学模型(逻辑结构) * (2)确定存储结构 * (3)设计算法 * (4)变成并测试结果 * * 由此可见,程序设计的本质在于解决两个主要的问题: * 1)根据实际问题选择一种好的数据结构 * 2)设计一个好的算法 * 后者的好坏很大程度上取决于前者 * * * * 问题1: * 假设有N个数,需求找出N个数中从大到小的第k个数 * 思路1: * 解决: * 将这些数字读入数组,冒泡排序取第k个数字 * 缺点: * 消耗内存 * 思路2: * 解决: * 将N个数的前k个数读入一个数组,递减排序 * 将剩下的数字逐个读入,与数组中的第k个数对比 * 如果->不大于第k个数字则忽略 * 如果->大于就插入数组中合适的位置,这时数组仍然保持有序,数组最后一个数被排除 * 对比结束,数组中第k个数字就是我们想要的数字 * 缺点: * 思路较复杂 */ /** * 问题2: * 有订单数据如下描述 * 编号(递增) 负责人(中文) * 1 张三 * 2 张三 * 3 李四 * 4 李四 * 5 张三 * 6 李四 * 找出属于张三的所有订单 * 思路: * 将订单数据映射到计算机的存储结构中去 * 思路1: * 将数据顺序的存储到计算机 * 查找从表中第一个订单到最后一个订单 * 依次核对"负责人"字段是否为"张三" * 思路2: * 将数据顺序存放 * 按"负责人"的姓氏简历一张索引表 * 查找时首先查找在索引表中核对姓氏 * 根据索引表中的地址到订单表中核对姓名 * * 总结: * 思路2比思路1更为高效 * 内存占用/效率 */ /** * 问题3: * 为小区之间铺设网络线路(任意两个小区之间都可以铺设) * 可如下铺设 * * a * * b c * * d e * * a,b,c,d,e互联共可连10条线路 * * 生成最小树: * b-a,a-c,a-d,d-e * */ /** * 总结: * 用计算机解决一个问题,总是围绕着一下3个步骤进行: * 1.抽象出问题中需要处理的数据对象的逻辑结构 * 2.根据问题 完成的功能特性 实现对抽象对象数据结构的存储结构表述 * 3.确定为求解问题而需要进行的 操作 或者 运算 * * --------------------------------------- * | 方面 | | | * |过程 | 数据表示 | 数据处理 | * |---------------------------------------| * |抽象 | 逻辑结构 | 基本运算 | * |---------------------------------------| * |评价 |不同数据结构的比较和算法性能的分析 | * ----------------------------------------- */ /**********************************2.基本概念和术语*************************************************/ /** * 数据(Data): * 数据是信息的载体,是对客观存在的事物的符号表示,他能够被计算机程序识别/存储/加工/处理 * *数据是所有能够有效的输入到计算机中并且能够被计算机处理的符号总称 * *也是计算机程序处理对象的集合,是计算机程序加工的"原材料" * 如: * 一个编译程序或者文字处理程序的对象就是字符串 * 数据还包括图像,声音等非数值数据 * * 数据元素(Data Element): * *数据中的一个"个体",是数据的基本组织单位 * 在计算机程序中一般将他作为一个整体进行考虑和处理 * 不同条件下数据元素又可以称为 结点/顶点/记录 * * 数据项(Data Item) * *数据项是数据元素的组成部分,是有独立含义的标识单位,也是数据元素的组织单位 * 数据项一般分为两种 * 1.简单数据项 如:姓名/性别等 * 2.组合数据项 如:出生如期 可进一步分为: 年/月/日/时/分/秒 * * 数据对象: * 性质相同的数据元素的集合 * 一般来说,数据对象中的数据元素是不会孤立的,而是彼此相关,这种彼此之间的关系叫做"结构" * * 数据结构: * 相互之间存在一种或者多种特定关系的数据元素的集合 * 对于数据结构的理解都离不开对数据的逻辑结构,数据的存储结构,数据的操作3个方面 * * 1)逻辑结构: * 指各个数据元素之间的逻辑关系,是呈现在用户面前的,能感知带的数据元素的组织形式 * 按照数据元素之间的逻辑关系的特性来分,可以将数据结构归纳为以下4类: * * (1)集合结构: * 数据元素之间除了"*同属于一个集合"的特性以外,无其他关系,他们的关系是松散的 * (2)线性结构: * 数据元素之间存在"*一对一"的关系 * 即:若结构非空,则他有一个且只有一个开始结点和终端结点 * 开始结点没有前驱但是有一个后继 * 终端没有后继但是有前驱 * 其他结点只有一个前驱和一个后继 * (3)树形结构: * 数据元素之间存在"*一对多"的关系 * 即:若结构非空,则他有一个称为"根"的结点,此结点无前驱结点 * 其余结点仅仅有一个前驱结点但是有若干个后继结点 * (4)图形结构: * 数据元素之间存在"*多对多"的关系 * 即:若结构非空,则在这种数据结构中任何结点都可以有多个前驱和后继 * * 有时也将逻辑结构分为两大类: * 线性结构: 线性 * 非线性节后: 树/图/集合 * * 数据结构的表现可以通过一个二元组来定义,定义形式为: * Data_Structure = (D,R) * 其中,D是数据元素的有限集,R是D上关系的有限集 * R中的关系描述了D中数据元素之间的逻辑关系,也叫数据元素之间的关联方式(或者邻接方式) * * 设R1 ∈ R ,则 R1是一个D*D的关系子集 * 若a1,a2∈ D,<a1,a2>∈ R1,则称a1是a2的前驱,a2是a1的后继,对R1而言,a1,a2是相邻的结点 * 没有前驱的结点就是开始结点(根结点),没有后继的结点就是终端结点(叶子结点) * * 例: * B = (D,R),其中D={a1,a2,...,a9} * R = {<a1,a2>,<a1,a3>,<a3,a4>,<a3,a6>,<a4,a5>,<a6,a8>,<a6,a7>,<a7,a9>} * 结构如下 * a1 * / * a2 a3 * / * a6 a4 * /\ * a7 a8 a5 * * a9 * * 例: * 矩阵如下: * * | a1 a2 a3 | * | a4 a5 a6 | * | a7 a8 a9 | * * 他们9个元素之间存在两种关系,一种是行关系,一种是列关系 * 用二元组表达他们的逻辑结构 * B = (D,R) * 其中: * D = {a1,a2,...,a9} * ROW = {<a1,a2>,<a2,a3>,<a4,a5>,<a5,a6>,<a7,a8>,<a8,a9>} * COL = {<a1,14>,<a2,a5>,<a3,a6>,<a4,a7>,<a5,a8>,<a6,a9>} * * 数据的逻辑结构是从数据元素之间的逻辑关系来观察数据,他与数据的存储无关,是独立于计算机之外的 * * 2)存储结构 * 数据的存储结构(物理结构)是数据的逻辑结构在计算机中的实现,是依赖计算机的,他包括数据元素值的表示 * 和逻辑关系的表示两部分组成 * 计算机最小数据表示单位是二进制数的一位(bit),*通常用一个由若干位组合起来的位串来表示一个数据元素 * 当数据元素由若干个数据项组成时,位串中对应于各个数据项的子位串成为数据域 * 所以数据元素值在数据域中是以二进制的存储形式表示 * 而数据元素之间的逻辑关系的存储表示通常以以下4种形式: * (1)顺序存储方式: * 将所有的数据元素存放在一片连续的存储空间中,*使用逻辑上相邻的数据元素其对应的物理位置也相邻 * 即数据元素的逻辑位置关系与物理位置关系保持一致 * 实现形式 ===> 数组 * (2)链式存储方式: * 不要求将逻辑上相邻的数据元素存储在物理相邻的位置,即*数据元素可以存储在任意的物理位置上 * 每一个数据元素对应的存储表示由两部分组成,一部分存放数据元素值本身,另外一部分存放表示逻辑关系 * 的指针 * 即数据元素之间的逻辑关系是由附加的指针来表示的 * (3)索引存储方式: * 在存储元素时添加了一个索引表 * 索引表中每一项包括关键字和地址 * 其中,关键字是能够唯一标识一个数据元素的数据项 * 地址是指数据元素的存储地址或者存储区域的首地址 * 案例如上问题2订单表 * (4)散列存储方式: * 也称为哈希存储, * 将数据元素存储在一片连续的区域内,每一个元素的具体存储地址是根据该数据元素的关键字值 * 通过散列(哈希)函数直接计算出来的 * * 以上4种存储方式中,顺序存储和链式存储是最基本的,最常用的两种方式 * 索引和散列是为了提高查找效率而常常采用的两种存储方式 * * 3)数据的操作: * 对数据进行某种方法的处理,也称数据的运算 * 数据的操作也被认定为是定义在数据逻辑结构上的操作,但是操作的实现却要考虑数据的存储结构 * 创建 * 销毁 * 插入 * 删除 * 查找 * 修改 * 遍历 * * 总结: * 顺序表和单链表具有相同的逻辑结构,但是存储结构不同,所以赋予不同的数据结构名 * 线性表,栈和队列具有相同的数据结构和存储结构,但是由于插入和删除操作允许位置不同而分类 * =>限制在表的一端进行的成为栈 * =>插入在表的一端,删除在表的另外一端成为队列 * */ /**********************************3.数据类型 略*************************************************/ }
以上是关于数据结构学习之一绪论和基本概念的主要内容,如果未能解决你的问题,请参考以下文章