CPU L1缓存读写速度高出内存100倍左右, 缓存在加载地址的时候,基于Locality of reference也会加载相邻的地址内容。(如果一个地址被访问,那么它相邻的地址也极有可能之后被访问)

数组

-----------------  | 1 | 2 | 3 | 4 |-----------------

数组使用连续的内存来存储同类型的数据, 需要指定大小, 由于数组内各个元素类型一致, 很容易计算每个元素的偏移量。

数组的一个最大特点是支持随机访问/下标访问, 缓存友好型数据结构, 访问速度很快。

动态数组

-----------------| 1 | 2 | 3 | 4 | 添加5  -----------------   |   |   |   |   |                    v   v   v   v   v ---------------------------------| 1 | 2 | 3 | 4 | 5 |   |   |   |  开辟新空间---------------------------------

为了克服数组的固定大小的缺点,好多语言提供动态数组,可以根据指定或实际情况动态扩容。例如C++中的vector, Java中的ArrayList

扩容的时候需要开辟新的空间,然后把旧的数组拷贝到新的数组中。扩容可以采用倍增的策略。

扩容比较耗费资源,计算机采用均摊复杂度(Amortized Analysis)来衡量其时间复杂度, 记作O*(N)

二维数组

A = [    [11, 12, 13, 14],    [21, 22, 23, 24],    [31, 32, 33, 34],    [41, 42, 43, 44],  ]

第N行第M列 = A[N-1][M-1]

子数组的和

# 前0个数的和PrefixSum[0] = 0# 前i个数的和PrefixSum[i] = A[0] + A[1] + ... A[i - 1]# 则有Sum(i~j) = PrefixSum[j + 1] - PrefixSum[i]

规避数组缺点

数组最大的缺点是保持连续空间,删除或者插入比较靠前的位置,那么后边的都要做相应的移动。

1.合并两个排序数组,比如[3, 4]合并到[1, 2, 5, null, null]。可以从大到小合并, 避免数组移动2.删除某个值,可以将目标位置和结尾对调,在进行删除

恢复旋转排序数组

[10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9]|---------------左边-------------||-------右边------|

1.先翻转左边2.再翻转右边3.最后翻转全部

字符串

--------------------------     |'H'|'E'|'L'|'L'|'O'|'\0'|--------------------------

字符串可以看成特殊的unicode字符数组, 以特殊字符'\0'结尾。

可变性

Java中的String是Immutable的, 拼接两个字符串实际先分配足够的空间,然后依次拷贝。如果有大量字符拼接可以使用StringBuilder。

如果使String可修改,可以使用toCharArray方法

String s = "Hello World";char[] str = s.toCharArray();

链表

     p1        p2                栈空间     |         |     v         v-------------------------------------   node1  ->  node2              堆空间-------------------------------------

链表也是线性数据结构(也可以看作特殊的树/图)。链表是离散型数据结构,以节点为单位,分散在内存的不同位置。

链表的优点是不需要连续空间,缺点便是无法随机访问/下标访问, 只能顺序查找。

所以, 同样是线性结构, 链表要慢许多, 首先访问链表无法有效命中CPU缓存, 其次node->next需要有寻址操作

单链表

--------   --------   --------   ---------| 1 | x--->| 2 | x--->| 3 | x--->| 4 | x--> Null--------   --------   --------   ---------

链表一般考察的是编程的基本功,没有什么相应的算法,只是把操作用代码来实现

双向链表

---------   -----------    -----------    -----------|   | x------> |   | x------> |   | x------> |   | x------> Null| 1 | ---------   -----------    -----------    -----------

双端队列(Deque)算是阉割版本的双向链表,只能从两头添加删除

经典缓存LRU使用的便是双链表+哈希,如果有新访问的便将数据节点放在链表头部

哨兵头节点

对于链表来说,头节点最特殊,没有前继节点。通常需要特殊处理。

如果给链表头加一个哨兵头节点,那么就消除了特殊Case的情况,生活变得简单不少。

1 -> 2 -> 3 -> 4 -> Null^headsentry -> 1 -> 2 -> 3 -> 4 -> Nullhead = sentry.next

双指针

双指针是线性数据结构经常使用的编程技巧, 比如反转链表

同向双指针

1.按条件左右分割数组(左边奇数右边偶数,左边小于k右边大于k, 左边满足条件右边不满足等)2.寻找两条链表相交的节点3.O(1)空间拷贝链表

相向双指针

1.判断数组回文串2.反转数组

快慢双指针

1.比如链表是否有环,如果快指针追赶上慢指针,便是有环2.移除链表倒数第K个节点3.获取链表的中间节点,判断链表是否回文串

Linked-list劈成两半,记得将中间节点node->next = null

--End--

java 数组合并_数组与链表相关推荐

  1. java集合合并_【Java必修课】各种集合类的合并(数组、List、Set、Map)

    1 介绍 集合类可谓是学习必知.编程必用.面试必会的,而且集合的操作十分重要:本文主要讲解如何合并集合类,如合并两个数组,合并两个List等.通过例子讲解几种不同的方法,有JDK原生的方法,还有使用第 ...

  2. java 数组合并_拼接_详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式 发布于 2020-7-27| 复制链接 摘记: 最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下.1.Syst ...

  3. android byte数组合并,byte数组 合并 与 截取(java)

    合并数组java /** * 合并byte[]数组 (不改变原数组) * @param byte_1 * @param byte_2 * @return 合并后的数组 */ public byte[] ...

  4. java 广义表_数组和广义表

    数组和广义表 一.数组 1.定义 数组是数据结构的基本结构形式,它是一种顺序式的结构. 数组是存储同一类型数据的数据结构,使用数组时需要定义数组的大小和存储数据的数据类型. 2.分类 数组分为一维数组 ...

  5. Java学习笔记_数组

    数组的概念 是一种容器,可以同时存放多个数据值 数组的特点 数组是一种引用数据类型 数组当中的多个数据,类型必须统一 数组的长度在程序运行期间不可改变 数组的初始化 在内存当中创建一个数组,并且向其中 ...

  6. java默认数组值_数组元素默认的初始值都是什么

    在Java中,使用数组时,如果为数组分配了内存空间,但是没有为数组元素指定初始值,系统会自动为数组元素指定初始值.数组元素的初始值与数组的数据类型有关,对于不同数据类型的数组,其数组元素的初始值是不一 ...

  7. es6 数组合并_那些会用到的 ES6 精粹(包邮送书)

    前言 最新的 ECMAScript 都已经到发布到 2019 版了. 我们应该有的态度是:Stay hungry ! Stay young ! 从接触 vue 到工作中用到 vue 将近 2 年了,在 ...

  8. c语言讲两个数组合并_两列数据相互去掉重复值后合并

    大家好,今日继续讲VBA数组与字典解决方案的第27讲,内容是两列数据中相互去掉重复值之后将数据合并.这讲的内容利用到动态数组,固定数组,数组的合并,数组的转置等等. 还是先看实例,下面的工作表中A列和 ...

  9. php多维数组合并_两种PHP二维数组合并的方式

    本文主要和大家分享第一种合并方式:通过PHP的数组API给出的array_merge方法来合并一个数组 ,希望能帮助到大家. 代码:$a = array(array("1",&qu ...

最新文章

  1. python相关函数_python常用函数精讲
  2. 你觉得 ThreadLocalRandom 这玩意真的安全吗?
  3. Redis持久化的几种方式——RDB深入解析
  4. linux date 天之前,linux date命令前后几天的推导
  5. C语言三个数排序,普通方法及进阶(不引入第三变量交换数值法)
  6. 微软开源了一个用TF实现的GNN例程库
  7. 在机器学习中为什么要进行 One-Hot 编码?
  8. 以太坊全网算力较去年8月已上升126%
  9. mysql连接被拒绝 密码也对_解决Mysql数据库拒绝远程连接和忘记密码的问题
  10. sass-loader高版本的坑
  11. [数据库】sql 查询语句 汇总
  12. QQ用户文件夹下即(user文件夹) 各个文件都是干什么的
  13. 太极发送卡片软件_xml卡片消息制作软件下载-qq xml卡片消息生成器最新版0.8.10.209 免费版-东坡下载...
  14. mac 重置mysql root密码_Mac下忘记Mysql root密码重置
  15. 支持webrtc的摄像头
  16. 【机器视觉】Halcon 18安装教程
  17. Hibit Uninstall 批量的软件卸载,强制卸载
  18. linux系统安装达梦数据库
  19. Android斗地主游戏源码
  20. 冲量在线当选中关村数字经济产业联盟理事单位

热门文章

  1. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
  2. android 手机 跑分榜,安兔兔跑分最新排行图 2020年4月Android手机性能榜
  3. Java项目架构演进和SpringCloud总结
  4. 联想小新pro无法人脸识别自动开机的解决方法
  5. CNN图像分类Keras代码转换pytorch思路与实现
  6. Ubuntu18.04配置TeXLive2020+TeXstudio
  7. WORD填空题设置下划线?
  8. PID控制的输入量与输出量的关系
  9. c语言定义字符数组数码管,数组数码管
  10. 4095: 韩信点兵