热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【数据结构与算法数据结构基础】什么是数据结构?

【数据结构与算法-数据结构基础】什么是数据结构?文章目录【数据结构与算法-数据结构基础】什么是数据结构?1数据结构包含的三个方面1.1数据的逻辑结构1.


【数据结构与算法 - 数据结构基础】什么是数据结构?



文章目录


    • 【数据结构与算法 - 数据结构基础】什么是数据结构?
      • 1 数据结构包含的三个方面
        • 1.1 数据的逻辑结构
          • 1.1.1 线性结构
            • 数组【Array】
            • 链表【LinkedList】
            • 栈【Stack】
            • 队列【Queue】

          • 1.1.2 树结构【Tree】
          • 1.1.3 图结构【Graph】
            • 堆【Heap】

          • 1.1.4 散列表【Hash】

        • 1.2 数据的存储结构
          • 1.2.1 顺序存储【Sequential Storage】
          • 1.2.2 链式存储【Linked Storage】
          • 1.2.3 索引存储【Index Storage】
          • 1.2.4 哈希存储【Scatter Storage】

        • 1.3 数据操作






  • 数据,data:符号集合、处理对象
  • 结构:各个组成部分的搭配和排列
  • 数据元素:数据的基本单位,可由若干个数据项组成

→ 数据结构 data structure:数据的组织、管理和存储格式。

要与算法结合起来说的话,数据结构就是我们能够执行算法的“原材料”。数据结构 + 算法 = 程序设计。

通常情况下,更优的数据结构可以给程序带来更高的运行以及存储效率。

简单来说,数据结构的定义就是一种程序设计优化的方法论,它不仅讨论到存储的数据,同时也考虑到彼此之间的关系与运算,使之达到加快程序执行速度与减少内存占用空间等作用。


1 数据结构包含的三个方面

数据结构(data structure)指数据元素之间存在的关系。

主要包含以下三个方面:


  • 数据的逻辑结构
  • 数据的存储结构
  • 数据操作

1.1 数据的逻辑结构


1.1.1 线性结构

数组【Array】

在这里插入图片描述

数组是一种典型的线性数据结构。它是存储在连续内存位置的相似类型数据项的集合。

数组是最简单的数据结构,它的每个数据元素都可以使用索引号随机访问。


链表【LinkedList】

在这里插入图片描述

链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。

Java 集合框架中的LinkList 类,底层的实现就是 链表。


栈【Stack】

栈是以数组或者链表为基础,封装出来的一种数据结构。

在这里插入图片描述

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。


队列【Queue】

在这里插入图片描述

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。


1.1.2 树结构【Tree】

在这里插入图片描述

树,是一种一对多的数据结构,天生就非常适合用来检索。

它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

Java集合框架当中有一个TreeMap类,用于存储键和值的映射,不但查找很高效,还能保证键的有序排列。它的底层实现就是一种名为红黑树的特殊二叉树。


1.1.3 图结构【Graph】

图,是一类多对多的数据结构,非常适合用于表述众多对象之间的复杂关系。

在这里插入图片描述


堆【Heap】

堆是一种特别的完全二叉树。

在这里插入图片描述

其定义为:给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于(或大于等于)C的值。

堆最常见的作用是可以迅速找到一堆数当中的最大值或者最小值。


1.1.4 散列表【Hash】

散列表Hash table,也叫哈希表。

散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。【散列表是一种非线性的数据结构】

在这里插入图片描述



树是图的特例,树是连通的无回路的无向图;线性表是树的特例,线性表是单枝树。



1.2 数据的存储结构


1.2.1 顺序存储【Sequential Storage】

顺序存储是所有的结点元素存放在一块连续的存储区域中,用存储结点的物理位置来体现结点之间的逻辑关系的存储方法。

在高级语言中,一块连续的存储空间通常可用一个数组来表示。因此,顺序存储通常用一个数据元素类型的数组来存储。最经典的顺序存储结构是顺序表,将线性结构的元素按序存放在一个数组中 。


1.2.2 链式存储【Linked Storage】

链式存储结构,又叫链接存储结构。在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)

它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点。


1.2.3 索引存储【Index Storage】

索引存储,分别存放数据元素和元素间关系的存储方式。

所有的存储结点存放在一个区域。另设置一个索引区域存储结点之间的关系。

索引是为了加速检索而创建的一种存储结构。它是针对一个表而建立的,是由存放表的数据页面以外的索引页面组成的。


1.2.4 哈希存储【Scatter Storage】

哈希存储亦称“散列存储”,专用于集合结构的一种存储方式。

该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址

数据元素存放在一块连续的存储区域中。数据元素的存放位置是通过一个哈希函数计算而得的。哈希函数将数据元素作为自变量,计算得到的函数值是数据元素的存储地址。

【应用】用于支持集合结构的动态查找。


1.3 数据操作

【1】初始化。

【2】判断是否空(isEmpty)状态。

【3】存取,指获得(get)、设置(set)指定元素值。

【4】遍历(traverse),指按照某种次序访问一个数据结构中的所有元素,并且每个数据元素只被访问一次。线性次序遍历。

【5】统计数据元素个数。

【6】插入(insert)、删除(remove)指定元素。

【7】查找(search),指在数据结构中寻找满足给定条件的数据元素。

【8】比较相等(equals),指两个数据结构形态相同,其中各对应元素分别相等并且数据元素个数相等。

【9】复制数据结构(深拷贝)及其中所有元素。

【10】排序(sort),指对数据元素按照指定关键字值的大小递增(或递减)次序重新排列。







推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
智慧曜彰_272
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有