数据结构初阶 —— 数据结构概述

Java中的数据结构(一) 既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。 阅读详情

目录

一,数据结构(Data Structure)

数据的逻辑结构

数据的存储结构

八类常见数据结构

 二,算法(Algorithm)

时间复杂度

空间复杂度

三,案例

冒泡排序

二分查找

阶乘递归

斐波那契递归


数据结构 + 算法 = 程序

数据,被计算机处理的符号或操作的对象;

数据元素,数据结构中基本的独立单元,可由若干个数据项组成;

数据对象,系统数据元素的集合,是数据的子集,通常简称数据对象为数据;

一,数据结构(Data Structure)

  • 是计算机存储、组织数据的方式;
  • 是数据元素的集合,数据元素相互之间存在一种或多种特定关系;
  • 不同种类数据结构适用于不同种类应用,合适的数据结构可带来高效运行和存储;
数据的逻辑结构

反应数据元素间的逻辑关系(逻辑关系即数据元素间的前后关系);

  • 集合:数据元素间“同属一个集合” ,但元素间相互孤立; 
    • 数据元素无序且唯一;
  • 线性结构:数据结构中的元素存在一对一的相互关系;
    • 仅有一个起始结点和终端结点,所有结点最多一个前驱和后驱结点;
    • 包括数组、链表,及串string(特殊线性表),栈stack(特殊线性表)、队列queue(特殊线性表); 
  • 树形结构:数据结构中的元素存在一对多的相互关系;
    • 包括二叉树(最简单)、多叉树、字典树等;
  • 图形结构:数据结构中的元素存在多对多的相互关系;
    • 复杂的非线性结构,由顶点(或结点)和边组成;
    • 包括无向图、有向图、连通图等;

按逻辑简单分类:线性结构、非线性结构;

数据的存储结构

在计算机存储空间中的存放形式;

  • 顺序存储、链式存储、索引存储和哈希存储等;

顺序存储结构

  • 数据元素存放在连续地址,其逻辑关系可通过存储地址直接反映;
  • 逻辑相邻的元素,在物理地址上也相邻;
  • 优:简单易理解,且占用空间最少,可随机存取;
  • 缺:需连续存储空间,且要事先分配,对一些操作时间效率较低(如移动、删除等);

链式存储结构

  • 数据元素可存放任意地址,可连续也可不连续;
  • 数据元素间的逻辑关系是通过指针间接反映;
  • 逻辑相邻的元素,在物理地址上不一定相邻;
  • 优:存储空间不必事先分配,可临时申请不浪费空间,一些操作时间效率较高(插入、移动、删除)
  • 缺:需额外存储指针,比顺序结构空间开销大,只可顺序存取;

索引存储结构

  • 存储数据元素时,附加建立索引表;
  • 索引表中每一项称为索引项(形式为:关键字,地址);
  • 优:检索速度快;
  • 缺:需额外存储索引表,在增加、删除数据时需修改索引表;

散列存储结构

  • 根据元素关键字直接计算出存储地址;
  • 优:检索、增加、删除操作快;
  • 缺:散列函数可能出现存储单元冲突;
八类常见数据结构
  • 线性数据结构

    • 数组(Array)

    • 链表(Linked List)

    • 栈(Stack)

    • 队列(Queue)

  • 非线性数据结构

    • 树(Tree)

    • 堆(Heap)

    • 散列表(Hash)

    • 图(Graph)

 二,算法(Algorithm)

  • 是对特定问题求解步骤的一种描述,是一系列指令的集合,每一条指令表示一个或多个操作;
  • 表达某一类计算问题的一般方法,对任何一个输入,可按步骤一步一步计算最终产生输出;

算法特征

  • 有穷性(Finiteness),指算法必须能在执行有限个步骤之后终止;
  • 确切性(Definiteness),算法的每一步骤必须有确切的定义,不能产生二义性;
  • 可行性(Effectiveness),执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性);
  • 输入项(Input),一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
  • 输出项(Output),一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

数据对象的运算和操作

算法要求

  • 正确性
  • 可读性
  • 健壮性
  • 简单性
  • 时间效率高而且空间使用率低

算法效率

  • 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率;
  • 衡量一个算法的好坏,时间复杂度和空间复杂度;
//问题规模N
void Func1(int N)
{
	int count = 0;
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < N; ++j)
		{
			++count;
		}
	}

	for (int k = 0; k < 2 * N; ++k)
	{
		++count;
	}

	int M = 10;
	while (M--)
	{
		++count;
	}
	printf("%d\n", count);
}

以上Func1 执行的基本操作次数:

        F(N)=N^2+2*N+10

时间复杂度
  • 计算基本运算的执行次数,t(n) = O(f(n));
    • 表示随问题规模n增大,算法执行时间的增长率和f(n)的增长率正相关;
  • 实际中只需计算大概的执行次数,即大O渐进表示法;

大O渐进表示法(即去掉了那些对结果影响不大的项)

  • 用常数1取代运行时间中的所有加法常数;
  • 在修改后的运行次数函数中,只保留最高阶项;
  • 如最高阶项存在且不是1,则去除与这个项相乘的常数;

使用大O的渐进表示法,Func1的时间复杂度为:  O(N^2)

常数阶:O(1)

  • 基本运算次数与问题规模无关;
  • O(1)不代表1次运算;

常用的算法时间复杂度的关系:

  • O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!) 

注:另外有些算法的时间复杂度存在最好、平均和最坏情况,在实际中一般情况关注的是算法的最坏运行情况;

空间复杂度
  • 算法在运行过程中临时占用的空间的度量,一般也是问题规模n的函数s(n) = O(g(n));
  • 函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
  • 空间复杂度不是程序占用了多少空间,算的是变量的个数; 空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
  • 算法的时间复杂度和空间复杂度相互影响,好的时间复杂度也可能会占用较多的存储空间;

方法

  • 递推法

  • 递归法

  • 穷举法(暴力破解法)

  • 贪心算法

  • 分治法

  • 动态规划法

  • 迭代法

  • 分支界限法

  • 回溯法

三,案例

冒泡排序

时间复杂度

  • 最好O(N),平均O(N^2),最差O(N^2); 
  • N+(N-1)+(N-2)+...+1 (最后一次判断以不满足条件)

空间复杂度

  • 使用了常数个额外空间,O(1);
//冒泡排序
void BubbleSort(int* parr, int sz)
{
	assert(parr);
	int i = 0;
	for (i; i < sz - 1; i++)
	{
		int j = 0;
		int flag = 0;
		for (j; j < sz - 1 - i; j++)
		{
			if (parr[j] > parr[j + 1])
			{
				int tmp = parr[j];
				parr[j] = parr[j + 1];
				parr[j + 1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}
二分查找

时间复杂度

  • 最好O(1),最差O(logN); 
  • 1 = N/2^x 

空间复杂度

  • 使用了常数个额外空间,O(1);
//二分查找,要求有序数列
int BinarySearch(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
		int mid = begin + ((end - begin) >> 1);
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid;
		else
			return mid;
	}
	return -1;
}

阶乘递归

时间复杂度

  • O(N) ;
  • 时间复杂度 = 递归次数的累加;

空间复杂度

  • O(N);
long long Fac(size_t N)
{
 if(1 == N)
 return 1;

 return Fac(N-1)*N;
}
斐波那契递归

时间复杂度

  • O(2^N) ;
  • 2^0+2^1+2^2+...+2^(n-3)+2^(n-2) = 2^(n-1)-1

空间复杂度

  • O(N)
long long Fib(size_t N)
{
 if(N < 3)
 return 1;

 return Fib(N-1) + Fib(N-2);
}

数据结构概述题库 网络课课后题 1、关于算法特性描述正确的有: A、算法保证计算结果的正确性 B、组成算法的指令可以有限也可能无限 C、算法描述中下一步执行的步骤不确定 D、算法的有穷性指算法必须在有限步骤内结束 解析 算法保证计算结果的正确性。 指令必须有限 算法具有确定性 算法不能含有死循环,必须在有限步骤内结束 2、以下哪种结构是逻辑结构,而与存储和运算无关: A、队列(q... 阅读详情

相关推荐

用 Scalable Delivery 打造可规模化交付的 ABAP Cloud 扩展:规则、合规、责任边界与认证路线

摘要:本文深入解析了SAP S/4HANA Cloud中面向合作伙伴的scalable delivery扩展开发模式。文章系统阐述了该模式的核心价值(标准化交付与升级稳定性)、技术范围限制(仅支持ABAP Cloud开发)、合规要求(必须使用released API和扩展点)以及工程实践(软件组件组织与托管构建)。特别强调了clean core原则的具体落地方法,包括RAP业务对象建模和OData服务交付的最佳实践。通过真实场景分析,展示了如何平衡交付效率与合规要求,为合作伙伴提供可规模化分发的ABAP C

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1936

什么是线性和非线性 线性与非线性的区别

1. 线性linear,指量与量之间按比例、成直线的关系,在数学上可以理解为一阶导数为常数的函数;    非线性non-linear则指不按比例、不成直线的关系,一阶导数不为常数。 2. 线性的可以认为是1次曲线,比如y=ax+b ,即成一条直线    非线性的可以认为是2次以上的曲线,比如y=ax^2+bx+c,(x^2是x的2次方),即不为直线的即可 3. 两个变量之间

zy3381的专栏 2万+

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 545

[数据结构]

数据结构

yc_Cabbage的博客 436

平衡小车动力学建模

两轮自平衡小车由车体和双轮两部分组成,可以看成一个移动的倒立摆,分别对车轮和车体进行力学分析,建立动力学模型,最后,通过对两者的分析给出系统的状态空间表达式。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjiPEUVJ-1679470559950)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20230322110521545.png)]

qq_23096319的博客 9053

CPG控制网络入门

从线性变换开始推导

妖米的博客 5043

数据结构“入门”—树与二叉树

本文主要讲的是树与二叉树的基本理论知识。

weixin_60718941的博客 557

Ansys Zemax实战:5步搞定多模光纤耦合效率优化(附IMAE操作数详解)

本文详细介绍了使用Ansys Zemax优化多模光纤耦合效率的5个关键步骤,包括几何图像分析设置、IMAE操作数应用及偏振效应处理。通过实战案例解析,帮助工程师快速掌握光纤耦合效率提升技巧,特别针对IMAE操作数的配置保存机制和菲涅尔损耗控制进行深度讲解。

potato的博客 690

数据结构初阶 —— 树概述

树概述,二叉树!

NapoleonCoder的博客 1507

JavaFx 教程

JavaFx 教程

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 784

【3天快速入门WPF】1-从最简单的xaml开始

首先我们要知道xaml语法中声明即定义,意思就是“见到元素就相当于创建实例”,MainWindow.xaml的主干是一个元素里包含着一个 元素。这段程序就是在定义一个Window类的实例,这个实例的一个组成部分是一个Grid类的实例。

Zy100Papa的博客 1623

数据结构初阶

介绍了一些基础的数据结构

2403_88316985的博客 1060

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 778

《数据结构初阶》【时间复杂度 + 空间复杂度】

这博主是不是又打算挖个坑就跑?,(因为这个博主之前挖过:《C语言系列》、《算法基础》、《算法精讲》这些坑,其中《C语言系列》的坑都长草了吧?🤔,今天又打算再一个新坑吗?博主先在这里声明一下:博主是一个有头有尾有始有终的人,"你们要相信我!每一个坑都是真爱!只是它们……在等一个合适的时机成熟!🫠例如:《C语言系列》还剩下:“复合结构体 + 文件操作” 这两部分的内容的没有更新,博主预估想完结《C语言系列》至少还需要4篇博客,由于博主现在的重心不是学习C语言,所以可能会鸽很久。

序属秋秋秋的博客 1812

yolov26改进 | 融合改进篇 | 轻量级移动端网络ShuffleNetV2融合CCFM参数量仅百万(附代码+修改教程)

本文介绍ShuffleNetV2与跨尺度特征融合模块CCFM融合改进的YOLOv26。ShuffleNetV2以硬件效率为导向,通过通道分割、轻量卷积和Channel Shuffle减少冗余计算与内存访问,在降低参数量和GFLOPs的同时保持高效特征提取;CCFM进一步加强不同尺度特征交互,弥补轻量主干语义表达不足的问题。本人在轻量模型上测试后,参数量和计算量明显下降,检测精度有一定提升,适合移动端、边缘设备及实时检测任务。文中提供完整代码、配置文件、模块注册及Codex修改思路,方便复现、对比和二次创新。

Snu77的博客 197

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《数据结构初阶》【番外篇:二路归并的外排史诗】

本文主要介绍外部排序中的多路归并算法,特别是二路归并排序的实现。文章分为理论介绍和实践实现两部分。本文通过理论结合实践的方式,帮助读者掌握大文件外部排序的核心技术。

序属秋秋秋的博客 1781

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

《数据结构初阶》【链式二叉树】

博客内容主要划分为:数据结构的介绍+数据结构的实现。主要涉及的数据结构:链式二叉树(内容绝对详实!!!)

序属秋秋秋的博客 2216

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

博客内容主要划分为:数据结构的介绍 + 数据结构的实现。主要涉及的数据结构:顺序表、单链表、双向链表。

序属秋秋秋的博客 2536

数据结构初阶——单链表

返回值是一个结构体类型指针。通过malloc动态开辟一个内存为SLTNode结构体大小的空间,该结构体指针newnode指向这块空间。然后判断malloc是否成功,返回值不为空就将其中存放数据位置赋值为目标值,再将存放指针位置置空,方便后续链接。

关注学习C++领域,感谢陪伴,共同进步! 1439

数据结构与算法初阶思维导图

数据结构初阶相关知识点总结:

一个金牛座 的程序员 518

【C++】STL和模板初阶

STL和模板初阶,干货满满,函数模板,类模板

2401_84538476的博客 6402

「数据结构_初阶」序

大一结束,暑假计划利用两周时间对数据结构初阶进行了较深入的学习,学校下学期才开这门课程,算是提前进行了预习,计划的学习节奏大致为每天上午9:30~12:30系统学习知识,下午2:30到5:30做题+思考。 到今天截止数据结构初阶的内容我已经全部学习完成用时刚好两周(7.16~7.29)。打算开始总结这两周学到的东西,加强记忆同时加深对数据结构的理解,我的学习顺序是从时间、空间复杂度到排序,这次的复...

NanlinW的博客 308

c++基础入门和数据结构初阶(1)

c++基础入门以及数据结构哦初阶--复杂度

2402_86667364的博客 1231

数据结构初阶:排序大法

排序对于程序员对数据结构的理解和运用都有很大的提升,我们今天所学在以后的工作事件中可以有着很多的应用,例如游戏中一键整理背包物品,网页中搜索内容的排序啊,这些都是排序的应用,也许他们的逻辑更加复杂,但底层的逻辑仍然是初阶排序好的,这节结束,对于基本的排序方法我们都能有一个大概的了解,但是别人说多讲多,都不如自己敲一敲代码尝试一下,只有真正靠自己写出来代码,知识才是落到实处,加油吧,希望能有所收获图片来自网络。

2402_89177355的博客 1004

【数据结构】励志大厂版·初阶(复习+刷题):复杂度

此篇文章作为小编刷题的记录!内容排版简洁、易懂,对于小白玩家来说通过看解析也可以清楚的看懂!如果在阅读中发现哪里有错误,希望伙伴们可以提醒我修改哦!小编一定通过建议来优化质量!

月亮永悬不落,剑指巅峰 6143

算法复杂度(数据结构初阶)

数据结构初阶(算法复杂度)

2402_87779153的博客 1324
上一篇: 完全自学C(干货) —— 编译与链接
下一篇: 数据结构初阶 —— 线性表(顺序表/链表)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值