探索数据结构

什么是数据结构

数据结构是由:“数据”与“结构”两部分组成

数据与结构

数据:如我们所看见的广告、图片、视频等,常见的数值,教务系统里的(姓名、性别、学号、学历等等);

结构:当我们面对海量的数据时,我们时常无法下手,寻找数据是不方便的,可读性就很差;而结构则是将这些数据以各种不同的形式进行排序,使我们便于寻找;

数据结构:是计算机存储、组织数据的方式。是数据之间存在一种或多种相互关系的集合;

什么是算法

算法(Algorithm)就是定义良好的计算过程,他取出一个或一组数据为输入,产出一个或一组的值为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

算法一般分为:排序,递归与分治,回溯,DP,贪心,搜索算法、二分查找、水桶法等等;

  • 算法往往数学密切相关,就如数学题一样,每道数学题都有不同的解法,算法也是同理

复杂度分析

我们如何评判算法的效率呢,问题的解决方法有很多,对于计算机而言,我们需要找到问题的最优解,为了寻找到这个最优解,我们需要从两个维度评判

  • 时间效率:算法运行的快慢
  • 空间效率:算法所占空间的大小

评估方法:实验分析与理论分析

对于实验分析而言:

  • 相同的算法在不同的电脑,它们所运行的时间也许会有很大的出入;
  • 当面对大量的数据而言,同一台电脑时间上的差距则会变为很大,导致误差的增大;
  • 有些算法在少量数据时运算速度不快,在大量数据中反之;

由于实验分析法的局限性,就有人提出了一种理论测评的方法,就是渐近复杂度分析(asymptotic complexity analysis),简称复杂度分析

这种方法体现算法运行所需的时间(空间)资源与输入数据大小之间的关系,能有效的反应算法的优劣。

时间复杂度与空间复杂度

时间复杂度

指一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。让我们计算下方代码的时间复杂度

int main()
{int n=10;//对于时间复杂度而言,当数据为n时,下方代码区,运行次数10,时间复杂度为O(n)while (n--) {printf("%d", n);}//在时间复杂度中,我们会忽略除最高次的所有项//忽略所有系数return 0;
}

实际上我们不可能对执行次数的统计精确,并且为理论分析,当n->∞时,最高次的影响会远远超过非最高次的项,所以O(n)的数量级由最高次决定,所以当我们计算时间复杂度时,可以简化为以下两个步骤

  • 忽略除最高次的所有项
  • 忽略所有系数
思考:

当我们遍历下方数组,查找2时,我们需要4次;

当长度为n的数组中存放的是无序自然数时,他们是没有规则的,此时我们查找2的次数:[ 1 , n ]

此时我们需要将最坏的情况作为时间复杂度

空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度的表示也遵循大O的渐进表示法

让我们计算一下冒泡排序的空间复杂度

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}//在冒泡排序中,我们只开辟了一块空间,所以空间复杂度为O(1);

复杂度的分类

算法的复杂度有几个量级,表示如下:

O(1)<O(logN)<O(N)<O(NlogN)<O(N2)<O(2N)<O(N!)

如图下列: 

常数阶O(1)
int main()
{int n = 4;while (n--) {printf("%d", n);//执行次数为常数}return 0;
}
对数阶O(logn)
int binary_search(int nums[], int size, int target)
//nums是数组,size是数组的大小,target是需要查找的值
{ int left = 0;int right = size - 1;	// 定义了target在左闭右闭的区间内,[left, right]while (left <= right) {	//当left == right时,区间[left, right]仍然有效int middle = left + ((right - left)>>1);//等同于 (left + right) / 2,防止溢出if (nums[middle] > target) {right = middle - 1;	//target在左区间,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1;	//target在右区间,所以[middle + 1, right]} else {	//既不在左边,也不在右边,那就是找到答案了return middle;}}//没有找到目标值return -1;
}
线性阶O(n)
int main()
{int n;scanf("%d", &n);int court = 0;for (int i = 0; i < n; i++) {court += i;//计算和}return 0;
}
以下为空间复杂度为O(n)
int main()
{int n;scanf("%d", &n);int* p = (int*)malloc(sizeof(int) * n);//开辟大小为n的空间if (p == NULL){perror("malloc fail");return -1;}free(p);p = NULL;}
线性对数阶O(nlogn)

无论是时间复杂度还是空间复杂度,线性对数阶都是在循环嵌套里实现,即为一层为O(n),另一层为O(logn);

所以我们可以利用二分查找+打印

int binary_search(int nums[], int size, int target) //nums是数组,size是数组的大小,target是需要查找的值
{int left = 0;int right = size - 1;	// 定义了target在左闭右闭的区间内,[left, right]while (left <= right) {	//当left == right时,区间[left, right]仍然有效int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出if (nums[middle] > target) {right = middle - 1;	//target在左区间,所以[left, middle - 1]}else if (nums[middle] < target) {left = middle + 1;	//target在右区间,所以[middle + 1, right]}else {	//既不在左边,也不在右边,那就是找到答案了printf("%d ", nums[middle]);}}//没有找到目标值return -1;
}void func(int nums[], int size, int target)
{for (int i = 0; i < size; i++){binary_search(nums, size, target);}
}
平方阶O(n)

莫过于我们最为熟悉的冒泡排序

void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}
指数阶O(2^n)

指数阶的算法效率低下,并不常见

最为常见的指数阶为递归实现斐波那契数列

int Fib1(int n)
{if (n == 1 || n == 2){return 1;}else{return Fib1(n - 1) + Fib1(n - 2);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019723.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

远动通讯屏功能和作用

远动通讯屏功能和作用 首先大家要先了解&#xff0c;什么叫远动通讯&#xff1f;远动通讯是电力系统指用于远程通信和远程控制的设备。它主要采集电发场站的电气运行参数与远程调度监控中心进行数据交互&#xff0c;并接收调度中心远程的指令控制。提高电力系统的运行效率和可靠…

使用perf查看热点函数和系统调用最大延迟函数

1、安装perf工具 1.1、ubuntu 18.04 x86下的安装 安装sudo apt install linux-source sudo apt install linux-tools-uname -r # ubuntu 18.04虚拟机实操可行 1.2、ubuntu 18.04 ARM下的安装 参考 Nvidia Jetson系列产品安装Perf ​ARM64版本的Ubuntu上安装perf 与参考文…

汽车灯罩使用聚碳酸酯(PC)和PMMA(亚克力)哪个更好?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩使用聚碳酸酯&#xff08;PC&#xff09;和PMMA&#xff08;亚克力&#xff09;哪个更好&#xff1f; 聚碳酸酯&#xff08;PC&#xff09;和PMMA&#xff08;亚克力&#xff09;都是汽车灯罩常见的材质&#xff0c;它们各自具有独特的优点和特性&#xff0c;因此选择…

更专业的汽车软件研发工具链,怿星重磅发布新产品

怿星科技在2024北京国际车展同期举办主题为“创新引领未来——聚焦智能汽车软件新基建”的新产品发布会&#xff0c;重磅推出1款绝对优势产品和4套场景解决方案。同时举行了4场热点技术研讨&#xff1a;国产工具链的机遇与挑战、新架构下的的车载DDS应用探索及测试方案介绍、软…

微店商品详情API接口:打造个性化电商体验的利器

前言 随着电子商务的快速发展&#xff0c;越来越多的商家开始注重线上店铺的个性化建设和用户购物体验的优化。在这个过程中&#xff0c;API&#xff08;应用程序接口&#xff09;技术发挥着至关重要的作用。本文将重点介绍微店商品详情API接口&#xff0c;探讨其如何帮助商家提…

高压开关柜局部放电监测装置APD

安科瑞薛瑶瑶18701709087/17343930412 APD系列高压柜局部放电监测装置通过检测伴随局部放电而产生的电磁波辐射&#xff0c;实时监测的开关柜内局部放电的放电次数和放电频次等数据&#xff0c;对电气设备绝缘状况进行评估&#xff0c;发现设备潜伏性故障&#xff0c;最终实现…

docker 方式 elasticsearch 8.13 简单例子

安装 docker 虚拟机安装 elastic search 安装本地 # 创建 elastic 的网络 docker network create elastic # 用镜像的方式创建并启动容器 docker run -d --name es --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e "xpack.secur…

API开发淘宝(京东)API接口:获取淘宝京东等平台数据的api接口分享

接口应用场景——电商产品定价 电商平台产品的定价问题是很多品牌非常重视的一个问题&#xff0c;产品的定价取决于很多因素&#xff0c;包括成本、供需情况、促销策略及竞争对手的价格等。因此&#xff0c;想要更合理地定价&#xff0c;品牌需要获取到影响产品定价的各类数据&…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了…

团队执行力差,多半都是管理的问题

在日常管理中&#xff0c;我们习惯用“执行力好不好”来评价一个团队的表现&#xff0c;但实际上&#xff0c;执行力更应该是一个管理者需要思考和解决的问题&#xff0c;而非单纯归咎于团队。 我们需要明确一点&#xff1a;执行力不是团队的问题&#xff0c;而是管理者的问题…

比亚迪CAN数据实时监控分析应用数字化差异化的决策价值洞察

在当今这个信息化飞速发展的时代&#xff0c;汽车数字化转型已成为企业持续竞争力的关键。中国新能源汽车行业的领军企业——比亚迪&#xff0c;其数字化之旅充分展现了企业的创新精神和对未来的深远洞察。 比亚迪的数字化战略不是简单的技术应用&#xff0c;而是一场深刻的商…

C++奇迹之旅:string类对象的容量操作

文章目录 &#x1f4dd; string类的常用接口&#x1f309; string类对象的容量操作&#x1f320;size&#x1f320;length&#x1f320;capacity&#x1f320;clear&#x1f320;empty&#x1f320;reserve&#x1f309;resize &#x1f6a9;总结 &#x1f4dd; string类的常用…

大数据集成平台建设方案-word原件资料

基础支撑平台主要承担系统总体架构与各个应用子系统的交互&#xff0c;第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上&#xff0c;实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台&#xff0c;提出了以下要求&#xff1a; (1) 基于平台的基础架构&…

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀&#xff08;暴⼒求解&#xff09;&#xff08;可能会超时&#xff09;&#xff1a; 算法思路&#xff1a; 算法代码&#xff1a; 4.解法⼆&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 以输入: nums …

多个glibc库存在时如何查看ldd调用的哪个

但是发现存在多个版本的glibc版本&#xff0c;需要查看具体的库的信息&#xff0c;和相应的关键函数的信息&#xff0c;但是并不知道具体的libc.so.6的路径信息 rootalg-dev04:~/xingqiao# ldd --version ldd (GNU libc) 2.29 rootalg-dev04:/opt# which ldd /usr/local/bin/…

硬件基础——晶振(复试被问到)

1.什么是晶振 石英晶体振荡器&#xff0c;是芯片的心脏&#xff0c;主要用于提供给芯片稳定、精确的时钟频率信号。其主要利用石英晶体的压电效应&#xff0c;从而实现振荡。 一般晶振会在芯片的旁边&#xff0c;不能远离晶振&#xff0c;因为振荡时会受外界电磁干扰的影响。 我…

LLM——大语言模型完整微调策略指南

1、 概述 GPT-4、LaMDA、PaLM等大型语言模型&#xff08;LLMs&#xff09;以其在广泛主题上的深入理解和生成高度类人文本的能力而闻名遐迩&#xff0c;它们在全球范围内引起了广泛关注。这些模型的预训练过程涉及对来自互联网、书籍和其他来源的数十亿词汇的海量数据集进行学…

如何阅读:一个已被证实的低投入高回报的学习方法的笔记

系列文章目录 如何有效阅读一本书笔记 如何阅读&#xff1a;一个已被证实的低投入高回报的学习方法 麦肯锡精英高效阅读法笔记 读懂一本书笔记 文章目录 系列文章目录第一章 扫清阅读障碍破解读不快、读不进去的谜题一切为了阅读小学教师让你做&#xff0c;但中学老师阻止你做的…

ffmpeg ubuntu18.04编译报错fcntl64

fcntl&#xff0c;fcntl64均是系统的api提供的文件操作&#xff0c;fcntl64本来是用来解决操作大文件的问题&#xff0c;后面fcntl本身已经解决了这个问题&#xff0c;fcntl64就被舍弃了 系统环境信息&#xff1a; ubuntu 18.04 root# cat /etc/issue Ubuntu 18.04.6 LTS \n…

DLP数据防泄密软件推荐盘点:防泄密软件厂商

数据防泄密软件在当今的数字化时代扮演着至关重要的角色。随着信息技术的迅猛发展&#xff0c;企业、组织乃至个人面临着日益严峻的数据安全挑战。数据防泄密软件应运而生&#xff0c;为信息安全领域筑起了一道坚实的防线。以下是五款备受推崇的数据防泄密软件&#xff0c;它们…