【追求卓越01】数据结构--数组

引导

        这一章节开始,正式进入数据结构与算法的学习过程中。由简到难,先开始学习最基础的数据结构--数组。

        我相信对于数组,大家肯定是不陌生,因为数组在大多数的语言中都有,也是大家在编程中常常会接触到的。我不会说数组有多困难,但是它绝对不是像我们所想的那么简单而已。

        带着问题进入今天的课题:为什么数组的下表从0开始,而不是从1开始

什么是数组

        我们还是从专业的角度来介绍一下数组:数组是一种线性表数据结构。它用一组连续的内存空间,来储存一组相同类型的数据。其中有几个知识点是需要我们了解的。

第一点是线性结构的概念。线性结构具有以下几个特点:

  1. 有唯一的首元素
  2. 有唯一的尾元素
  3. 除了首元素,所有的元素都有唯一的前驱
  4. 除了尾元素,所有的元素都有唯一的后继
  5. 数据元素之间存在“一对一”的关系

只要不满足以上特点的,就是非线性表。

常见的线性结构有:栈,数组,队列,堆,链表

常见的非线性结构有:树,图

        第二点是连续的内存空间和相同类型的数据结构。这两点正是数据数组强大的主要原因--高效的访问操作(随机访问)。我们知道数组在查询操作中具有很高的效率。但是原因是什么呢?我们一起来分析一下。

        例: 我们定义一个int 类型的数组,长度为10。假设首地址是base_address是1000。,那么它在内存中的分布应该如下图:

        比如我现在要访问数组中第5个数据a[4] (数组下标从0开始)。操作系统就会从 base_address+4*sizeof(int) 地址进行取值。正是通过这个公式实现数组的随机访问

        其实在这里,我们就可以回答刚开始导入的问题了:为什么数组的下表从0开始,而不是从1开始?

原因有二:

  1. 我们知道数组的随机访问是通过base_address+i*sizeof(data_type_size)公式计算的。如果数组的下表从1开始,数据在内存中的分布是不会改变的。上面的例子就是:访问数组中第5个数据a5。操作系统就会从base_address+(i-1)*sizeof(data_type_size)这个地址进行取值。相对于上面的公式,多了一个减法操作。(这种常用操作,对于CPU而言,性能的提升可能是很大的)。但这并不是主要原因,因为也有语言中数组的下表不是从0开始。
  2. 历史原因,因为C语言作为最早出现的高级语言,它的数组下标就是从0开始的。后面java等其它高级语言在创建之初,就继承了这一特性。(大部分人都已习惯从0开始)

数组的增删查

        数组的最大优势就是高效的查询。但是这其中也存在一定的坑。比如:数组的查询复杂度是O(1)。这句话是正确的吗?

错误的,因为即使是有序的数组,采用二分法。查询的复杂度也应该是O(logn)。准确的说法应该是:数组根据下标查询的复杂度是O(1)

数组的增加和删除是比较低效的操作了。因为增加一个或者是删除一个你要保证内存数据的连续性。

数组的越界

        数组的越界总是会发生一些意想不到的问题。我们看分析一下该代码,看看是什么现象。

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}

        现象是无限的打印“hello world”。我相信代码的错误点,大家肯定是知道的————数组越界访问。但是为什么会造成无限打印呢?这需要了解linux 虚拟内存分布以及栈的概念了。

        我们首先要知道linux进程的虚拟内存为4G,并且不同的地址分配着不同的资源。可参考下图:

其中各个空间分布,我就不再赘述了。只介绍该题需要分析的栈。需要注意以下几点:

  1. 栈也是一个数据结构,它的特点是先进后出。
  2. 并且它是向下连续增长的
  3. 一个线程中,是共享一个栈的。(线程中的栈大小是有限制)

我们知道局部变量是分布在栈中的,根据上面的代码,我们可以开始分析。

  1. int i=0;//i变量入栈,假设地址为1000
  2. int arr[3]={0};//arr数组入栈,arr[0]地址为988,arr[1]地址为992,arr[2]地址为996。

        分析到这里,我们就知道了,当访问arr[3]时,计算机根据base_address+3*data_type_size公式,实际上访问的是i变量,将i设置为了0,导致重新循环开始。所以一直无限打印“hello world”。

总结

        该篇简单介绍了数组这个数据结构。分析了它为什么能够实现随机访问。以及数组越界可能会带来的一些问题。数组比较适合用来查询,但是删除和增加,就比较低效了。

        对于超级大的数组,每次删除都会搬移其它数据。如果删除操作比较频繁。那么就是比较低效的。为了减少搬移数据的次数,我们可以将删除的变量进行标记(已使用或未使用),当内存不足时,再进行释放。这样就减少了搬移次数,提高效率。其实这也是JVM标记清除垃圾算法的思想。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebP 相对于 PNG、JPG 有什么优势?

新的东西&#xff0c;还没有普及&#xff0c;但绝大多数浏览器已兼容了 WebP 是一种由 Google 开发的图像格式&#xff0c;相比于 PNG 和 JPG 格式有以下几个优势&#xff1a; 更小的文件大小&#xff1a;相同质量下&#xff0c;WebP 格式的文件大小比 PNG 和 JPG 格式都要小得…

蝶恋花

《蝶恋花》 作家&#xff0f;罗光记 华灯初上&#xff0c;夜色阑珊&#xff0c;轻风微起&#xff0c;落英缤纷。正是春意盎然之时&#xff0c;蝴蝶翩翩起舞&#xff0c;花间留恋。此情此景&#xff0c;不禁令人感叹&#xff1a;“蝶恋花&#xff0c;花恋蝶&#xff0c;人间至…

《数据仓库入门实践》

前言&#xff1a; 1、问什么要写这篇博客&#xff1f; 随着自己在数仓岗位工作的年限增加&#xff0c;对数仓的理解和认知也在发生着变化 所有用这篇博客来记录工作中用到的知识点与经验 2、这篇博客主要记录了那些内容&#xff1f; 在日常工作中&#xff0c;发现刚接触不久数仓…

jQuery实现横版手风琴效果

一、实现效果 当鼠标滑过方块的时候&#xff0c;方块的状态就会发生如下图所示的变化&#xff0c;同理当鼠标滑到其他的方块也会发生同样的效果&#xff0c;不仅大小会改变同时方块的颜色也会跟着发生变化&#xff1a; 二、代码实现 <!DOCTYPE html> <html><h…

opencv-python读取的图像分辨率太大不能完全显示

如果使用OpenCV-Python读取的图像分辨率太大&#xff0c;无法完全显示在屏幕上&#xff0c;可以考虑以下几种方法&#xff1a; 1.缩放图像&#xff1a;使用OpenCV的resize函数&#xff0c;将图像缩小到适合屏幕显示的大小。例如&#xff0c;可以将图像的宽度和高度都缩小到屏幕…

笔记58:Encoder-Decoder 架构

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a

121. 买卖股票的最佳时机 --力扣 --JAVA

题目 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利…

SpringBoot 导入其他配置文件

默认情况下&#xff0c;springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件&#xff0c;如果我们希望再定义一个独立的配置文件用来配置特定业务数据&#xff0c;而不希望把这些配置内容都堆积在 application 配置文件中&#xff0c;实现这个需…

python命令行交互 引导用户选择宠物

代码 以下代码将在命令行中&#xff0c;引导用户选择一个或者多个宠物&#xff0c;并反馈用户选择的宠物 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/22 15:19 file: 在命令行中引导用户选择宠物.py desc: xxxxxx &qu…

蓝桥等考C++组别七级007

第一部分:选择题 1、C++ L7 (15分) 执行以下程序后,输出结果是( )。 int a = 5; int b = a++; cout << a << " " << b; A. 5 5 B. 5 6 C. 6 5 D. 6 6 正确答案:C

好题分享(2023.11.12——2023.11.18)

目录 ​ 前情回顾&#xff1a; 前言&#xff1a; 题目一&#xff1a;《有效括号》 思路&#xff1a; 总结&#xff1a; 题目二&#xff1a;《用队列实现栈》 思路&#xff1a; 总结&#xff1a; 题目三&#xff1a;《用栈实现队列》 思路&#xff1a; 总结 &#x…

WPF实战项目十五(客户端):RestSharp的使用

1、在WPF项目中添加Nuget包&#xff0c;搜索RestSharp安装 2、新建Service文件夹&#xff0c;新建基础通用请求类BaseRequest.cs public class BaseRequest{public Method Method { get; set; }public string Route { get; set; }public string ContenType { get; set; } &quo…

Node.js之http模块

http模块是什么&#xff1f; http 模块是 Node,js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;就能方便的把一台普通的电脑&#xff0c;变成一台Web 服务器&#xff0c;从而对外提供 Web 资源服务。 如果我们想在node…

API文档转实体类脚本

工作遇到接口文档实体类内容很多&#xff0c;就写了一个简单的脚本&#xff0c;在此记录一下 //根据 接口文档栏位项目名称 中文名称 补充说明 生成XMLmodel类//每行以$$$开头 第一列为$$$public static void generateCommonApiModel(String str) {int indexOfPP 0;//每行开头…

Request 爬虫的 SSL 连接问题深度解析

SSL 连接简介 SSL&#xff08;Secure Sockets Layer&#xff09;是一种用于确保网络通信安全性的加密协议&#xff0c;广泛应用于互联网上的数据传输。在数据爬取过程中&#xff0c;爬虫需要与使用 HTTPS 协议的网站进行通信&#xff0c;这就牵涉到了 SSL 连接。本文将深入研究…

【追求卓越03】数据结构--链表练习题

引导 链表是我们工作和面试的中常常会遇到的知识点&#xff0c;只有长时间的练习和思考才能游刃有余。故总结以下几个比较经典的链表题和对应的代码&#xff0c;进行参考。 链表的反转 思路&#xff1a; 将链表遍历&#xff0c;将每个节点拷贝一份&#xff0c;之后再将所有的…

向日葵x华测导航:远程控制如何助力导航测绘设备运维

导航测绘在各个领域均在发挥积极作用&#xff0c;其中RTK载波相位差分技术是导航测绘领域所常用的主流技术&#xff0c;该技术基于卫星定位系统的基础定位数据&#xff0c;可以实现在野外实时获取厘米级精度的定位数据&#xff0c;一定程度上省去了事后解算的麻烦。相应的&…

XSLVGL2.0 User Manual 外设管理器(v2.0)

XSLVGL2.0 开发手册 XSLVGL2.0 User Manual 外设管理器 1、概述2、特性3、APIs3.1、xs_peripherals_listen3.2 xs_peripherals_unlisten3.3、xs_peripherals_register_prepost3.4 xs_peripherals_unregister_prepost3.5 xs_peripherals_access3.6、xs_peripherals_set_valid_t…

(论文阅读46-50)图像描述2

46.文献阅读笔记 简介 题目 Learning a Recurrent Visual Representation for Image Caption Generation 作者 Xinlei Chen, C. Lawrence Zitnick, arXiv:1411.5654. 原文链接 http://www.cs.cmu.edu/~xinleic/papers/cvpr15_rnn.pdf 关键词 2014年rnn图像特征和文本特…

验证码 | 可视化一键管控各场景下的风险数据

目录 查看今日验证数据 查看未来趋势数据 验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身…