【数据结构&算法】05-线性表之数组
前言
本笔记主要记录数组的一些基础特性及操作。
顺便解答下为什么大部分编程语言的的数组是从 0 开始的。
李柱明博客:https://www.cnblogs.com/lizhuming/p/15487306.html
线性结构与非线性结构
线性结构:
- 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。
- 包括:数组、链表、队列和栈等。
非线性结构:
- 在非线性表,数据之间不是简单的前后关系,通过下图对比线性结构和非线性结构
- 包括:树、图等。
参考图:


数组
数组的两个限制
数组有两个限制:
- 数组为线性结构。
- 是连续的内存空间和相同类型的数据。
数组的随机访问特性
基于以上两个限制,使得数组具有随机访问的特性。
小笔记:
计算机通过地址来访问内存中的数据。
寻址通过以下公式寻址:
a[i]_address = base_address + i * data_type_size;
而随机访问是只要知道数组对应的下标,我们就可以直接通过寻址公式知道该数据,不需要查找什么的。使得时间复杂度为 O(1)。
小笔记:
数组和链表的区别:
- 数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。
- 链表适合增删,时间复杂度为 O(1)。
数组的操作
数组的操作主要是增删。
插入操作
插入数据,若不是尾部且不能留空,则需要搬移部分数据。
分析:
若插入尾部,则不需要搬移数据,插入操作的时间复杂度为 O(1)。
若插入第 k 个位置中。其插入操作的时间复杂度为 O(n)。
- 特定情况下,可以把原有第 k 个位置中的数据挪到最后。这样其插入操作的时间复杂度为 O(1)。
删除操作
删除数据,若不是尾部且不能留空,则需要搬移部分数据。
分析:
若删除尾部,则不需要搬移数据,删除操作的时间复杂度为 O(1)。
若删除第 k 个位置中。其删除操作的时间复杂度为 O(n)。
- 特定情况下,若删除的位前面几个,则可以直接修改数组的起始位置即可。
数组越界
小笔记:一个由 C/C++ 编译的程序占用的内存分为以下几个部分:
堆区(stack):
- 生长开口方向向上。(底为低地址、小端)
- 一般由程序员分配释放, 若程序员不释放,程序结束时可能
由 OS 回收 。
栈区(heap):
- 生长开口方向向下。(底为低地址、小端)
- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值
等。其操作方式类似于数据结构中的栈。
全局区(静态区)(static):
- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束后有系统释放
文字常量区:
- 常量字符串就是放在这里的。
- 程序结束后由系统释放。
程序代码区:
- 存放函数体的二进制代码。
参考代码:
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\n 。就是因为内存溢出。
- 整型变量 i 和整型数组 arr[3] 存储在栈空间中。
- arr[3] 的存储位置就是 i 的存储位置。
- for 循环的合法循环 i 最大为 3,刚好在 i=3 的那次循环把 i 重置为 0 了。
这种数组越界的错误容易导致逻辑混乱。程序跑飞。
容器
针对数组类型,很多语言都提供了容器类,比如 Java 中的 ArrayList、C++ STL 中的 vector。
容器把很多数组操作的细节封装起来,如插入、删除等,且支持扩容。
数组下标
为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始呢?
- 寻址效率原因。
- 历史原因。
寻址:
正常寻址:
a[k]_address = base_address + k * type_size;
若数组下标起始为 1 的寻址:
a[k]_address = base_address + (k-1)*type_size;
每次寻址多了一个减法指令。
历史:
- C 语言设计者用 0 开始计数数组下标,之后的 Java、JavaScript 等高级语言都效仿了 C 语言。
小笔记:
- python 支持负下标。
【数据结构&算法】05-线性表之数组的更多相关文章
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)
[数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...
- 数据结构C++版-线性表
PS:资料来源慕课网视频. 一.什么是线性表 线性表是n个数据元素的有限序列. 分类: 二.补充知识点 1.栈和队列有出操作.入操作,对应线性表(数组)为插入元素和删除元素,而线性表中要获取指定元素值 ...
- 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中
//数据结构与算法基础题1:线性表操作,实现A并B,结果放入A中 #include "stdafx.h" #include <iostream> #include &l ...
- Java数据结构与算法(1):线性表
线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表 ...
- 【C#数据结构系列】线性表
一:线性表 1.1:定义:零个或多个数据元素的有限序列 1.2: 线性表元素个数n定义为线性表的长度,n = 0称为空表,i 为数据元素ai在线性表中的位序. 1.3:满足线性表的条件:(1):有序, ...
- C++ 数据结构 1:线性表
1 数据结构 1.1 数据结构中基本概念 数据:程序的操作对象,用于描述客观事物. 数据的特点: 可以输入到计算机 可以被计算机程序处理 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型. ...
- C语言数据结构——第二章 线性表
二.线性表 2.1-线性表简介 2.1.1-线性表的定义 线性表是由若干个相同特性的数据元素组成的有限序列.若该线性表不包含任何元素,则称为空表,此时长度为0,当线性表不为空时,表中的元素的个数就是线 ...
- JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
随机推荐
- DS博客作业04--图
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...
- Oracle Haip无法启动问题学习
一.目标:Oracle Haip 启动报错 需求:日常运维过程中,已经遇到两次由于HAIP引发的问题,特此进行记录. 本次问题是看着大佬-李海清操作,整完了记录一下,上一次HAIP折腾了4个小时. O ...
- Windows Server 2008 系统加固
账号安全:更改管理员账号 更改管理员账户名来避免攻击,提高系统安全性. 以Administrator账户登录本地计算机,开始->运行->compmgmt.msc(计算机管理)->本地 ...
- Docker 配置国内镜像加速器
Docker 默认是从官方镜像地址 Docker Hub 下下载镜像,由于服务器在国外的缘故,导致经常下载速度非常慢.为了提升镜像的下载速度,我们可以手动配置国内镜像加速器,让下载速度飚起来. 国内的 ...
- 配置阿里云maven
在安装好Maven之后,默认的~/.m2目录下是没有maven仓库配置文件settings.xml的,默认使用的是官方的仓库,访问速度会非常慢,我们需要配置下国内的仓库. 创建~/.m2/settin ...
- Python-对Pcap文件进行处理,获取指定TCP流
通过对TCP/IP协议的学习,本人写了一个可以实现对PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鉴于为了学习,没有采用第三方包解析pcap,而是对bytes流进行解析,其核心思想 ...
- Kettle学习笔记(二)— 基本操作
目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 打开Kettle 打开 ...
- WPF实现统计图(饼图仿LiveCharts)
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 每日一笑 下班和实习生一起回家,公交站等车,一乞丐把碗推向实习生乞讨.这时,实习生不慌不忙的说了句:&qu ...
- 用OpenCV显示视频时遇到问题
刚刚接触OpenCV,运行了书上的例程,程序编译没有问题,在视频显示快要结束时遇到了下面的问题,代码在后面 #include "stdafx.h"#include <open ...
- Serverless 解惑——函数计算如何安装字体
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...