zoukankan      html  css  js  c++  java
  • 数据结构学习一:概述

    数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:

    • 数据的逻辑结构;
    • 数据的物理存储结构;
    • 对数据的操作(或算法)。

    一、什么是数据结构:
    1、数据:

    是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。

    也就是说,数据其实就是符号,而且这些符号必须具备两个前提:

    • 可以输入到计算机中。
    • 能被计算机程序处理。

    对于整型、实型等数值类型,可以进行数值计算。对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。

    2. 数据元素

    数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。

    3. 数据项

    数据项:一个数据元素可以由若干个数据项组成。

    举个例子吧。比如人这样的数据元素,可以有眼、耳、鼻、嘴、手、脚这些数据项,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要视你做的系统来决定。

    4. 数据对象

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

    数据 data
    数据对象 data object
    数据元素 data element 数据元素 数据元素 数据元素
    数据项 data item 数据项 数据项 数据项 数据项 数据项 数据项 数据项

    5. 数据结构

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

    为编写出一个“好”的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。

    二、数据的逻辑结构

    逻辑结构:是指数据对象中数据元素之间的相互关系。

    逻辑结构分为以下四种:

    • 集合结构。集合中任何两个数据元素之间都没有逻辑关系,组织形式松散。
    • 线性结构。线性结构中的结点按逻辑关系依次排列形成一个“锁链”。
    • 树形结构。树形结构具有分支、层次特性,其形态有点象自然界中的树。
    • 图状结构。图状结构中的结点按逻辑关系互相缠绕,任何两个结点都可以邻接。

    三、数据的物理结构

    物理结构:是指数据的逻辑结构在计算机中的存储形式。

    数据元素的存储结构形式有两种:顺序存储和链式存储。

    逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。

    四、数据类型

    数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。

    数据类型是按照值的不同进行划分的。在高级语言中,每个变量、常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。

    抽象数据类型(Abstract Data Type, ADT) 是一个数据结构以及定义在该结构上的一组操作的总称。它是对数据类型的抽象,抽象的意义在于数据类型不是高级程序语言支持的基本数据类型,而是自定义的数据类型。

    五、数据结构的知识点

    1、线性表

    顺序存储结构:连续的存储。

    链式存储结构:内存中随机存储的,只需要指针写出下一个结点在哪里即可。

    • 线性表:逻辑上不分叉就行。一个个数据元素前后相连(就是前驱、后继)。数据项平等对待。与此相对就是树、图。用途:其实就是数组啦。
    • 链表:采用链式存储方式的线性表。什么是链式存储?就是一个数据项中不仅保存数据还要告诉下一个数据在哪里。用途:数据大小不确定时用。

    从普通链表拓展的概念:

    1. 循环链表:首尾相连的链表;
    2. 双链表:前后相随的链表;前<  >后

    用途:特殊情况加快链表的操作;

    2、栈和队列

    这个什么东西?就是功能被限制的线性表,没有什么区别;

    栈:只能从上面往下放,然后从上面去取;  就是一个坑啊,有木有!

    • 链栈:链式存储的栈;
    • 顺序栈:顺序存储的栈;

    队列:前面装入数据,后面取出数据; 用途:保障时间的顺序,比如用户事务操作;

    • 链队列:链式存储的队列;  链队列:长度没限制啊,是不是、
    • 顺序队列:顺序存储的队列; 

    3、串

    就是把字符放到前面的线性表中。不然怎么叫字符串呢? 所以很多语言字符串就是一个对象;

    4、多维素组

    素组的元素可以又是一个数组。 这个就是一个树。

    5、树

    有分叉的链表但是不能首尾相连;(线索二叉树除外,线索二叉树就是图了都);

    • 二叉树:最多两个分支。
    • 深林:几个树放到一起(没连接哈),就是个深林;形象啊、
    • 遍历:记住以根为标准即可,先访问根:先序;访问了左边,再访问根:中序;最后访问根:后序;
    • 最优二叉树(哈夫曼树):就是把权重的往上放。   用途:用来编码,用的多的,权重的自然放在前面了,权力大的就在上面(和金字塔的社会不是很像么?);
    • 线索二叉树:叶子节点的指针域不要浪费,指向其他,按照遍历的顺序来。其实就是一个图了。

    6、图

    无限个指针域,随你指向那个结点,不要重复就行。

    • 无向图:指向a 被指向a,算作一样;
    • 有向图:指向a被指向a,不同的,不一样;
    • 带权:指向这个行为还有程度值,权值。
    • 网络:带权的有向图。 路由协议中,由路由器组成的网络就是向且带权,比如速度、延迟不一样,上传、下载速度不一样;

    遍历的问题有点麻烦

    • 深度优先:就是一直往下走,不回头。
    • 广度优先:一层一层剥下去。
    • 生成树:把图滤成一个树。删除循环的连接;primus算法类似深度优先的思想,克鲁斯卡尔算法类似广度优先的思想;
    • 最短路径:一个一个列出来,比较最小的;

    7、排序和查找

    先看排序:

    1. 冒泡排序:就像气泡一样,当前元素和下一个比,合适就这样,不合适就交换折腾 n * n次
    2. 快速:元素找到自己的排序位置,当每个人都找到了,那个顺序就定了。
    3. 选择:老实的排序法,找到最值,放在哪里,又去找最值。。。。
    4. 堆:和选择一样建一个具有堆的性质二叉树(节点永远比子节点大),堆顶就是最值,拿出来,再建一次堆。。。
    5. 插入:随便拿一个向有序的中放。问:开始没有有序的序列啊?答:开始只有找一个元素参照,一个必然是有序的,然后可以结合二分法查找,来排序,用查找的思想排序,逆天了有木有啊、
    6. 归并:几组有序的合并成一个。很简单,每人轮流拿出一个比较下,放进篮子里不就完了。

    排序好了才能查找,否则就只能一个一个查找了

    1. 顺序查找:就是一个一个来;
    2. 二分法:简单,找中间,每次排除一半;
    3. 分块:建个索引,就是分割区域,这些区域对应到一个序列,例如123,然后去找,索引越细致,速度越快,但是修改了,会重建索引,把握程度即可。
    4. 二叉排序树:把数据存在一个树里,这个树的数据以中序遍历的顺序来存,这个结点的左边比右边小,就很好找了、每次排除整体的一半。
    5. B-树:用二叉排序树当做索引存普通数据,因为二叉排序树的建立、删除代价太大了。

    8、主要的数据结构包括:

    Arrays
    Link
    lists 
    Queues
    Stacks
    Heaps
    Graphs
    Scene graphs
    Octrees
    Quad-trees
    Binary trees
    Minimax trees
    kd trees
    Sphere trees
    Bounding volume hierarchies Hash tables
    Portals and sectors

    9、主要的算法:

    Recursion
    Insertions
    Deletions
    Merging
    Various sorting algorithms 
    Various searching algorithms
    Transversal Various algorithms
    for balancing trees
    Data compression Texture compression Data encryption Texture filters


     

  • 相关阅读:
    洛谷 P1383 高级打字机==codevs 3333 高级打字机
    洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]
    洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
    poj1426
    3049 舞蹈家怀特先生
    1444 “破锣摇滚”乐队
    cocos2d-x开发的《派对小游戏》-github源代码分享
    【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”
    CAP理论与HBase
    也谈以人为本—— 服务型企业的管理随想
  • 原文地址:https://www.cnblogs.com/shangdahao/p/3088642.html
Copyright © 2011-2022 走看看