全文共2050字,阅读全文大约需要3.2分钟。
前言
前面说过,守望者记得
具有挑战性的算法和编程
设立明星公众号或贴顶公众号!
数组的结构实在是无话可说,但是今天看了极客时间的一篇专栏,感觉自己对数组的了解还不够。我写了一篇总结,正好是之前推荐这门课程的时候,我在这里讨论了内容
第一个问题是数组是从0开始编号的,但是我们有没有想过为什么是从0而不是1开始呢? 我们都从1开始数。好吧,那我们带着这个问题继续往下看。 问题在最后得到解答。
文本
1、如何实现随机访问?
数组(Array)是一种线性表数据结构。 它使用一组连续的内存空间来存储一组相同类型的数据。
1.线性表:线性表是一种数据像线一样排列的结构。 每个线性表上的数据最多有前后两个方向。
(常见的线性表结构:数组、链表、队列、栈等)
非线性表:二叉树、堆、图等。
2.连续的内存空间和相同类型的数据。
特点:“随机访问”。 但它使得数组上的许多操作效率非常低。 例如,如果要删除或插入数组中的一条数据,为了保证连续性,需要做大量的数据移动。
(数组支持随机访问,基于下标的随机访问时间复杂度为O(1)。)
2.“插入”和“删除”效率低下
1、在数组末尾插入元素,不移动数据,最佳时间复杂度为O(1)。
在数组开头插入元素时,所有数据都需要依次向后移动一位,最差时间复杂度为O(n)。
每个位置插入元素的概率相同,平均时间复杂度为(1+2+...n)/n=O(n)。
2.删除数组末尾的数据,最好情况时间复杂度为O(1)。
从一开始就删除数据,最坏情况时间复杂度是O(n)。
平均情况时间复杂度也是 O(n)。
(很多时候我们并不是想死记硬背某个数据结构或者算法,而是要学习其背后的思维和处理技巧,这些东西才是最有价值的。)
3.警惕数组访问越界
给你举个例子看看下面程序的输出结构是什么
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”,而是无限循环“hello world”! 这是什么原因呢?
主要原因是我们的代码有错误。 我们定义的数组大小是3,数组是arr[0],arr[1],arr[2],这三种类型的循环我们是i