数组
数组不用多解释了,都了解,这里再重复一些重要的。
随机这个词经常出现,在刚学的时候,都说数组在内存中是随机访问的,然而随机数又是随机(不确定)的,这两个概念总是搞不清楚。这里的随机访问与随机存储器的概念一样,google了也百度了,就是搞不到这个随机是什么意思,就只能按random本意来理解了,只好意会。
大家都知道数组在内存中存放的方式,是顺序的,也就是在访问某个元素的时候,比如访问第五个元素[5],只需要在开头地址加上偏移量,即5,就是第五个元素了。因为数组中存储的数据类型都是同一种的类型,它们在内存中的大小都是固定的,所以偏移量很好算。
多维数组,很多人和我一样,到这里都会迷茫一下,二维数组不难想象,就像一张表,如果三维的话,就想象成一个魔方,是立方体,如果三维以上,就难了,不能根据这种思维定式去想象它的结构,了解它在内存中的方式就行了。
看几个例子:
int[4]
|
内存
|
地址
|
intArray[0]
|
|
bffff4f0
|
|
|
bffff4f1
|
bffff4f2
|
bffff4f3
|
intArray[1]
|
|
bffff4f4
|
|
|
bffff4f5
|
bffff4f6
|
bffff4f7
|
intArray[2]
|
|
bffff4f8
|
|
|
bffff4f9
|
bffff4fa
|
bffff4fb
|
intArray[3]
|
|
bffff4fc
|
|
|
bffff4fd
|
bffff4fe
|
bffff4ff
|
|
int[2][2]
|
内存
|
地址
|
intArray[0][0]
|
|
bffff4f0
|
|
|
bffff4f1
|
bffff4f2
|
bffff4f3
|
intArray[0][1]
|
|
bffff4f4
|
|
|
bffff4f5
|
bffff4f6
|
bffff4f7
|
intArray[1][0]
|
|
bffff4f8
|
|
|
bffff4f9
|
bffff4fa
|
bffff4fb
|
intArray[1][1]
|
|
bffff4fc
|
|
|
bffff4fd
|
bffff4fe
|
bffff4ff
|
|
上面是两个一维整数数组和二维整数数组。从图中可以看出每次读取某个元素时只要加上某个偏移量就行了,偏移量就是就是这个元素类型所占的内存空间大小,上面是整形数组,一个整形占4个字节。
可以看到,无论是多少维(稚)的数组,在内存中都是线性的连续存储,它是按行优先顺序放在内存中的,即,如果有从n00开始,其次是n01...然后是n10,n11.........以此类推,三维的数组就是n000,n001.......n010,n011一直到n100.......。有些例外情况,比如fortran语言中,它是按列优先顺序存放的,顺序是n10,n20,n30.....n11,n21......n12,n22 这样的,以此类推,不管多少维,都是这样算的。
数组的优点就是访问速度快,缺点是在声明时就已经确定数组的大小,不能再扩充了。
向量(vector容器)
vector大家都经常使用,其实向量是一个动态数组,所谓动态就是数组在声明后还可以增长,也可以插入元素,动态数组在增长的时候,其实也就是先分配好内存,然后new 一个数组,一个个将原数组再拷贝进去。向量使用完后再delete分配的内存。
向量的优点和数组一样,缺点就是增长过快的时候比较耗资源。
表(list)
一个简单的单向链表:
链表的每个元素称为节点,每个结点都有两个单元,第一个就是数据项,存放数据,第二个称为链(或next链),它指向第二个元素的地址,以此类推,最后的一个元素指向NULL。
这种单项列表,如果给表头或表尾添加元素的时候会有些不便,最好的办法就是加上表头和表尾了。
一个带表头和表尾的单向链表:
表头的数据元素是这个表的名字,例如上面那个表名是head,表头的链指向第一个节点,最后一个节点则指向尾节点。
给表添加一个元素的时,以上边的head表为例,在A和B中间插入一个节点Y,则首先把A节点的链指向Y,然后将Y的链指向B。如果是删除一个结点的话,假设删除D节点,则只要将C节点链指向D节点的下一个节点,即E节点。是不是很简单,但问题又来了,每次插入或删除一个结点的时候,尤其是删除最后一个结点的时候,都得寻找它前面的节点,这就比较麻烦了,而双向链表则解决了这种问题。
双向链表:
可以看出,每个都在数据区前面都多了一个指向它前面节点的指针。我们把一个节点的后一个节点叫做直接后驱,它前面的一个结点叫做直接前驱。第一个节点没有直接前驱,所以为NULL,末尾节点没有直接后驱,也为NULL,这样在插入或删除一个节点的时候的就可以直接找到它的前后两个节点了。
有时候为了方便查询,会让最后一个节点的后驱的next链指向第一个节点,这样的链表就叫做循环链表。
当然,表不止有链表,还有别的,以后会学习到的。
链表的优点就是可以不受内存单元的线性限制(比如数组),可以充分利用空间,缺点就是链表的存储密度不如数组或向量的高,密度当然是质量除以体积了,这里质量就是实际数据的大小,体积就是链表的大小,因为每个节点要额外存储链,所以链表的存储密度就相对小了 ,另外在链表很长时,操作一个节点就比较麻烦了,因为它在内存中不是连续的,所以得从头开始一个个找,效率就低了。
大致算是解了数组、向量和链表,可以根据它们的特点再不同场合使用。
- s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...
<数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...
- 数据结构和算法分析:第三章 表、队列和栈
3.1 抽象数据类型 抽象数据类型 是带有一组操作的一些对象的集合.对于集合ADT可以有像添加add.删除remove.包含contain这样的一些操作 3.2 表ADT 3.2.1 表简单的数组实现 ...
- 数据结构与算法分析(C++版)(第二版)
查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...
- Java数据结构与算法解析(一)——表
本节我们讨论常见常用的数据结构--表. 如果要通俗简单的说什么是表,那我们可以这样说:按顺序排好的元素集合就是表. 表的概述 抽象数据类型是带有一组操作的一些对象的结合 1.定义: 线性表是一个线性结 ...
- java数据结构与算法之顺序表与链表深入分析
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...
- 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...
数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...
- js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)
本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...
- 二叉堆(最小堆)(数据结构与算法分析的代码实现)
"堆是一棵被完全填满的二叉树,可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树" "因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链&qu ...
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...