数据结构与算法(二)数组

前言:本文是用来记录自己学习数据结构与算法的笔记,写的不对的地方欢迎指正。

数组定义

数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

线性表:就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
非线性表:比如二叉树、堆、图等。

数组的删除和插入

假设有一个数组,它的长度是n。我们现在要将一个数据插入到数组的第x个位置。那么为了将第x个位置空出来,这个数组需要将x~n这部分的数据全部向后移动一个位置。删除同理。

数组越界

在C语言中如果数组越界,根据寻址公式会定位到一块不属于数组的内存地址上,数组越界在C语言中是一种未决行为,编译器是不会报任何错误的。这就会造成程序出现莫名其妙的bug。
在iOS中如果发生数组越界情况编译器会为我们抛出异常。

数组容器

在高级语言中会有很多数组容器,比如OC的可变数组和不可变数组。那么他们都有什么特点呢。

C数组:
  • 可以存储int等基础类型
  • 不支持动态扩容
NSArray:
  • 不能存储基础类型
  • 不支持动态扩容
NSMutableArray:
  • 不能存储基础类型
  • 支持动态扩容
  • 但是动态扩容是需要消耗性能的,所以尽量初始化数组的时候指定数组长度。

寻址公式

假设有一个长度为n的数组,里面的数据类型为int,首个元素的内存地址是1000,那么求第k个元素的内存地址:
address_k = first_address + k * data_size = 1000 + k * 4;

为什么数组从0开始计数

1,因为第一个人就是这么干的。
2,使用寻址公式计算下标和偏移的时候方便。

你可能感兴趣的:(数据结构与算法(二)数组)