当前位置: 首页 > news >正文

数据结构—表

一、介绍

早期的编程总是说程序就是算法加数据结构,这个有一定的道理。只不过随着后来编程技术的广泛应用,特别是互联网大爆发后,数据结构和算法被深埋到了后端和底层。这才使得很多的开发人员,对数据结构的理解大多停留在应用的层次上。
数据结构有很多种,随着编程技术的不断发展,又出现了不少新的数据结构。特别一些新思想和新概念的出现,新的数据结构也现的也越来越多。但从整体上看,数据结构的本质并没有变即数据集体的关系抽象。从另外一个角度看,数据结构就是降低数据的熵增。

二、表

在互联网的应用中,Table,表作为一种数据结构非常常见。但在实际的应用中,表往往与特定的应用场景或应用方式相绑定。可以这样认为,表作为数据结构没有一个严格的定义,它是一类数据结构的整体的描述即一个具有多重含义的集合的概念。
根据具体的结构、存储方式和约束机制的不同,可以把表为分线性表、哈希表和多维数组(矩阵)表。

三、说明

在上面的分析中知道了表可分为三大类:

  1. 线性表
    线性表是最常见的,它一般指具有相同的数据类型的数据元素的有限序列。如链表、一维数组等等。从物理存储机制来看,线性表分为两类,即顺序存储和离散(链式)存储。线性表的最主要特点就在于有限和有序性,其元素具有同质性和一对一性。。
  2. 哈希表
    有线性表就有非线性表,哈希表就是一种散列表,它是非线性的。一般来说,在开发提及的表往往是指的哈希表。它是通过哈希函数将关键字映射到有限地址集合的一种表。哈希表在互联网上的应用非常广泛,从分布式哈希到树的底层处理都有它的身影
  3. 广义表
    广义表是线性表的一种递归的扩展,虽然它是线程表的扩展,但从严格意义上讲它已经不属于线性表而属于非线性表了。可以理解为一个线性表的内部元素可以是单个元素也可以是元素集合(广义表)。
    在AI和大模型如此流行的现在,则可以从更抽象的层次看待表。体现到具体的应用中,它可以是矩阵也可以是多维数组

其实还有一些叫做表的数据结构,它不属于上面的任何一类,比如Redis中的跳表。可以把这些统统都划成非线性的数据结构中去。另外,还需要注意,往往从不同角度看待数据结构,就会出现不同的分类。这就需要开发者不必纠结于如何划分数据结构而是通过划分掌握数据结构的特点。这才是学习数据结构的目的。
对于传统的数据结构定义来说,非线性的数据结构(而不是非线性表)是普遍的表述,它一般是指图、树等数据结构,它的核心本质是数据结构中的元素是“一对多或多对多”。

四、应用场景

在明白了上述的线性表的分类和定义后,其实就会发现,其应用是非常广泛的。除了传统的链表、队列和栈等基础的数据结构应用。它们还可以组合实现更复杂的数据结构。包括经常使用的一些标准库中的数据结构如Map、树等等。
特别是线性表,其实复杂一些的数据结构底层几乎都需要它来配合实现。比如哈希表,它的冲突解决可以使用链表也可以使用扩大数组的方式。B+树的数据存储时,也可以考虑数组。正如侯老师的话:源码之前,了无秘密。有时间,还是要多看一下源码。

五、C++例程

下面看一个简单的广义表的源码:

#include<iostream>#include<memory>#include<variant>#include<vector>class GeneralizedList{public:using Elem=std::variant<int,std::shared_ptr<GeneralizedList>>;voidaddElemSingle(intv){elems_.push_back(v);}voidaddElemList(std::shared_ptr<GeneralizedList>list){elems_.push_back(list);}voiddisplay()const{std::cout<<"(";for(size_ti=0;i<elems_.size();++i){if(std::holds_alternative<int>(elems_[i])){std::cout<<std::get<int>(elems_[i]);}else{std::get<std::shared_ptr<GeneralizedList>>(elems_[i])->display();}if(i+1<elems_.size()){std::cout<<", ";}}std::cout<<")";}private:std::vector<Elem>elems_;};intmain(){autogList=std::make_shared<GeneralizedList>();gList->addElemSingle(3);gList->addElemSingle(4);autosList=std::make_shared<GeneralizedList>();sList->addElemSingle(7);sList->addElemSingle(8);gList->addElemList(sList);gList->addElemSingle(5);gList->display();std::cout<<std::endl;return0;}

代码没有什么难度,不再分析展开。其它如线性表或哈希表的例子太多了,也不再给出。

六、总结

把基础的知识整理成体系,既可以方便的整理分析,又可以从不同角度来掌握不同技术点间的逻辑关系。这样,在不同的应用场景下就可以灵活的对多种技术进行组合重组,实现更强大的功能。

http://www.jsqmd.com/news/1141521/

相关文章:

  • PIC18F46K40与171010550芯片的DC-DC转换器设计与优化
  • 猫狗识别CNN模型优化:从50x50灰度图到224x224 RGB输入的3步调优实战
  • 终极解决方案:如何用ctfileGet彻底解决城通网盘限速问题
  • Java毕业设计-基于 SpringBoot 的高校实验室预约系统的设计与实现 基于 SpringBoot+Vue 的高校实验室预约管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • TMC7300与MK51DN512CLQ10电机控制方案设计与优化
  • Java毕设项目:景区露营地数字化运营管理系统的设计与实现 露营订单结算与营收数据统计系统 (源码+文档,讲解、调试运行,定制等)
  • 如何高效使用AMD Ryzen调试工具:专业级硬件性能优化完整指南
  • 天龙八部单机版GM工具:5分钟掌握游戏数据管理的终极指南
  • Sunshine终极指南:打造您专属的家庭游戏串流中心
  • 智能突破网盘下载瓶颈:基于本地解析的免会员直链技术实践
  • OBS实时字幕生成插件:让直播内容更易访问的智能解决方案
  • 终极微信聊天记录导出指南:3步轻松备份你的珍贵记忆
  • 5分钟上手SMUDebugTool:AMD Ryzen处理器深度调优全指南
  • 计算机毕业设计之jsp企业移动办公工作平台的设计与实现
  • EPS到SBW:4代转向系统技术演进与2024年市场格局分析
  • SMUDebugTool完整指南:解锁AMD Ryzen处理器的硬件级调试能力
  • CT图像伪影识别指南:5类常见伪影(条纹/环形/金属)的成因与临床影响
  • STM32与TMC7300实现高效直流电机控制方案
  • HarmonyOS技术精讲-Image Kit:元数据写入与编辑 - 修改、删除EXIF
  • 【终极解决】VSCode 1.97.2 中Python Ctrl+鼠标左键函数跳转失效、Pylance 不生效(离线环境)
  • 【Springboot毕设全套源码+文档】基于SpringBoot+Vue的中青年人员招聘平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • STM32与KMR221数字电位器构建高精度电压管理系统
  • ICM-42605与PIC32MZ运动跟踪系统设计与实现
  • 【Java毕业设计】露营营地资源运维与预约管控系统的设计与实现 户外营地套餐销售与用户预订系统(源码+文档+远程调试,全bao定制等)
  • Windows本地实时语音转文字终极指南:TMSpeech完全使用手册
  • Kendall‘s W 系数实战:Python scipy 与 R DescTools 0.99.60 双平台计算与结果解读
  • 3分钟快速上手:Windows本地实时语音转文字工具的完整实战指南
  • 3步解锁QQ音乐加密文件:QMCDecode免费工具终极指南
  • 文献综述写到崩溃?2026年AI文献综述生成全流程解析
  • 告别错过直播的遗憾:50+平台一键录制工具深度评测